佛系代理服务器 Nginx

Nginx 有一个我特别难以理解的地方:当 HTTPS 找不到指定的 Host 或者浏览器不支持 SNI 的时候,会返回第一个网站的证书和内容…这种处理方式可以说是非常佛系了,我完全找不到这样设计的理由。

实际上,Nginx 有一个 default server 的概念。也就是说当出现不支持 SNI 协议的客户端时,将使用 default server 的配置进行验证。当没有配置default server的时候,Nginx才会使用找到的第一个配置文件中的配置(如果是conf文件夹的话,应该是按照文件名字母顺序排序的)。

个人认为,如果没有匹配的 virtual server,Nginx 应该选择落空而不是使用找到的第一个配置文件中的配置。很难想象什么情况下会有『如果找不到就返回第一个网站』这样的需求。

Nginx 这样的设计导致了如果想要让他 work properly,必须自己生成一个自签证书而不能直接在default serverssl off


Here is the configuration to work properly:

http{
    ......

    server{
    listen *:80 default_server;
    listen [::]:80 default_server ipv6only=on;
    listen *:443 default_server ssl;
    listen [::]:443 default_server ssl ipv6only=on;

    ssl_certificate      /wwwroot/ssl/default/default.crt;
    ssl_certificate_key  /wwwroot/ssl/default/default.key;

    server_name _;

    access_log  /wwwroot/wwwlogs/default.access.log combined;

    return 444;
    }

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

几点说明:

  • return 444 比较关键,最好别换成别的;
  • 也可以把default server配置写在文件里,不过就需要像文章说的那样,文件名之前加上00,来保证最先加载;
  • 自签名证书不可少;

Source: