我们在本地 kubernetes 集群上部署了一个应用程序,该应用程序通过 nginx 入口 NodePort 服务暴露在外部。由于 NodePort 服务在 80 以外的不同端口上运行,我们尝试使用 IIS ARR 和 HAproxy 作为代理,将来自应用程序 DNS 的请求转发到 Ingress 控制器
IIS ARR/HaProxy---> Nginx 入口控制器----> 应用程序
除了其中一个页面外,该应用程序工作得非常好。在该特定页面上提交表单数据时,它会因 HTTP 502 而失败
经过调查,发现请求在入口控制器处由上游终止。我们在入口控制器的日志中收到以下错误。
3596#3596: *77334704 upstream prematurely closed connection while reading upstream, client: 10.244.0.0, server: dns.*.*.*, request: "POST /xxx/page.action?appToken=sometoken HTTP/1.1", upstream: "http://10.244.3.13:8080/xxx/page.action?appToken=sometoken", host: "dns.*.*.*", referrer: "http://dns.*.*.*/xxx/somepage.action?appToken=sometoken"
10.244.0.0 - - [04/May/2021:14:01:53 +0000] "POST /xxx/page.action?appToken=sometoken HTTP/1.1" 200 5595 "http://dns.*.*.*/xxx/somepage.action?appToken=sometoken" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36" 1672 0.279 [ingress-nginx-xxx-service-80] [] 10.244.3.13:8080 31346 0.278 200 d4afef10a53464b68e2205f6d1cb146d
当请求流中不存在代理时,应用程序可以正常工作。但是我们必须使用代理来去除请求中端口的使用(类似于http: //dns...*:3xxxx)。
从日志中可以了解到,nginx 入口没有发送正确的响应,这导致了 Proxy 上的 502 错误。
有什么方法可以配置 nginx 入口控制器以在它(入口控制器)收到此错误(上游过早关闭连接,同时读取上游,客户端)时向代理发送正确的响应,以便页面按预期工作