Python
nginx
uwsgi

NginxとuWSGIでHelloWorld

Nginx上でuWSGIを動かしてHelloWorldするのに苦労したのでメモしておきます。

各種インストールは終わっているものとします。

環境は以下です。


  • CentOS7

  • Nginx

  • uWSGI 2.0.17.1


目次

ではいきましょう!


とりあえずhttpでuWSGIを動かす

uWSGIに直接httpで接続できるようにします。

まずは表示用のpythonファイルをつくります。

ディレクトリは何でもいいですが、とりあえず/var/www/uwsgi/にindex.pyを置くようにしました。


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側の設定ファイルをいじります。


/etc/nginx/conf.d/default.conf

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.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ファイルをつくりましょう。


/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