我想限制一些 nginx 位置并避免对同一个 POST 数据($request_body)使用两个并行的 FastCGI 线程。
我添加了限制连接区域并在某个位置配置了连接限制:
log_format postdata '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" "$request_body" /$upstream_cache_status/';
limit_conn_zone $request_body zone=tco_body:10m;
server {
.....
access_log /var/log/nginx/www.example.com_access.log postdata;
location ~ ^/billing/modules/gateways/callback/tco.php$ {
client_body_buffer_size 16m;
limit_conn tco_body 1;
limit_conn_log_level info;
limit_conn_status 429;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
client_max_body_size 64M;
fastcgi_pass 127.0.0.1:9901;
}
但不幸的是,nginx 仍然可以同时接受并向 php-fpm 后端发送两个具有相同 POST 数据的请求。
当 limit_conn 被禁用时,Nginx 可以正确记录 $request_body。但我注意到另一个奇怪的行为 - 当在此位置启用 limit_conn 时,访问日志不包含 $request_body,并且只有“-”。
xx.xx.xx.xx - - [22/Dec/2020:07:10:45 -0800] "POST /billing/modules/gateways/callback/tco.php HTTP/2.0" 200 315 "-" "Guzzle/6.2.1" "-" /-/
我尝试将此限制应用于 nginx/1.14.2(来自 Debian apt 存储库)和 nginx/1.19.6(来自官方 nginx 存储库)。Debian 10。
是否有人对我在这个设置中遗漏了什么可以使其按预期工作提出建议?