我使用nginx代理并为我保持远程服务器的持久连接.
我已经配置了大约15个与此示例类似的块:
upstream rinu-test {
server test.rinu.test:443;
keepalive 20;
}
server {
listen 80;
server_name test.rinu.test;
location / {
proxy_pass https://rinu-test;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $http_host;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是如果无法在一个或多个upstream
块中解析主机名,则nginx将不会(重新)启动.我也不能使用静态IP,其中一些主机明确表示不会这样做,因为IP会发生变化.我看到这个错误消息的每个其他解决方案都说要摆脱upstream
并在location
块中做所有事情.这不可能,因为keepalive
只有在upstream
.
我可以暂时承受失去一台服务器但不是全部15台.
编辑:结果nginx不适合这个用例.应使用备用后端(上游)keepalive代理.我的答案是自定义Node.js替代方案.到目前为止,我还没有找到其他任何实际可行的替代方案.
nba*_*ari 10
您的情况与使用 awsELB
作为上游的情况非常相似,其中resolve
对定义域的正确 IP至关重要。
您需要做的第一件事是确保您使用的 DNS 服务器可以解析到您的域,然后您可以像这样创建配置:
resolver 10.0.0.2 valid=300s;
resolver_timeout 10s;
location /foo {
set $foo_backend_servers foo_backends.example.com;
proxy_pass http://$foo_backend_servers;
}
location /bar {
set $bar_backend_servers bar_backends.example.com;
proxy_pass http://$bar_backend_servers;
}
Run Code Online (Sandbox Code Playgroud)
请注意,resolver 10.0.0.2
它应该是可以工作并回答您的查询的 DNS 服务器的 IP,这取决于您的设置,这可能是本地缓存服务,例如unbound。然后只需使用resolve 127.0.0.1
现在,使用变量来指定域名非常重要,来自文档:
当您在 proxy_pass 指令中使用变量指定域名时,NGINX 会在其 TTL 到期时重新解析域名。
您可以使用以下工具检查解析器dig
:
$ dig +short stackoverflow.com
Run Code Online (Sandbox Code Playgroud)
如果必须keepalive
在上游使用,并且不是使用 Nginx + 的选项,那么您可以尝试使用openresty balancer,您将需要使用/实现lua-resty-dns
这已经通电全球访问量最大的网站数量庞大(有的还在做甚至nowdays,如果服务器头是可以相信的)nginx的(1.1.4之前)的早期版本,甚至没有支持keepalive
上upstream
侧,因为在数据中心设置中这样做几乎没有好处,除非您在各个主机之间有不平凡的延迟。有关某些说明,请参见https://serverfault.com/a/883019/110020。
基本上,除非您知道在上游和前端之间特别需要保持连接,否则很有可能只会使您的体系结构的弹性降低且状况恶化。
(请注意,您当前的解决方案也是错误的,因为IP地址的更改同样不会被检测到,因为您仅在配置重新加载时进行主机名解析;因此,即使nginx确实启动了,一旦IP地址也将基本上停止工作的上游服务器确实发生了变化。)
潜在的解决方案,选择一种:
最好的解决方案似乎只是消除了upstream
keepalive
在数据中心环境中不必要的可能,并proxy_pass
为每个请求使用具有最新DNS解析度的变量(nginx仍然足够聪明,仍然可以缓存此类解析度)
另一种选择是通过商业订阅获得nginx的付费版本,该订阅在上下文中具有resolve
该server
指令的参数upstream
。
最后,另一种尝试是使用set
变量和/或a map
来指定其中的服务器upstream
;既未确认也未拒绝执行;例如,它可能会或可能不会。
归档时间: |
|
查看次数: |
34183 次 |
最近记录: |