11
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

nginxをDockerで利用している時に「413 Request Entity Too Large」で怒られたときの意外な原因

Last updated at Posted at 2019-04-03

株式会社NoSchoolでCTOをしている@mejilebenです。
今日はdockerでハマったところを書きます。

概要

nginxDockerで利用しているとき、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と画面に表示され、動作しませんでした。

調べたこと

ググれば、要はnginxclient_max_body_size設定を書き換えることで上記の症状が治るとのことでした。デフォルトではリクエストの最大バイト数が1MBに設定されており、画像を添付するとゆうに超えてしまうということです。

やったこと

上記設定の通り、nginx自体の設定ファイルは./docker/nginx/default.confに置いてあるので、その中にclient_max_body_size 50M;と書き加え、docker-composeを再起動しました。

しかし、それでも画像投稿時に同様のエラーが出てしまいました。

原因

nginxの前段に置いているhttps-portalが同様にnginxを利用してhttps化をしており、そこで引っかかっていたのが原因でした。

上記リポジトリのREADMEにもAdvanced Usageとして設定方法が書かれているので、

docker-compose.yml
    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

11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?