配置 nginx 以从单个服务器提供 HTTP 和 HTTPS 站点的麻烦

Posted

技术标签:

【中文标题】配置 nginx 以从单个服务器提供 HTTP 和 HTTPS 站点的麻烦【英文标题】:troubles configuring nginx to serve HTTP and HTTPS sites from a single server 【发布时间】:2019-05-20 09:29:33 【问题描述】:

我有一个服务器,托管的网站很少; 为了减少问题,我们假设它们只有两个:http://www.example-A.comhttps://www.example-B.com

站点 A 仅提供 HTTP 连接,而站点 B 拥有自己的 SSL 证书并提供安全连接。

我的配置文件如下所示(相关部分):

http

    server
    
        listen 80;

        server_name www.example-A.com;

        [...]
    

    server
    
        listen 80;
        server_name www.example-B.com;
        return 301 https://www.example-B.com$request_uri;
    

    server
    
        listen 443 ssl;

        ssl_certificate /usr/local/nginx/ssl/www.exampe-A.com.crt;
        ssl_certificate_key /usr/local/nginx/ssl/www.exampe-A.com.key;
        ssl_prefer_server_ciphers on;

        server_name www.example-B.com;

        [...]
    

现在,如果我连接到 http://www.example-A.com 一切正常。 连接到https://www.example-B.com 也按预期工作。 连接到http://www.example-B.com 会导致重定向到https://www.example-B.com

到目前为止一切顺利。

现在如果我尝试与A 建立安全连接,问题就会出现:https://www.example-A.com

我希望服务器拒绝连接。

我得到的是浏览器警告连接不安全。 当我继续时,我登陆域https://www.example-A.com,但提供www.example-B.com 的内容。

如果我添加到配置中

    server
    
        listen 443 ssl;

        server_name www.example-A.com;

        return 444;
    

然后尝试与A 的安全连接按预期失败。

但连接到https://www.example-B.com 也会失败。


我错过了什么?为什么不遵守server_name 指令?

如何在 HTTP 中提供 A,在 HTTPS 中提供 B 并阻止与 A 的不受支持的 HTTPS 连接?


我在跑步

$ nginx -V
nginx version: nginx/1.12.2
built with OpenSSL 1.1.0d  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local --sbin-path=/usr/local/sbin/nginx --conf-path=/usr/local/nginx/nginx.conf --with-http_ssl_module --with-http_stub_status_module --with-pcre=../pcre-8.37 --add-module=../headers-more-nginx-module-0.33

【问题讨论】:

【参考方案1】:

最佳实践是有一个default_server,如果主机名未知,该指令指定使用 this 服务器,您可以使用它作为一个包罗万象来处理任何主机名与您的 server_name 值不匹配。如果没有这个,第一台服务器将被视为默认服务器

例如

# 444 Close connection Without Response on requests without hostname
server 
    listen 80 default_server;
    listen 443 ssl default_server;
    server_name _;
    ssl_certificate /path/to/ssl/example.com.crt;
    ssl_certificate_key /path/to/ssl/example.com.key;
    return 444;

【讨论】:

如果我添加这个 server 块然后连接到 www.example-b.com 失败 您的重定向应该包含.com 对吧?即https://www.example-b.com$request_uri;

以上是关于配置 nginx 以从单个服务器提供 HTTP 和 HTTPS 站点的麻烦的主要内容,如果未能解决你的问题,请参考以下文章

指定“WITH NAME”以从单个测试用例访问多个机器人框架远程服务器的正确方法是啥?

网站nginx配置限制单个IP访问频率,预防DDOS恶意攻击

Nginx配置http和tcp

如何配置 Apache localhost 服务器以从其他计算机访问它

Nginx优化与防盗链

深入浅出学习透析Nginx服务器的基本原理和配置指南「Keepalive性能分析实战篇」