如何使Nginx镜像模块不等待响应

时间:2018-08-02 00:55:59

标签: nginx

我们正在尝试使用Nginx的模块ngx_http_mirror_module将流量镜像到我们的新Web服务器。

这似乎导致产品Web服务器上出现延迟问题。 X个小时的镜像打开后,我们观察到Nginx错误日志“ 2018/07/25 15:55:54 [错误] 20#0:* 12190535在发送给客户端时,上游超时(110:连接超时): 10.128.0.37,服务器:,请求:“ POST / v1 / query?v = 20170712 HTTP / 1.1”,上游:“ http://10.3.248.222:8080//api/query?v=20170712”,主机:“ loadtest.xxx.yyy”。

我推测ngx_http_mirror_module可能会同时保持与原始上游的TCP连接以及与镜像目标的连接。

因此,我想知道如何使Nginx镜像模块不等待响应。或者,如何关闭到原始上游的开放套接字。

赞赏任何见解!

1 个答案:

答案 0 :(得分:0)

您的猜测确实是正确的。但是,有一种使用超时的解决方法。您可以明确地告诉Nginx在等待200毫秒并终止连接后不等待镜像位置的响应。

upstream backend {
    server backend.local:10000;
}

upstream test_backend {
    server test.local:20000;
}

server {
    server_name proxy.local;
    listen 8000;

    location / {
        mirror /mirror;
        proxy_pass http://backend;
    }

    location = /mirror {
        internal;
        proxy_pass http://test_backend$request_uri;
        proxy_connect_timeout 200ms;
        proxy_read_timeout 200ms;
    }

}

虽然我不确定终止连接的成本,所以最好部署一个轻量级的Web服务器,该服务器将请求对象排队以供以后异步使用。

这确实使事情复杂化了一点,但值得注意的是,您可以扩展轻型Web服务器,队列和消费者以匹配您的生产需求。