我的服务器A上有以下nginx设置(面向互联网,只有相关部分):
upstream new_api {
server unix:///home/ubuntu/new_api/shared/tmp/sockets/puma.sock;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
large_client_header_buffers 4 16k;
ssl_certificate /etc/nginx/cert.crt;
ssl_certificate_key /etc/nginx/cert.key;
location ~ (^(/some/location|/some/other)) {
proxy_pass http://new_api;
}
location / {
proxy_pass https://serverB.com;
}
}
现在,如果我转到/some/location
,它将在新的api上游得到很好的服务。但是还有其他任何东西我都会从nginx那里得到“400 Bad Request Request Header或Cookie Too Large”。即使卷曲没有饼干,只有两个短标题。增加large_client_header_buffers
无济于事。
有趣的是,我根本没有看到这个请求到服务器B,所以它在服务器A上被切断了。为什么?是不是因为https
协议我是proxy_passing到?
此外,在设置服务器A之前,一切都是在没有任何问题的情况下进入服务器B.
答案 0 :(得分:2)
事实证明,存在一些与域解析混淆的问题(我实际上并不理解),因此对服务器B的请求被传递给服务器A.它继续将自己的IP添加到X-Forwarded-For
标头,直到超过最大大小 - 因此错误消息实际上是正确的。
为了进一步调试,我使用了
tcpdump -n -S -s 0 -A 'tcp dst port 80' | grep -B3 -A10 "GET"