我们在 nginx(Ubuntu 20 上的 1.18.0)代理后面有多个端点的 Web API。除了一种情况外,一切正常。当用户使用我们公司的 Android 应用尝试上传附件时使用一个特定的端点 到 nginx 后面的服务器,如果网络连接很差,则 POST 请求根本无法到达服务器。所有其他端点都可以毫无问题地访问。作为管理员,我可以看到长 tcp 流客户端->nginx,我看到nginx 日志中出现 400 错误,向代理 api 服务器发送了零字节。 Wireshark 显示 nginx->server 没有 POST 请求。如果网络速度良好,一切正常。我们用流量整形器测试了这种情况,是的,nginx 确实停止将上传 POST 请求传递给 api 服务器。我们的配置:
upstream my_backend {
server app.ours.local:8080;
keepalive 60;
}
Server {
listen 443 ssl;
server_name our.server;
ssl_certificate /etc/nginx/ssl/chain.crt;
ssl_certificate_key /etc/nginx/ssl/private.key;
keepalive_timeout 40;
access_log /var/log/nginx/our.access.log upstreamlog;
error_log /var/log/nginx/our.error.crit.log crit;
error_log /var/log/nginx/our.error.alert.log alert;
error_log /var/log/nginx/our.error.emerg.log emerg;
error_log /var/log/nginx/our.error.log error;
error_log /var/log/nginx/our.error.warn.log warn;
default_type application/json;
client_max_body_size 100M;
proxy_http_version 1.1;
proxy_redirect off;
proxy_buffering on;
proxy_read_timeout 120s;
proxy_pass_header Authorization;
proxy_set_header Connection "";
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
client_body_timeout 60s;
}
location / {
return 404 "Not found.";
}
location /MobApp/ODataV4/AddServiceFile {
proxy_set_header Host my_backend;
rewrite ^/MobApp/ODataV4/ /api/ODataV4/APIManagement_AddMMRequestFile?company=Ours break;
proxy_pass https://my_backend;
}
我们需要我们的 nginx 代理服务器处理来自慢速客户端的长请求,就像它处理正常速度的客户端一样,将请求发送到 nginx 后面的应用服务器。现在它根本就不传递任何数据包。我在访问日志中只看到一条消息,错误为零:
[02/Jun/2023:11:32:30 +0300] status - 400 x.x.x.x - our.server to: y.y.y.y:8080: POST /MobApp/ODataV4/AddServiceFile HTTP/1.1 /api/ODataV4/APIManagement_AddMMRequestFile - bytes_sent - 0
我们尝试过使用 proxy_buffer 和 client_buffer 设置,比如超时和缓存开启/关闭。但没用。现在我不知道如何让 nginx 处理这样的请求,所以任何提示、想法、猜测 - 请帮忙 :-)