(具体来说,是 ASP.NET 回发 - 但即使如此,也只有其中的一部分)
我已将 nginx 配置为反向代理 ASP.NET 服务器。它的大部分工作都很好。所有 GET 请求都有效,大多数 POST 请求也有效。大多数 ASP.NET 回发都有效。但偶尔会有回发,由于某种我还没弄清楚的奇怪原因,每次都无法收到响应(即肯定会失败)。
此特定服务器的配置使得可以通过指定端口号直接访问 ASP.NET 实例(绕过 nginx)。绕过 nginx 后,一切都运行正常,所有请求都会立即得到响应。
我可以做些什么来进一步调试这个问题?我无法让 Nginx 记录事件,例如开始和结束上游请求/响应,更不用说它们的整个主体了。Fiddler 无法提供帮助,因为从浏览器到 nginx 的请求没有任何问题;问题发生在 nginx 和 ASP.NET 之间。还有其他想法吗?
配置摘录:http://pastebin.com/FyTtuUQZ
这可能与 keepalive 有关,因为回发最终会在大约 65 秒后超时 - 上述配置中指定的 keepalive 超时时间。但这可能是一个转移注意力的借口。
PS 这是一个仅用于开发的服务器,对其进行反向代理的目的是让我们可以将多个域指向这台机器,并使不兼容的服务器都出现在端口 80 上。但为了让我信任 nginx 反向代理生产服务器,我需要了解这个问题以确保它不会影响生产。
答案1
问题:即使请求中没有 Expect 标头,ASP.NET 开发服务器也会发送 100 Continue 响应Expect: 100-continue
。Nginx 将发出没有 Expect 标头的请求;ASP.NET 将使用 Expect 标头进行响应,然后接收请求的其余部分,然后发送实际响应。但是,Nginx 只会转发 100 Continue 部分。它不会转发实际响应;至少在 nginx 1.4.2 上,实际响应会被忽略。
解决方案:使用 IIS,即使整个设置仅用于开发目的。