そもそも、あまりに長いurlによるhttp getなrequestは、 呼び出す側であるclient側が問題かと思いますが、 nginxやuwsgi側で対策できないかと思い、調べてみました。
request用bash
#!/usr/bin/bash str_size=$((2**11)) param="key="`cat /dev/urandom|tr -dc 'a-zA-Z0-9'|fold -w $str_size|head -n 1` echo $param | curl -G http://localhost:8080/ --data @-
default状態で発生するエラーの内容
$ bash ./foo.sh <html> <head><title>502 Bad Gateway</title></head> <body> <center><h1>502 Bad Gateway</h1></center> <hr><center>nginx/1.23.3</center> </body> </html>
先程のbashを実行すると、502エラーとなりますが、 nginxやuwsgiのログには、次のように表示されます。
nginx/logs/access.log
127.0.0.1 - - [05/Mar/2023:20:36:47 +0900] "GET /?key=VHR8Iv70KoaysEhLDZxkZFdQ00Mj65N【略】 HTTP/1.1" 502 157 "-" "curl/7.76.1"
nginx/logs/error.log
2023/03/05 20:36:47 [error] 3733#0: *1 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 127.0.0.1, server: , request: "GET /?key=VHR8Iv70KoaysEhLDZxkZFdQ00Mj65N6yPHvu06W7X9rdbFBBYSakuJU10K12t【略】
~/logs/uwsgi.log
invalid request block size: 4456 (max 4096)...skip
uwsgiのbufferを拡張
今回の場合、wsgi.iniで以下のように設定することで、解消できました
buffer-size=5000
(参考) nginxのbufferを拡張
今回は使用しませんでしたが、 nginxのbuffer拡張は以下のように設定するようです
proxy_buffer_size 64k; proxy_buffers 4 128k; proxy_busy_buffers_size 128k;
(参考) 更に長いurlの作成を試みると、curlでエラー
今回、bash内で「str_size=$*1」とした範囲内で解消できましたが、 これを「str_size=$*2」とした場合、 「curl: (27) Out of memory」エラーとなりました。