nginx-proxyでの 413 Request Entity Too Large エラーの対処法
概要
EC2上にDockerをインストールし、nginx-proxy
とnginx-proxy-lets-encrypt
を利用してSSL化を行いました。
上記の設定で問題なく使用できていましたが、比較的大きなサイズのファイルをPOSTするアプリを作成した際、以下のエラーが発生してアップロードできませんでした。
nginx-proxy 413 (Payload Too Large)
Nginxのclient_max_body_size
を上げる必要がありました。
方法
ChatGPT4に教えていただいた以下の対応により、解決することができました。
413 Request Entity Too Large
エラーは、クライアントがサーバーに送信しようとしているリクエストのペイロード(つまり、アップロードするファイルのサイズなど)がサーバーで設定された制限を超えている場合に発生します。このエラーを解決するためには、Nginx の設定でクライアントリクエストの最大サイズを増やす必要があります。
nginx-proxy
コンテナでこの設定を調整するには、client_max_body_size
ディレクティブの値を増やすことで、受け入れ可能なリクエストサイズの上限を上げることができます。しかし、jwilder/nginx-proxy
イメージを使用している場合、直接 Nginx の設定ファイルを編集するのではなく、カスタム設定を適用する方法が推奨されます。
以下は、client_max_body_size
を増やすために必要な手順です。
-
カスタム設定ファイルを作成する:
ローカルに
client_max_body_size
ディレクティブを含むカスタム Nginx 設定ファイルを作成します。例えば、この設定を100M
(100メガバイト)に設定したい場合、次の内容を含むファイルを作成します。my_custom_proxy_settings.conf
:client_max_body_size 100M;
-
カスタム設定ファイルを Docker コンテナにマウントする:
nginx-proxy
サービスの定義に、このカスタム設定ファイルを/etc/nginx/conf.d
ディレクトリにマウントする設定を追加します。これにより、Nginx が起動する際にこの設定が適用されます。修正された
docker-compose.yml
の例:services: nginx-proxy: image: jwilder/nginx-proxy container_name: nginx-proxy ports: - "80:80" - "443:443" volumes: - html:/usr/share/nginx/html - dhparam:/etc/nginx/dhparam - vhost:/etc/nginx/vhost.d - certs:/etc/nginx/certs:ro - /var/run/docker.sock:/tmp/docker.sock:ro - /srv/docker/nginx-proxy-with-encrypt/log:/var/log/nginx - ./my_custom_proxy_settings.conf:/etc/nginx/conf.d/my_custom_proxy_settings.conf:ro # この行を追加 labels: - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy" restart: always
-
Docker コンテナを再起動する:
変更を適用するために、
docker-compose
を使ってnginx-proxy
コンテナを再起動します。docker-compose down docker-compose up -d
これらの手順により、nginx-proxy
コンテナを介して行われる全てのリクエストに対して、client_max_body_size
が 100M
に設定されます。必要に応じて、100M
の値を適切なサイズに調整してください。
まとめ
同様のことでお困りの方の参考になりましたら幸いです。
Discussion