曾经有一次,某个已经不在我公司工作的人员决定手动编译 nginx,而并不知道自己在做什么,并将其投入生产。
现在我们无法添加模块,而且我们无法关闭 nginx 并重新开始一个新实例,因为这会破坏客户的体验(因为它正在生产中)。
为了更接近目标(我们可以用一个新的 nginx 实例替换这个 nginx 实例),我们想实现镜像。同样,我们现在无法安装镜像模块。我们必须以其他方式进行安装。
我对 nginx 一无所知,但我总是想学习并且喜欢上网与人们讨论一些事情。
基本上,我们有一个用作反向代理的 nginx。发送到的请求url/apis*
被重定向到内部 API 服务器。出于测试目的,我们需要将此流量镜像到另一台服务器。工作中有人想出了这个解决方案,使用post_action
。
location ~* /apis*$ {
proxy_pass http://api_server/$1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass_request_headers on;
gzip "on";
keepalive_timeout 10;
post_action @mirror_test;
}
location @mirror_test{
proxy_ignore_client_abort on;
proxy_pass http://test_api_server/$1;
}
}
现在,这个解决方案确实正确地镜像了流量,但是,我们不确定响应是否被忽略了。阅读镜像模块文档,它表示使用该模块的镜像子请求响应将被忽略,我们希望获得相同的行为。对客户端的响应应仅来自主服务器 ( api_server
),而不是来自镜像服务器 ( test_api_server
)。
那么,在这种配置中,来自镜像服务器的响应是否会被忽略?
答案1
你可以升级 nginx 而不删除单个客户端连接:https://www.digitalocean.com/community/tutorials/how-to-upgrade-nginx-in-place-without-dropping-client-connections
更新:以下文字回答了您在评论中提出的问题:
优雅地更新可执行文件的第一步是实际更新二进制文件。使用适合您的 Nginx 安装的任何方法执行此操作,无论是通过包管理器还是源安装。
因此,您可以使用想要包含或排除的模块对源进行全新安装,然后使用该二进制文件进行升级过程。