我有一个nginx配置,其中有两个虚拟主机,没有默认站点。
server {
listen 123.45.67.89:80;
server_name site_a.example.com site_a1.example.com;
root /srv/site_a_checkout/html/site_a;
access_log /var/log/site_a/nginx.access.log;
error_log /var/log/site_a/nginx.error.log;
index index.html index.htm index.nginx-debian.html;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
}
每个虚拟主机配置都有一个server_name
行,其中包含两个服务器。
第二个服务器名site_a1.example.com
之所以存在,是因为存在不止一台服务器,有时开发人员需要知道他们正在查看的服务器。
如果请求http://site_a.example.com
,http://site_a1.example1.com
,http://site_b.example.com
或http://site_b1.example1.com
,nginx的性能将完全符合预期。
问题在于,如果请求http://123.45.67.89
,则site_a
网站将得到服务。
没有/etc/nginx/sites_enabled/default
,只有site_a和site_b的虚拟主机。
为什么site_a被用作http://123.45.67.89
?
如何使对IP地址的请求失败?
我也尝试过:https://superuser.com/a/1050864和https://serverfault.com/a/525011,但它们都不起作用。
答案 0 :(得分:0)
这些解决方案都不起作用,因为它们隐式地侦听0.0.0.0:80,而虚拟主机侦听123.45.67.89:80。
对于虚拟主机侦听的任何特定IP地址,都需要存在默认服务器。
这有效:
server {
server_name _;
listen 123.45.67.89:80 default_server deferred;
return 444;
}
如果我添加:
listen 123.45.67.89:443 default_server deferred;
它杀死HTTPS连接(在读取SNI之前),从而破坏该IP地址上的所有SSL虚拟主机。这又是一个问题。 https://serverfault.com/q/959286/20520