いろんなサイトを参考にしているが、どれも自分の環境で動いているサイトがないため、試行錯誤しながら、やっと繋げることができたので、記録として残す。
やっとこと。
- uwsgi.iniファイルの設定
- uwsgi Unitサービスの設定(ここで苦労)
- nginx confファイルの設定(ここでも苦労)
ノウハウとして、以下が必要と感じた。
- socketプロキシサーバーの理解が必要
- 仮想環境の実行パスの理解
1. uwsgi.iniファイルの設定
# uwsgi.ini
[uwsgi]
socket = /tmp/uwsgi.sock
chmod-socket = 666
# wsgiファイル
wsgi-file= <実行するPythonファイルのフルパス>
callable=app
# アクセス許可ホスト:ポート
socket=0.0.0.0:8080
※重要なことはアクセス許可はsocket=127.0.0.1:ポート番号または0.0.0.0:ポート番号にすること。なお、当初はhttp=0.0.0.0:ポート番号を指定していた。nginx側でsocketを設定していたので、これだとプロキシが通らない。
2. uwsgi Unitサービスの設定
サービスの場所:
/etc/systemd/system/uwsgi.service
中身:
[Unit]
Description=uWSGI instance to serve flask
After=network.target
[Service]
User=<user name>
WorkingDirectory= <作業ディレクトリ>
ExecStart= <uwsgi実行モジュールのフルパス> uwsgi.ini
[Install]
WantedBy=multi-user.target
- user nameはpiなどを設定する
- 作業ディレクトリはuwsgi.iniファイルが入っているディレクトリを指定する
- uwsgi実行モジュールのフルパスは、仮想環境(venv)を指定する(指定例:/home/pi/project/venv/bin/uwsgi)
※ここでExecStartのパス指定エラーが出ていて苦労していた。venv環境だとパスがわかりにくいので、pwdでもパス確認できない。.venvなどの仮想環境と言ってもパスは実在するので、直パス指定ができることがわかった。(ユーザ認証が必要)
※uwsgiは仮想環境でしか呼び出せないため、ExecStart=/usr/binだと呼び出せない。
逆に仮想環境ではなく、通常の環境にuwsgiを入れれば、呼び出せると思われる。(試していない)
※仮想環境でない場合でも動くことは確認できた。
uwsgi.serviceをほかのアプリに切り替える場合は、下記のパスを変更すればよい。
ExecStart= uwsgi実行モジュールのフルパス uwsgi.ini
エラーになったため、エラーログを取得するように設定を追加
[Unit]
Description=uWSGI instance to serve flask
After=network.target
[Service]
User=pi
WorkingDirectory=/home/pi/MatplotlibForFlask
ExecStart=/usr/bin/uwsgi /home/pi/MatplotlibForFlask/uwsgi.ini
# 標準出力と標準エラー出力をファイルにリダイレクトする
StandardOutput=file:/home/pi/MatplotlibForFlask/uwsgi_stdout.log
StandardError=file:/home/pi/MatplotlibForFlask/uwsgi_stderr.log
[Install]
WantedBy=multi-user.target
変更後はTerminalで:
systemctl daemon-reload
3. nginx confファイルの設定
- 「/etc/nginx/conf.d/<任意>.conf」の内容は以下に示す
- /etc/nginx/sites-enabled/defaultを無効にする
server {
listen 8081 default_server;
server_name _;
location / {
include uwsgi_params;
uwsgi_pass unix:///tmp/uwsgi.sock;
}
}
※ここで重要なことは二つ、
1つは、listen ポート番号とuWSGIのポート番号を重複しないこと。重複すると正常に動作できない。
2つは、[uwsgi_pass unix:///tmp/uwsgi.sock;]を指定すること
httpでも指定できるようだが、うまくできなかった。
そのほかいのパラメータは特に指定していない。
例えば、プロセス数やメモリなど
以上、いろいろ不足する点があるかもしれないが、今はこの設定で動いているので、良しとする。
後は以下のコマンドでサービスを状態を確認
sudo systemctl status nginx.service
sudo systemctl status nginx.service
正常に動いていればよい。
Nginxログを確認するには、
/etc/nginx/nginx.confを確認し、access logのパスを確認する
通常であれば、
/var/log/nginx/にある
※dotenvが動かない場合
pip uninstall dotenv-python
pip uninstall dotenv
pip install python-dotenv