nginx 一个服务器块用于域,另一个服务器块用于同一服务器的IP

wvyml7n5  于 2023-03-17  发布在  Nginx
关注(0)|答案(1)|浏览(174)

我使用nodejs和nginx作为我的反向代理,在我的nginx配置中有一个服务器块,当客户端通过域名访问我的网站时,它会被锁定:

server {
     root /var/www/html;
     index index.html index.htm index.nginx-debian.html;
     server_name example.com, www.example.com;

     location / {
            proxy_pass http://localhost:6000;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

 listen [::]:443 ssl http2 ipv6only=on;
 listen 443 ssl http2;
 ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
 include /etc/letsencrypt/options-ssl-nginx.conf;
 ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

server {
     if ($host = www.example.com) {
          return 301 https://$host$request_uri;
     }  

    listen 80 default_server;
    listen [::]:80 default_server;

    server_name example.com, www.example.com;
    return 404;

}

所以上面的配置工作正常,但是有时候我需要通过IP地址连接到远程nodejs服务器上的一个端点,我想安全地完成这一操作,所以我在远程服务器上创建了一个自签名证书,并添加了另一个服务器块,如下所示:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name 149.154.150.134;

    ssl_certificate /path/to/cert/fullchain.pem;
    ssl_certificate_key /path/to/cert/privkey.pem;

    location / {
            allow 214.107.49.66;
            deny all;
    }

}
但nginx似乎总是发出let's encrypt证书,即使我尝试通过IP地址访问服务器时也是如此。

openssl s_client -connect 149.154.150.134:443
brvekthn

brvekthn1#

Nginx使用Server Name Indication(SNI),当这些块共享相同的IP地址和端口时,通过server_name选择适当的server块。
要使用带有SNI的openssl s_client测试服务器,需要使用-servername参数提供服务器名称。
例如:

openssl s_client -connect 192.0.2.1:443 -servername 192.0.2.1

在没有-servername参数的情况下,Nginx会将请求定向到默认服务器,默认服务器将是您配置中第一个带有正确listen指令的server块,或者是显式标记了default_server选项的server块。
此外,请注意server_name指令接受以空格分隔的主机名列表-而不是逗号分隔。例如:

server_name example.com www.example.com;

相关问题