Nginx的Vhost互相冲突

我想使用nginx作为以下子域api.example.commonitor.example.com反向代理,但api.example.com的configuration设置总是覆盖monitor.example.com 。 api虚拟主机有限速器,我不想在监视器虚拟主机上应用该设置access_logaccess_logpath也不会在第二个虚拟主机设置上进行。

我可以正确访问后端服务器的内容,但我不明白为什么api.example.com的configuration设置也适用于monitor.example.com虚拟主机。

api.example.com

 limit_req_zone $binary_remote_addr zone=api:10m rate=90r/m; log_format custom '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" "$request_body"'; upstream backend { server web-06:80 max_fails=5 fail_timeout=20s; server web-01:80 max_fails=5 fail_timeout=20s; } server { listen 80; #logging #access_log off; #error_log off; access_log /var/log/nginx/access.log custom; location / { #rate limiting limit_req zone=api burst=1; proxy_pass http://backend; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_max_temp_file_size 0; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; } } 

monitor.example.com

 upstream backend2 { server web-06:80 max_fails=5 fail_timeout=20s; server web-01:80 max_fails=5 fail_timeout=20s; } server { listen 80; #logging #access_log off; #error_log off; error_log /var/log/nginx/monitor-error.log; access_log /var/log/nginx/monitor.log; location / { proxy_pass http://backend2; } } 

您的两个服务器块将始终发生冲突,因此configuration文件中第一个观察到的服务器块将作为所有请求的默认服务器块的先例 ,除非您为每个configuration指定适当的server_name以应用于该主机名/子域的传入请求。 (这也适用于所请求的$HOST与提供的任何configuration不匹配的所有请求,并且在configuration中没有指定default_server )。 这是NGINX在服务器块上缺lessconfiguration或$HOST请求不匹配时默认处理请求的方式。

NGINX将检查请求的主机名。 如果$HOST匹配一个匹配server_name的服务器块,它将使用该configuration来确定为请求提供服务的内容。 如果没有这样的configuration来定义什么服务器块处理什么,configuration中加载的第一个configuration块将在默认情况下在没有匹配server_name的情况下使用(并且您没有指定default_server )。 ( server_name api.example.com;将指定服务器块将与api.example.com匹配,而server_name monitor.example.com;指定与monitor.example.com匹配的服务器块)

通过一个NGINX实例通过多个主机名正确反向代理多个后端只能通过这种方式来实现,其中每个处理不同主机名请求到不同后端的代理块已经为每个server块单独定义了server_name指令。

您的后端也将有不同的configuration – 如果每个后端只为该主机提供服务,那么您不需要在那里指定server_name – 您需要在反向代理上指定server_name,以确保它通过正确路由请求configuration块,然后适当的后端。 (但是,如果他们可以同时服务这两个站点,则后端可能需要类似的configuration)

我已经build立了许多系统,其中一个NGINX实例将代理反向代理到networking上的多个不同的后端和系统,并且总是需要server_name被定义为正确工作。 这也是获得一个NGINX实例从相同的实例和configuration文件服务于许多不同网站的原理。 我也在Ubuntu中维护nginx包,这是我看到人们在NGINX做你正在做的事情时提到的一个常见问题。

 http{ ... server { listen 80; server_name api.example.com; #charset koi8-r; access_log logs/api.example.com.access.log combined; location / { proxy_set_header X-Real-IP $remote_addr; proxy_pass http://servername1; root path1; } } server { listen 80; server_name monitor.example.com; access_log logs/monitor.example.com.access.log combined; location / { proxy_set_header X-Real-IP $remote_addr; proxy_pass http://servername2; root path2; } } 

}