使用proxy_pass在nginx中“请求标头或Cookie太大”

时间:2017-09-19 08:00:12

标签: nginx cookies http-headers proxypass

我的服务器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.

1 个答案:

答案 0 :(得分:2)

事实证明,存在一些与域解析混淆的问题(我实际上并不理解),因此对服务器B的请求被传递给服务器A.它继续将自己的IP添加到X-Forwarded-For标头,直到超过最大大小 - 因此错误消息实际上是正确的。

为了进一步调试,我使用了

tcpdump -n -S -s 0 -A 'tcp dst port 80' | grep -B3 -A10 "GET"