Kuzunoha-NEのブログ

pythonの勉強中。

DockerでflaskとuWSGIを別コンテナのNginxと連携してみた

DockerでflaskとuWSGIを別コンテナのNginxと連携してみた

こんばんは、葛の葉です。

さて、よくNginxuWSGIを使ってWebサーバーの構築をしている記事は見かけますが、

同じコンテナ内でNginxuWSGIをインストールしているケースが多く、

NginxuWSGIと別コンテナで構築しているケースがあまり無いのかな、と思いました。

DockerComposeを使った場合になるのですが、簡単に書いていきたいと思います。

なお、もっといいケースなんてたくさんあると思うので、むしろ教えて頂ければと思います。


まず、docker-compose.ymlが必要で、更にIPアドレスを固定化するか、コンテナネームを固定化したほうがよいです。

それは記事にしましたので、下に載せます。

コンテナネームの固定化について

kuzunoha-ne.hateblo.jp

コンテナのIPアドレスの固定化について

kuzunoha-ne.hateblo.jp


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のアプリが起動するはずです。