【uWSGI】Flask+uWSGI+Nginx+Reactでアプリを自動動作できるようにする

前書き

デプロイに向けて前回まで開発してきたアプリの起動をさらに効率化させようと思います。
melheaven.hatenadiary.jp

正直Nginxに関してはイマイチよく分かってないのですが・・・。
次の製作物を開発している頃にはサーバーサイドの勉強をしたい。

Nginx

NginxはオープンソースのWebサーバーであり、他にもリバースプロキシやHTTPキャッシュ、負荷分散(ロードバランサー)等にも使用されています。とりあえずLocalhostのポート番号3000番にアクセスしてきたクライアントに対し、index.htmlを渡す処理をしてくれます。

/etc/nginx/nginx.conf

私の環境の場合、nginx.confは"/etc/nginx/nginx.conf"に配置します。以下はnginx設定ファイルでもあるnginx.confです。

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;

    keepalive_timeout  75;

    server {
    listen       3000;
    server_name  localhost;

    location / {
        root   /var/www/clients/;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    }
}

今回は/apiにアクセスしてきた場合、Pythonファイルを動作させるという処理も書きたい訳です。その場合、Nginxを通してuWSGIに接続させる必要があります。

uWSGI

uWSGIとはWebサーバー上でPythonアプリケーションを動作させるアプリケーションサーバーの役割を果たします。

uwsgi.ini

uWSGI関連の設定ファイルは以下のuwsgi.iniに記述します。オプションが複数あるので、設定ファイルをお好みのカスタマイズになります。
今回はNginxとuWSGIの通信にhttp=:5000を指定しておりますが、ポート番号が多くなる場合に良しとはされず、socker=socketファイルを指定することがベターとされています。wsgi-fileにて実行したいpythonファイルを指定でき、chdirにてモジュールファイルを含めたプロジェクトフォルダ全体も設定しています。

[uwsgi]
; uid = nginx
; pid = nginx
module = main
callable = app
master = true
http = :5000
chmod-socket = 666
chdir = /var/www/server
wsgi-file = /var/www/server/main.py
py-autoreload = 0

/etc/nginx/nginx.conf

nginx.conf側です。Nginx設定ファイルでもlocalhost/api:5000にアクセスされた際に、uWSGIが動作するように

・・省略

upstream uwsgi {
        server 0.0.0.0:5000;
    }

・・省略

server {

     ・・省略

    location /api {
        #uwsgi_pass
        uwsgi_pass uwsgi;
    }
}

uwsgi-docs.readthedocs.io