📖

Nginxサーバーの送信データ容量上限値(client_max_body_size)について

2022/03/18に公開

事象として

画像をフロントからサーバーへAPIで送信して、S3にアップロードをする処理を書いた際にサーバー側へ送信されませんでした。
サーバー側に送られなかったとは言っても、構成がわからないと思うのですがそれぞれにフロント、サーバーを別コンテナで構成しています。それをプロキシコンテナのネットワークで繋いでサービスを構築しています。

なぜ送れなかったのか

https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size
によると、nginxではデフォルトで1MBを超えるデータ送信容量になるとエラーを吐く設定になっているようです。

記述した内容

今回はそれぞれのコンテナを構築しているので、
各コンテナのnginxの設定ファイルに

client_max_body_size 20M;(例として20MBまで送信できる)

と追加で記述していきます。
そうすることで画像の容量が大きくても送信できるようになりました。

プロキシに至っては、設定ファイルがないので、
docker-compose.ymlに下記を追加

docker-compose.yml
	volumes:
		- /var/run/docker.sock:/tmp/docker.sock:ro
		- ./server.conf:/etc/nginx/conf.d/server.conf ←これを追加で記述

追加したserver.confに

server.conf
client_max_body_size 20M;(例として20MBまで送信できる)

の1行のみを追加しました。

エラーの概要

750KBの画像を送信するとエラーが起き、475KBまでなら送信できていました。
なぜこの画像が1MBを超えてしまうのかは、フロントで処理を共通して送信処理を行っているのでこの処理内容は割愛します。

750KBの画像の送信時のフロント側のコンソール上に表示されるエラーは

Access to XMLHttpRequest at 'http://localhost:3065/user' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

となり、下記が各コンテナのログの表示内容(一部抜粋)

 [error] 463#463: *360 client intended to send too large body: 1733096 bytes, client:............

このエラーとしてはサーバーへ送信されるデータの容量が大き過ぎますよ。というエラーになります。

最初はCros Origin Accessエラーの方なのかと疑いましたが、PCに保存している画像を送信しようとしているので、アクセス関係ではないだろう。との判断でコンテナのログが原因だろうと絞って処理していきました。

それぞれフロント、サーバー側のnginxの設定ファイルに

client_max_body_size 20M;

を記述しました。
ですが、これだけではサーバーへ送信できず上記したエラーが表示、返ってくるだけとなってしまいました。
ログを見れば分かったのですが、両コンテナをネットワークで構築しているプロキシコンテナが、標準の設定状態のままでフロント → プロキシ → サーバーのネットワーク内でのデータの流れが、プロキシコンテナでひっかっかっているようでした。

Discussion