LoginSignup
0
2

RaspberryPi上でFlask+uWSGI+NGINXを繋げる方法

Last updated at Posted at 2020-07-30

いろんなサイトを参考にしているが、どれも自分の環境で動いているサイトがないため、試行錯誤しながら、やっと繋げることができたので、記録として残す。

やっとこと。

  1. uwsgi.iniファイルの設定
  2. uwsgi Unitサービスの設定(ここで苦労
  3. 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ファイルの設定

  1. 「/etc/nginx/conf.d/<任意>.conf」の内容は以下に示す
  2. /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
0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2