大きすぎるCookieを処理して、Nginxが502を返すようにするにはどうすればよいですか?
Nginxサーバーは現在、NodeJSベースのアプリケーションのユーザーに対して502を返し、エラーログは次のことを示しています。
2670 upstream sent too big header while reading response header from upstream
これはCookieが大きすぎることが原因であると思われ(ヘッダーはリクエストに応じて4Kを超えます)、サイトのCookieをクリアするようにユーザーに指示する以外に、この状況に対処する方法がわかりません。これに対処する方法について何か提案はありますか?
nginxファイルのプロキシパス構成:
location / {
proxy_pass http://localhost:8081;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_set_header x-forwarded-host $host; proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
}
Nginxインスタンスに合格することで、さらにテストを行うと、アップストリームのNode.JSサーバーが4KBを超えるファイルを処理できることがわかり、問題がNginxレベルにあることがわかります。
私たちの環境:
UbuntuベースのシステムでNginx1.14.0が前面にあるExpressベースのNode.js10.19.0サーバー。Node.jsサーバーで実行されているアプリケーションは、QuasarSSRを使用しています。
回答
私がやった解決策は、記事とNginxのドキュメントに基づいて、ヘッダーサイズのバッファーを16Kに増やすことでした。
proxy_buffers 8 16k; # Buffer pool = 8 buffers of 16k
proxy_buffer_size 16k; # 16k of buffers from pool used for headers
ドキュメントから特定のテキストを引用するには:
オンproxy_buffers
:
構文:
proxy_buffers number size;
デフォルト:proxy_buffers 8 4k|8k;
コンテキスト:http, server, location
単一接続の場合、プロキシサーバーからの応答の読み取りに使用されるバッファーの数とサイズを設定します。デフォルトでは、バッファサイズは1メモリページに等しくなります。これは、プラットフォームに応じて、4Kまたは8Kのいずれかになります。
オンproxy_buffer_size
:
構文:
proxy_buffer_size size;
デフォルト:proxy_buffer_size 4k|8k;
コンテキスト:http, server, location
プロキシサーバーから受信した応答の最初の部分を読み取るために使用されるバッファーのサイズを設定します。この部分には通常、小さな応答ヘッダーが含まれています。デフォルトでは、バッファサイズは1メモリページに等しくなります。これは、プラットフォームに応じて、4Kまたは8Kのいずれかになります。ただし、小さくすることはできます。