DockerでflaskとuWSGIを別コンテナのNginxと連携してみた
DockerでflaskとuWSGIを別コンテナのNginxと連携してみた
こんばんは、葛の葉です。
さて、よくNginx
とuWSGI
を使ってWebサーバー
の構築をしている記事は見かけますが、
同じコンテナ内でNginx
とuWSGI
をインストールしているケースが多く、
Nginx
とuWSGI
と別コンテナで構築しているケースがあまり無いのかな、と思いました。
DockerCompose
を使った場合になるのですが、簡単に書いていきたいと思います。
なお、もっといいケースなんてたくさんあると思うので、むしろ教えて頂ければと思います。
まず、docker-compose.yml
が必要で、更にIPアドレスを固定化するか、コンテナネームを固定化したほうがよいです。
それは記事にしましたので、下に載せます。
コンテナネームの固定化について
コンテナのIPアドレスの固定化について
flaskのあるコンテナでの設定
uWSGI
が必要なため、flask
のあるコンテナでpipでインストールします。
pip install uwsgi
また、設定ファイルが必要なので、uwsgi.ini
というデータを作り、以下のように記載します。
[uwsgi] http = :3031 #ここはuwsgiのポート番号 chdir = /var/www/ #下記、flaskで実行したいプログラムのあるディレクトリ wsgi-file = page.py #flaskのプログラム callable = app #flaskを実行するためにここは不変更
そして、コマンドでuwsgi --ini uwsgi.ini(先程のuwsgi.ini)
として、実行すればよいです。
これをdocker-composeでのcommand
で設定すれば、コンテナが起動するときに指定したコマンドが実行されるはずです。
command: uwsgi --ini uwsgi.ini
とすればよいです。
uwsgi.ini
をホストマシンから持ってくるにはvolumes
で共有すればよいので、
例えばdocker-compose.yml
のあるディレクトリにapp/config
ディレクトリを作り、
そのapp/config
以下に先程のuwsgi.ini
を保存しておき、docker-compose.yml
で以下のように記載して共有します。
また、docker-compose up
時にuwsgi.ini
を起動するようにしておきます。
volumes: - ./flask_app/config/:/var/www/config/ command: uwsgi --ini /var/www/config/uwsgi.ini
とこのようにしておきます。
Nginxのあるコンテナでの設定
Nginxは/etc/nginx/nginx.conf
の設定を変えてあげればうまくいきます。
また、そのnginx.conf
をホストOSで作ってあげて、渡してあげればよい、ということになります。
ホストOSにnginx.conf
を持ってくる方法はとりあえず記載しないとして
(一度、Nginxコンテナ単体で起動して、共有のフォルダにコピーしてホストOSに持ってくる等)
設定ファイルのlocation
部分を以下のようにの設定します。
location / { client_max_body_size 1m; client_body_buffer_size 8k; proxy_pass http://[flaskのあるコンテナネームorコンテナのIPアドレス]:3031; proxy_redirect default; }
これを、例えばdocker-compose.yml
のあるディレクトリにnginx/config
ディレクトリを作り、
そのnginx/config
以下に先程のnginx.conf
を保存しておき、docker-compose.yml
で以下のように記載して共有します。
volumes: - ./nginx/config/nginx.conf:/etc/nginx/nginx.conf
直接、Nginxのnginx.conf
ファイルに共有してあげます。
専用のconf
をつくって、そこに読みに行くような設定もありますが、ちょっとこちらでは記載しません。(Nginxの設定方法の話になるので)
docker-compose upする
この状態でdocker-compose up
すると、nginxで開放したポート番号に接続すれば、flaskのアプリが起動するはずです。