我有几台服务器在同一台计算机上运行,有些服务器仅使用http,有些服务器同时使用http和https。在主配置文件中包含的单独文件中定义了几个服务器块。
我为http设置了一个“默认”服务器,该服务器将为通用的“维护页面”提供服务,以与其他配置文件中的任何其他server_name不匹配的请求。http默认服务器按预期工作,它使用server_name“ _”,并且它首先出现在包含列表中(因为我观察到,如果在服务器之间有重复的server_names,则使用出现的第一个)。这很好。
我希望有相同的服务器块(仅将“ listen 80 default_server”切换为“ listen 443 default_server”,而不是服务页面“ return 444”),但事实并非如此。取而代之的是,尽管其他服务器块对传入的请求具有更合适的server_name,但新的默认https服务器似乎实际上正在捕获所有传入的https连接并导致它们失败。删除新的默认https服务器将导致恢复半正确的行为:带有https的网站将全部正确加载;但没有https的网站将全部路由到包含文件中的第一个https服务器(根据文档,如果未显示“ default_server”,则出现的第一个服务器块将为“ default”)。
所以我的问题是,在Nginx中为SSL连接定义“默认服务器”的正确方法是什么?为什么当我显式设置“ default_server”时,它会变得贪婪并获取所有连接,而当我隐式地让nginx决定“ default server”时,它会像我期望的那样工作(将错误的服务器设置为default,其他真实服务器行为正确)?
这是我的“默认服务器”。Http的工作方式不会破坏其他服务器。Https破坏其他服务器并消耗所有服务器。
server {
listen 443 ssl default_server;
server_name _;
access_log /var/log/nginx/maintenance.access.log;
error_log /var/log/nginx/maintenance.error.log error;
return 444;
}
server {
listen *:80 default_server;
server_name _;
charset utf-8;
access_log /var/log/nginx/maintenance.access.log;
error_log /var/log/nginx/maintenance.error.log error;
root /home/path/to/templates;
location / {
return 503;
}
error_page 503 @maintenance;
location @maintenance {
rewrite ^(.*)$ /maintenance.html break;
}
}
你们中有人看到这里有什么问题吗?