我使用 nginx 作为带有 ELB 的反向代理服务器。我正在寻找有关我在 nginx.conf 文件中设置的解析器值的解释。我的 nginx.conf:
http {
...
resolver x.x.x.x valid=30s;
...
}
server {
...
set $elb "example.com";
location / {
...
rewrite ^/(.*) $1 break;
proxy_pass http://$elb/$1?$args;
...
}
...
}
我按照这个 - https://www.ruby-forum.com/topic/6816375#1166569 并将 /etc/resolv.conf 值设置为解析器值,并且工作正常。这背后是什么?
Nginx
resolver
指令是必要的,因为操作系统解析器不是异步的。 Nginx 是一个多路复用服务器(一个操作系统进程中有许多连接),每个解析器调用都可以阻止所有连接。这就是为什么 Nginx 实现了自己的内部非阻塞解析器。
如果您的配置文件仅包含静态 DNS 名称,并且域名中没有变量,并且您不想在不重新加载 Nginx 的情况下跟踪 IP 更改,则不需要 Nginx 解析器。这是因为在这种情况下,所有 DNS 名称都将在 Nginx 启动时解析。
但是如果您需要在运行时查找域,则需要一个
resolver
。
示例
location {
proxy_pass http://example.com;
}
此处不需要 resolver
,因为 example.com
将在 Nginx 启动/重新启动时解决。如果example.com
更改了自己的IP,则需要重新加载Nginx才能使更改生效。
location {
resolver 8.8.8.8;
proxy_pass http://example.com; # <-- resolver not used here
}
即使您在配置文件中使用
resolver
指令,这个 example.com
也只会在启动时解析。
在上面的两个例子中,如果
example.com
目前没有解析,Nginx 将不会启动并会给你一个错误。如果您在容器内启动 Nginx 并且另一个容器(proxy_pass 目标)尚未启动,因此 DNS 名称尚未准备好,这一点很重要。在这种情况下,您可以使用运行时解析:
location {
resolver 8.8.8.8;
set $domain example.com;
proxy_pass http://$domain;
}
动态主机命名(使用变量)如果没有
resolver
将无法工作,因为它是在运行时解析的(在使用时)。如果您在proxy_pass
中使用变量但忘记了resolver
,Nginx将不会启动。
server {
location {
proxy_pass http://myupstream;
}
}
upstream myupstream {
server example.com resolve;
resolver 8.8.8.8;
}
更具体的情况是
upstream
块中的服务器。在上面的示例中,example.com
将在运行时解析。但在 Nginx 中,它是商业订阅的一部分(但你可以免费使用 Angie fork)
Nginx 解析器指令对于任何依赖 ELB 和 proxy_pass 的 AWS 环境都至关重要。这是我最近写的一篇文章,描述了开源 nginx 静态 DNS 缓存的问题和解决方案:
基本上,对于简单的情况,它将归结为以下配置:
server {
listen 80;
server_name example.com;
location / {
resolver 172.16.0.23;
set $upstream_endpoint http://service-999999.eu-west-2.elb.amazonaws.com;
proxy_pass $upstream_endpoint$request_uri;
}
}