nginx - 如何让 Nginx 镜像模块不等待响应
问题描述
我们正在尝试使用 Nginx 的模块 ngx_http_mirror_module 将流量镜像到我们的新网络服务器。
这似乎会导致我们的产品网络服务器出现延迟问题。在开启镜像 X 小时后,我们观察到 Nginx 错误日志“2018/07/25 15:55:54 [error] 20#0: *12190535 upstream timed out (110: Connection timed out) while sent to client, client: 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 镜像模块不等待响应。或者,如何关闭原始上游的打开套接字。
感谢任何见解!
解决方案
你的推测确实是正确的。但是,有一个使用超时的解决方法。您可以明确告诉 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 服务器、队列和消费者,以匹配您的生产需求。
推荐阅读
- bash - 如何将多个文件的内容附加到单个文件?
- c++ - 传递给另一个函数时获取数组的长度
- jquery - 如何在 n 秒后重试 AJAX 循环 n 次?
- windows - 尽管设置了 ImagePullPolicy=Never,但无法使用 kubectl 和 minikube 启动 pod
- python - 在 Python 中的函数之间返回
- karate - 空手道 - 无法与 pkcs12 密钥库和密码建立连接
- java - 来自 Java 服务的间歇性 UnknownHostException 的根本原因?
- windows - 如何使用 CMake 找到 CUDNN?
- python - 为什么 input() 函数返回 None?
- math - 如何从两个 2d 点对 3d 坐标进行三角测量?