nginx中的“resolver”参数有什么作用?

问题描述 投票:0回答:2

我使用 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 reverse-proxy resolver
2个回答
41
投票

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)


25
投票

Nginx 解析器指令对于任何依赖 ELB 和 proxy_pass 的 AWS 环境都至关重要。这是我最近写的一篇文章,描述了开源 nginx 静态 DNS 缓存的问题和解决方案:

Nginx 解析器解释以及如何处理 IP 变化

基本上,对于简单的情况,它将归结为以下配置:

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;
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.