我正在使用 nginx/0.7.68,在 CentOS 上运行,配置如下:
server {
listen 80;
server_name ***;
index index.html index.htm index.php default.html default.htm default.php;
location / {
root /***;
proxy_pass http://***:8888;
index index.html index.htm;
}
# where *** is my variables
Run Code Online (Sandbox Code Playgroud)
这proxy_pass
是针对 IP 频繁更改的 DNS 记录。Nginx 缓存过时的 IP 地址,导致请求错误的 IP 地址。
当 IP 地址过期时,如何阻止 nginx 缓存它?
oha*_*aal 137
接受的答案在 nginx/1.4.2 上对我不起作用。
使用变量proxy_pass
强制重新解析 DNS 名称,因为 NGINX 对待变量的方式与静态配置不同。从NGINXproxy_pass
文档:
参数值可以包含变量。在这种情况下,如果地址被指定为域名,则在描述的服务器组中搜索该名称,如果没有找到,则使用解析器来确定。
例如:
server {
...
resolver 127.0.0.1;
set $backend "http://dynamic.example.com:80";
proxy_pass $backend;
...
}
Run Code Online (Sandbox Code Playgroud)
注意:解析器(即要使用的名称服务器)必须可用并进行配置以使其工作(并且/etc/hosts
文件中的条目不会在查找中使用)。
默认情况下,1.1.9 或更高版本的 NGINX 缓存响应使用响应的 TTL 值和可选valid
参数允许覆盖缓存时间:
resolver 127.0.0.1 [::1]:5353 valid=30s;
Run Code Online (Sandbox Code Playgroud)
在 1.1.9 版本之前,无法调整缓存时间,nginx总是将答案缓存 5 分钟。.
小智 12
gansbrest 评论和 ohaal 回答中提供了有价值的信息。
但我认为重要的是要提到这篇 2016 年发布的 nginx 官方文章,它清楚地解释了 nginx 在这件事上的行为以及可能的解决方案:https : //www.nginx.com/blog/dns-service-discovery-nginx-plus /
我们确实必须“在变量中设置域名”并使用解析器指令。
然而,使用变量会改变重写行为。您可能必须使用 rewrite 指令,这取决于您的位置和 proxy_pass 设置。
PS:本来可以发表评论但还不够积分...
小智 7
ohaal 的回答让我们大多数人都在那里,但有一种情况,DNS 解析器不在 127.0.0.1 处(例如,当您处于特殊的容器化环境中时)
在这种情况下,您可能需要将 nginx conf 更改为resolver ${DNS_SERVER};
. 然后,在启动 nginx 之前,运行
export DNS_SERVER=$(cat /etc/resolv.conf |grep -i '^nameserver'|head -n1|cut -d ' ' -f2)
envsubst '${DNS_SERVER}' < your_nginx.conf.template > your_nginx.conf
Run Code Online (Sandbox Code Playgroud)
请注意,您需要gettext
安装该软件包,因为它提供了envsubst
命令。