我在nginx后面使用node.js,node.js应用程序使用http代理。
基本上,请求到达nginx,然后被代理到node应用程序:
- if static files are requested, the node.js app serves them
- if non static files are requested, the node.js app proxyies the request to a second node.js app (using http-proxy npm).
当nginx不在图片中时,第二个例子工作得很好。当nginx被添加时,响应非常奇怪:它被奇怪的东西包围:
"4c\r\n{ json stuff }\r\n0"
而不是
{ json stuff }
总结一下:
(不带nginx):请求动态内容->node.js->代理到另一个node.js app->发送回用户的响应是正确的:{json stuff}
(使用nginx):请求动态内容->node.js->代理到另一个node.js app->发送回用户的响应不正确:“4c\r\n{json stuff}\r\n0”
我还是不明白这里发生了什么…知道吗?
更新
六羟甲基三聚氰胺六甲醚。。。。似乎它链接到了nginx,在请求中添加了额外的头…
我的nginx配置是:
upstream my_sock {
server unix:/tmp/test.sock
fail_timeout=0;
}
server {
listen 8099;
client_max_body_size 4G;
server_name localhost;
keepalive_timeout 5;
location / {
proxy_pass http://my_sock;
proxy_redirect off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
}
知道如何删除这些额外的标题吗?
更新2
添加的4c似乎是我期望的响应的长度(json的东西)。我接着补充道:
proxy_set_header Content-Length '';
在nginx配置中,但没有改变…我仍然有4c显示…参数…
最佳答案
我知道已经6个月了,所以你可能已经知道了,但是万一有人发现你的问题:
这是nginx输出一个分块传输编码(Transfer-Encoding: chunked
)-正如您正确地指出的,4c
是下一个分块的长度(以十六进制表示),并且末尾的0
表示没有更多的内容(即,它是传输的结尾)。如果浏览器/客户端不包含Transfer-Encoding: chunked
头,这将被误解-我将首先检查这个。
nodejs默认为分块编码,除非显式设置Content-Length
头。我对nginx没有太多的经验,但我的猜测是,如果nodejs代码正确输出Content-Length
头,那么nginx应该转发这个消息,除非您另有说明,所以我会检查nodejs服务器的头。你也可以尝试更新你的nginx-我有一个模糊的记忆,早期的版本不处理块传输编码很好,虽然我可能是错的。