nginx 开源中的上游块允许您启用与反向代理服务器的 keepalive 连接(文档:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive)。
Syntax: keepalive connections; Default: — Context: upstream
激活与上游服务器连接的缓存。
connections 参数设置每个工作进程的缓存中保留的到上游服务器的最大空闲保持活动连接数。
但是,在 nginx 开源中使用上游块有一些注意事项,特别是:DNS 会被缓存,直到重新启动或重新加载,无论 TTL 如何。这意味着,如果您使用具有 keepalive 的上游块来反向代理到 AWS 负载均衡器,那么当负载均衡器 IP 更改时,您将遇到停机,除非人员/服务重新加载或重新启动 nginx。 “在变量中设置域名”(见下文)允许以 TTL 间隔或任何其他所需间隔重新解析 DNS,但似乎不允许您启用 keepalive 连接。
是否可以启用keepalive连接,同时通过nginx开源中的域名反向代理到另一台服务器并且还根据TTL重新解析DNS(无需服务器重新加载/重启)? (Nginx Plus 支持在上游块中重新解析 DNS)。如果单独使用 nginx 开源无法实现这一点,那么最好将 DNS 解析移至 HAProxy 等另一层并指向 nginx 上游块中的该层吗?
nginx keepalive 和 dns 解析器 几乎是同一个问题,但有以下区别:这里,如果 nginx 本身无法完成,则使用插件或不同的层就可以了。该问题的一个答案提到使用 https://github.com/wdaike/ngx_upstream_jdomain,但这个插件似乎多年来没有改变,所以我怀疑将 DNS 解析移至另一层会更容易维护前进。
在以下相关问题的评论中出现了类似的问题:Why does nginx proxy_pass close my connection?
在 https://www.nginx.com/blog/dns-service-discovery-nginx-plus/ 中,提到了 nginx 的三种 DNS 服务发现方法,看起来它们都不允许重新-在不重启/重新加载 nginx 的情况下解析 DNS 并使用上游参数,例如
keepalive
:
在 proxy_pass 指令中使用域名
server { location / { proxy_pass http://backends.example.com:8080; } }
...
此方法是进行服务发现的最不灵活的方法,并且具有以下额外缺点:
- 如果域名无法解析,NGINX将无法启动或重新加载其配置。
- NGINX 会缓存 DNS 记录,直到下次重新启动或重新加载配置,忽略记录的 TTL 值。 [强调我的]
- 我们无法指定其他负载均衡算法,也无法配置被动运行状况检查或由服务器指令的参数定义的其他功能,我们将在下一节中描述。
在上游服务器组中使用域名
upstream backends { least_conn; server backends.example.com:8080 max_fails=3; } server { location / { proxy_pass http://backends; } }
...
虽然此方法使我们能够选择负载均衡算法并配置健康检查,但它仍然与之前的方法在启动、重新加载和 TTL 方面具有相同的缺点。 [强调我的]
在变量中设置域名
resolver 10.0.0.2 valid=10s; server { location / { set $backend_servers backends.example.com; proxy_pass http://$backend_servers:8080; } }
...这种方法消除了第一种方法的两个缺点,即当域名无法解析时,NGINX 启动或重新加载操作不会失败,并且我们可以控制 NGINX 重新解析名称的频率。
但是,由于它不使用上游组,因此您无法向服务器指令指定负载均衡算法或其他参数(就像我们在第二种方法中所做的那样)。 [强调我的]