株式会社NoSchoolでCTOをしている@mejilebenです。
今日はdockerでハマったところを書きます。
概要
nginxをDockerで利用しているとき、413 Request Entity Too Largeで怒られてしまう事案が発生しました。
その原因が、nginxのDockerではなく、その前段に構えていたhttps-portalというDockerコンテナだったので、メモついでに書き残しておきます。
構成
NoSchoolではローカルの開発環境をDockerで構成しています。
https-noschool:
container_name: https-noschool
image: steveltn/https-portal:1
ports:
- '80:80'
- '443:443'
environment:
STAGE: local
DOMAINS: 'localhost -> http://nginx-noschool'
volumes:
- ./docker/https-portal/cert:/var/lib/https-portal
depends_on:
- nginx-noschool
nginx-noschool:
image: nginx:(VERSION)
container_name: nginx-noschool
volumes:
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
- ./:/opt/noschool
environment:
TZ: Asia/Tokyo
depends_on:
- php-noschool
php-noschool:
build: ./docker/php-fpm
container_name: php-noschool
volumes:
- ./:/opt/noschool
working_dir: /opt/noschool
environment:
TZ: Asia/Tokyo
depends_on:
- php-front-noschool
nginxをhttpサーバー、PHPの実行環境としてはphp-fpmを利用し、本番同様httpsの環境を再現するために、https-portalを利用しています。
起こったこと
ローカルで画像を使った投稿をPOSTしようとすると、413 Request Entity Too Largeと画面に表示され、動作しませんでした。
調べたこと
ググれば、要はnginxのclient_max_body_size設定を書き換えることで上記の症状が治るとのことでした。デフォルトではリクエストの最大バイト数が1MBに設定されており、画像を添付するとゆうに超えてしまうということです。
やったこと
上記設定の通り、nginx自体の設定ファイルは./docker/nginx/default.confに置いてあるので、その中にclient_max_body_size 50M;と書き加え、docker-composeを再起動しました。
しかし、それでも画像投稿時に同様のエラーが出てしまいました。
原因
nginxの前段に置いているhttps-portalが同様にnginxを利用してhttps化をしており、そこで引っかかっていたのが原因でした。
上記リポジトリのREADMEにもAdvanced Usageとして設定方法が書かれているので、
environment:
STAGE: local
DOMAINS: 'localhost -> http://nginx-noschool'
CLIENT_MAX_BODY_SIZE: 10M
というように、docker-compose.ymlに最大リクエストサイズを指定してあげる必要があります。
どうして分かったのか
普段開発するときはdocker-compose up -dしているのですが、今回のように詰まったときは特にdocker-compose upとして、常にDocker側のログを吐き出すようにしています。
すると画像をPOSTしたときにエラーログが流れてきたのですが、nginx-noschoolコンテナのログではなく、https-noschoolコンテナのログだったのです。
そこでREADMEを見に行った結果、内部的にnginxを使っているコンテナであることが判明し、今回の設定内容の変更に至りました。
※もちろんnginx側の設定変更も必要です。両方client_max_body_sizeの変更しないといけないのが少々面倒ではありますね。
教訓
- なんとなくで
docker-composeしていたらバグった時に戸惑うのでちゃんと把握しておきましょう← - 困ったら
docker-compose upでログ観察
最後に
僕が働いているNoSchoolでは仲間を募集中です!
創業期真っ只中、社員は僕と社長の2人きり(+副業メンバー4人)でEdTechを変えに行ってます!
興味あればお茶でもしましょう。Twitterからの連絡でも大歓迎です!
https://www.wantedly.com/companies/noschool