Nginx上でuWSGIを動かしてHelloWorldするのに苦労したのでメモしておきます。
各種インストールは終わっているものとします。
環境は以下です。
- CentOS7
- Nginx
- uWSGI 2.0.17.1
目次
ではいきましょう!
とりあえずhttpでuWSGIを動かす
uWSGIに直接httpで接続できるようにします。
まずは表示用のpythonファイルをつくります。
ディレクトリは何でもいいですが、とりあえず/var/www/uwsgi/にindex.pyを置くようにしました。
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
では早速、以下のコマンドでつないでみます。
uwsgi --http 127.0.0.1:3031 --wsgi-file /var/www/uwsgi/index.py
ブラウザでlocalhost:3031にアクセスすると、'HelloWorld'が出力されるのを確認できます。
uwsgiを停止して抜けるにはctrl+cを使います。
なお、上述のコマンドだとuwsgiの起動中はコマンドを叩けなくなってしまいます。
uwsgi --http 127.0.0.1:3031 --wsgi-file /var/www/uwsgi/index.py &
として、最後尾に'&'をつけることで、ctrl+cで抜けた後もプロセスを実行し続けることができます。
この場合、プロセスを停止するには
killall -9 uwsgi
として、強制終了してしまいます。
また、実行時にpidファイルを設定している場合は、これを指定して停止させることができます。
uwsgi --stop [好きなディレクトリ]/uwsgi.pid
NginxからuWSGIにsocketでつなぐ
とりあえずuWSGIに直接httpでつなぎましたが、実際はNginxを通してuWSGIに接続するような形になります。
今回は/var/www//uwsgi/に80番ポートでアクセスしたときにuWSGIに接続するような設定にしましょう。
まずはNginx側の設定ファイルをいじります。
server {
listen 80;
server_name hoge;
location / {
root /var/www;
index index.html index.htm;
}
#--------------------------------------------
#ここを追記
location /uwsgi {
include uwsgi_params;
uwsgi_pass unix:///[好きなディレクトリ]/uwsgi.sock;
}
#--------------------------------------------
}
uwsgi.sockはソケットファイルです。勝手に作られるので特に用意しておく必要はありません。
uWSGIをiniファイルで起動できるようにする
uWSGIをiniファイルを使って起動できるようにします。
uwsgi.iniを好きなディレクトリにつくりましょう。
[uwsgi]
module = index
master = true
socket = [好きなディレクトリ]/uwsgi.sock
chmod-socket = 666
wsgi-file = /var/www/uwsgi/index.py
pidfile = [好きなディレクトリ]/uwsgi.pid
logto = [好きなディレクトリ]/uwsgi.log
uwsgi.sockのディレクトリはNginx側の設定と合わせるようにします。
ここまで設定すると、80番ポートからNginxを通してuwsgiにアクセスできるようになります。
systemctl restart nginx
uwsgi --ini [好きなディレクトリ]/uwsgi.ini
ブラウザでlocalhost/uwsgiにアクセスすると、index.pyが動いて'HelloWorld'が出力されるのを確認できます。
今回はpidファイルを指定して起動しているので、終了には以下のコマンドが使えます。
uwsgi --stop [好きなディレクトリ]/uwsgi.pid
uWSGIをsystemctlで起動できるようにする
以上でHelloWorldまではできましたが、ついでにsystemctlに登録して自動起動もできるようにしてしまいます。
systemctlに登録するために、/etc/systemd/system/内にuwsgi.serviceファイルをつくりましょう。
[Unit]
Description = uWSGI
After = syslog.target
[Service]
ExecStart = /usr/bin/uwsgi --ini [好きなディレクトリ]/uwsgi.ini
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
[Install]
WantedBy=multi-user.target
これでsystemctlが使えるようになっているはずなので確認しましょう。
systemctl status uwsgi
ついでに自動起動の設定もしておきます。
systemctl enable uwsgi