前回の続きで、今回はPythonのアプリケーションサーバ、uWSGIをCentos7で動かしてみましょう。
Linuxの入門知識が不安な方は、以下にまとめていますので適宜ご参照ください。
Linux学習講座 超入門編
概要
Centos上でuwsgiを動かしてみます。利用する環境は以下のとおりです。
- Centos 7
- Python 3.6
- uWSGI(2.0.17.1)
- Flask(1.0.2)
Webアプリケーションは/opt配下に配置します。また、Pythonの仮想環境として、venvを使用します。venvの環境も/opt配下に配置します。
/opt ├── apps │ └── current │ └── sample_api └── envs └── sample_api
学習用としてPythonモジュールを/opt/apps/currentの下にflaskファイル直接配置していますが、実運用ではリリース用ディレクトリからシンボリックリンクを張るのが一般的です。それ以外はほぼそのまま本番で使える内容になっていると思います。
また、pidファイルは/var/run/uwsgi/uwsgi.pid、ログは/var/log/uwsgi/uwsgi.logに配置するものとします。
Python3インストール
Centos7が起動済みであることを前提とします。まずはPython3をインストールします。
sudo yum install -y https://centos7.iuscommunity.org/ius-release.rpm sudo yum install -y python36u python36u-libs python36u-devel python36u-pip
次に、アプリケーション用フォルダの作成と、アプリケーション実行用のユーザーを作成します。
# アプリケーション配置用 sudo mkdir -p /opt/apps/current # venv配置用 sudo mkdir -p /opt/envs # ログ配置用 sudo mkdir -p /var/log/uwsgi # pidファイル配置用 sudo mkdir -p /var/run/uwsgi # 実効ユーザー作成、権限設定 sudo useradd pyuser sudo chown -R pyuser:pyuser /opt/apps/ sudo chown -R pyuser:pyuser /opt/envs/ sudo chown -R pyuser:pyuser /var/log/uwsgi sudo chown -R pyuser:pyuser /var/run/uwsgi
環境設定とflaskWebアプリケーションの配置
次に、環境設定とWebアプリケーションを配置します。まずはvenvで環境を作成し、必要なモジュールをインストールしましょう。
# 実効ユーザーに切り替え sudo su pyuser # 実行用の環境を作成 cd /opt/envs/ python3.6 -m venv sample_api # 環境切り替え source /opt/envs/sample_api/bin/activate # 必要なモジュールをインストールする pip install uWSGI pip install flask
この例では実効ユーザーを設定してvenvを使用していますが、docker等のコンテナで単一アプリケーションを動かす場合はrootでvenvを使わずに直接実行するほうが一般的と思います。
次に、アプリケーションを配置します。run.pyという名前のpythonファイルを配置します。
cd /opt/apps/current mkdir sample_api vi /opt/apps/current/sample_api/run.py
内容は前回使用した、適当なjsonを返すだけのプログラムです。
# run.py from flask import Flask, jsonify app = Flask(__name__) @app.route('/') def api_sample(): """ APIサンプル :return: """ result = {"code": "001", "name": "apple"} return jsonify(ResultSet=result) if __name__ == '__main__': app.run()
ここでvenvの環境が正しく動作しているかを確認するために、pythonコマンドの動作確認を行います。
cd /opt/apps/current/sample_api/ python run.py
http://localhost:8080にアクセスして値が返るかどうかを確認しましょう。
uwsgiの設定
uwsgiの設定を行います。uwsgi.iniを作成します。
vi /opt/apps/current/sample_api/uwsgi.ini
以下の通り記述します。
[uwsgi] # wsgiの設定 current_release = /opt/apps/current/sample_api chdir = %(current_release) wsgi-file=%(current_release)/run.py callable = app master = True # アクセス許可ホスト:ポート http=0.0.0.0:8080 # ログ daemonize = /var/log/uwsgi/uwsgi.log # 実効ユーザー/グループ uid = pyuser gid = pyuser # pidファイル pidfile = /var/run/uwsgi/uwsgi.pid # pidファイルクリア vacuum = true # プロセス数など processes = 2 threads = 2 thunder-lock = true max-requests = 3000 max-requests-delta = 300
今度はuwsgiの動作を確認します。以下のコマンドで外部からアクセスできることを確認してください。
uwsgi --http=0.0.0.0:8080 --wsgi-file=run.py --callable app
uwsgiが問題なく動けばpyuserでの作業は一旦終わりです。ctrl + cでuwsgiを停止した後、exitで一旦抜けてください。
exit
サービス登録
最後にユニット定義ファイルを作成してサービス登録します。以下のコマンドでユニット定義ファイルを新規作成します。
sudo vi /etc/systemd/system/sample.service
記述内容は以下の通りとなります。
[Unit] Description = sample daemon After=network.target [Service] User=pyuser Group=pyuser WorkingDirectory=/opt/apps/current/sample_api Environment="PATH=/opt/envs/sample_api/bin" ExecStart = /opt/envs/sample_api/bin/uwsgi --ini uwsgi.ini ExecStop = /opt/envs/sample_api/bin/uwsgi --stop /var/run/uwsgi/uwsgi.pid Type = forking RemainAfterExit = yes [Install] WantedBy = multi-user.target
systemctlをリロードして完了です。
sudo systemctl daemon-reload
サービスが開始/終了できることを確認してください。
# サービスの開始 sudo systemctl start sample # サービスの終了 sudo systemctl stop sample