概要
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 の値を適切なサイズに調整してください。
まとめ
同様のことでお困りの方の参考になりましたら幸いです。