end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

nginx + uwsgi + flask 環境で、http getの巨大requestにより502エラー

そもそも、あまりに長い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」エラーとなりました。

更に長いurlの作成には、curl以外を必要とするのでしょうが、 curl以外の方法って、あるんですかねぇ

*1:211

*2:220