Flaskで記述されたサーバースクリプトをUbuntu上のnginxやApache2で動かす方法

Flaskで記述されたサーバースクリプトをUbuntu上のnginxやApache2で動かす方法についてまとめます。

# 前提
* サーバースクリプトは既に作成済みであるとします。
* 以下のソフトウェアはインストール済みであるとします。
  * Python
  * pip
  * サーバースクリプト内で使用しているライブラリ
  * nginx (nginxを使う場合)
  * Apache2 (Apache2を使う場合)

# 必要なパッケージのインストール
1. `pip install uwsgi`コマンドを実行し、uWSGIをインストールします。

## Apache2を使う場合
1. `sudo apt install libapache2-mod-proxy-uwsgi`コマンドを実行し、`mod_proxy_uwsgi`をインストールします。

# 設定
1. 以下のようにサーバースクリプトのプロジェクト内に`uwsgi.ini`を作成します。
※`TODO`部の指示通りに書き換えを行ってください。

    ```uwsgi.ini
    [uwsgi]
    ; TODO: 以下を記述し、コメントアウトを解除
    ; module = {サーバースクリプトのファイル名 (拡張子なし)}:{サーバースクリプト内のFlaskオブジェクトの変数名}
    ; socket = /tmp/{ソケット名 (任意)}.sock
    master = true
    processes = 1
    chmod-socket = 666
    vacuum = true
    die-on-term = true
    manage-script-name = true

    ```
1. 以下のように`/etc/systemd/system/{サーバースクリプトのサービス名 (任意)}.service`を作成します。
※`TODO`部の指示通りに書き換えを行ってください。

    ```/etc/systemd/system/{サーバースクリプトのサービス名}.service
    [Unit]
    # TODO: 以下を記述し、コメントアウトを解除
    # Description={概要}
    After=network.target
    
    [Service]
    # TODO: 以下を記述し、コメントアウトを解除
    # User={実行時のユーザー}
    # Group={実行時のグループ}
    # WorkingDirectory={サーバースクリプトが配置されているディレクトリのパス}
    # ExecStart=uwsgi --ini {uwsgi.iniのパス (サーバースクリプトが配置されているディレクトリからの相対パス)}
    
    [Install]
    WantedBy=multi-user.target
    
    ```

## nginxを使う場合
1. 以下のように`/etc/nginx/sites-available/{ドメイン名}`を作成します。
※`TODO`部の指示通りに書き換えを行ってください。

    ```/etc/nginx/sites-available/{ドメイン名}
    server {
        # TODO: 以下を記述し、コメントアウトを解除
        # server_name {ドメイン名};
        listen 80;
        
        # TODO: 以下を記述し、コメントアウトを解除
        # location ~ ^/{サブドメイン名}(/.*)?$ {
            include uwsgi_params;
            # TODO: 以下を記述し、コメントアウトを解除
            # uwsgi_pass unix:/tmp/{ソケット名}.sock;
            uwsgi_param PATH_INFO $1;
        }
    }
    
    ```

1. `sudo ln -s /etc/nginx/sites-available/{ドメイン名} /etc/nginx/sites-enabled/{ドメイン名}`コマンドを実行し、設定を有効化します。

## Apache2を使う場合
1. `sudo a2enmod rewrite`コマンドを実行し、`mod_rewrite`を有効化します。
1. 以下のように`/etc/apache2/sites-available/{ドメイン名}.conf`を作成します。
※`TODO`部の指示通りに書き換えを行ってください。

    ```/etc/apache2/sites-available/{ドメイン名}.conf
    # TODO: 以下を記述し、コメントアウトを解除
    # <VirtualHost {ドメイン名}:80>
    	# TODO: 以下を記述し、コメントアウトを解除
    	# <Location /{サブドメイン名}>
    		RewriteEngine on
    		# TODO: 以下を記述し、コメントアウトを解除
    		# ProxyPass unix:/tmp/{ソケット名}.sock|uwsgi://{URL (任意)}
    		# RewriteRule ^/{サブドメイン名}(/.*)?$ $1
    	</Location>
    	
    	ErrorLog ${APACHE_LOG_DIR}/error.log
    	CustomLog ${APACHE_LOG_DIR}/access.log combined
    </VirtualHost>
    
    ```

1. `sudo a2ensite {ドメイン名}`コマンドを実行し、設定を有効化します。

# 起動
1. `sudo systemctl start {サーバースクリプトのサービス名}`コマンドを実行し、サーバースクリプトを起動します。

## nginxを使う場合
1. `sudo systemctl start nginx`コマンドを実行し、nginxを起動します。

## Apache2を使う場合
1. `sudo systemctl start apache2`コマンドを実行し、Apache2を起動します。

# 参考文献
* [nginx + uwsgi でアプリケーションをサブディレクトリで動かす設定 - Qiita](https://qiita.com/methane/items/e0949a37c112eedf2b74)
* [Flask + uWSGI + Nginx でハローワールドするまで @ さくらのVPS (CentOS 6.6) - Qiita](https://qiita.com/morinokami/items/e0efb2ae2aa04a1b148b)
* [flask を uWSGI と Nginx でデプロイする - Qiita](https://qiita.com/ekzemplaro/items/a570f79de254428a151d)
* [Apache support — uWSGI 2.0 documentation](https://uwsgi-docs.readthedocs.io/en/latest/Apache.html?highlight=SCRIPT_NAME#mod-proxy-uwsgi)
* [core - Apache HTTP サーバ バージョン 2.2](https://httpd.apache.org/docs/2.2/ja/mod/core.html#location)