我如何保证NGINX不会出现错误的网站?

为了帮助解释我的问题,让我创build一个类似的,但虚构的背景故事。

比方说,我有一个朋友,莎拉,通过networking摄像头让她生活。 假设这个收入来源支持莎拉4岁的丽莎。

我遇到了莎拉,因为她订了我一个自定义的成人摄像头网站。 她还把我介绍给了Lisa的幼儿园,他也订约我写他们的网站。

为了省钱,我通过Nginx使用相同的服务器托pipe这两个站点。

我兴奋地通知学校我在他们的网站上取得的所有进展! 我所不知道的是,我服务lisas-preschool.com节点进程已经closures。

经过一个尴尬的电话,我发现有时Nginx会为访问的网站提供错误的内容。

这显然不会发生,永远! 那么, 如何确保sarahs-site.comlisas-preschool.com永远不会交叉?

作为参考,这里是网站的configuration:

lisas-preschool.com:

这是一个node.js网站:

 upstream lisas_preschool { server 127.0.0.1:3000; } # HTTP Server server { listen 0.0.0.0:80; server_name www.lisas-preschool.com lisas-preschool.com; access_log /var/log/nginx/lisas-preschool.access; location / { proxy_pass http://lisas-preschool.com; proxy_http_version 1.1; proxy_redirect off; proxy_buffering 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_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-Forward-Proto http; proxy_set_header X-Nginx-Proxy true; } } 

sarahs-site.com

这是一个WordPress的网站:

 server { listen 80; listen [::]:80; server_name sarahs-site.com www.sarahs-site.com; index index.php index.html index.htm; root /var/www/sarahs-site.com/html; location / { try_files $uri $uri/ /index.php; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /var/www/site-b.com/html; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } } 

处理这种情况的最可靠的方法是保证只有在明确要求该主机名的情况下才能提供站点。 当请求另一个站点的唯一情况是Nginx不能(由于某种原因)find请求的站点,而是提供默认的服务。 缺省值将是第一个定义的server或者是默认指定的server

通过设置一个在任何情况下都是安全的默认server块(如下面的例子),可以肯定的是,它将在最坏的情况下被服务。

 server { listen 80 default_server; server_name _; return 444; } server { listen 80; server_name example1.com; } server { listen 80; server_name example2.com; } 

如果使用SSL,请确保您有一个用于SSL的默认server块(或者是单独的server块,或者与非SSL server块相同)。 您也可以通过为这两个站点提供不同的专用IP地址来添加到分隔中。

您在“服务器”块中的listen指令使用不同的格式。 这意味着虚拟主机为自己获取不同的侦听套接字,对于某些协议/接口组合,您可能会得到意外的请求结果。

我会build议你使用listen 80; 在两个虚拟主机上,这样nginx将在IPv4和IPv6套接字上侦听端口80。 或者,如果您只需要IPv4套接字,请使用listen 0.0.0.0:80;

此外,我会做一个默认的服务器,直接断开所有的请求到任何其他的虚拟主机:

 server { listen 80 default_server; return 444; }