我在服务器上有两个网站,每个网站在 Nginx 中都有自己的 vhost 文件。两个网站也都在 Cloudflare 上,并且都拥有我通过 Let's Encrypt 获得的 SSL 证书。
两个站点的 vhosts 文件如下:
server {
server_name domain.co.uk www.domain.co.uk;
listen 80;
listen domain.co.uk:80;
return 301 https://$http_host$request_uri;
// ...
}
server {
server_name domain.co.uk www.domain.co.uk;
listen 443;
listen domain.co.uk:443;
// ...
}
我发现,如果我在浏览器中请求第二个网站,有时它会显示第一个网站。这是因为通用listen [port];
行吗?
此外,如果我发出 SSL 请求,浏览器会因主机名不匹配而引发安全警告,因为它试图显示第一个域的 SSL 证书。
我发现如果我退出listen 80;
或者listen 443;
Nginx 就会发脾气,因为 Cloudflare 的 IP 是动态的,并且与线路不匹配listen [host]:443;
。
我不确定我是否从根本上不了解 Nginx 以及它的工作原理。
答案1
消除
listen domain.co.uk:80;
这是我的一个配置的开始
server_name www.example.com;
listen 443 ssl http2;
ssl_certificate /var/lib/acme/certs/***CERT_DIRECTORY/fullchain;
ssl_certificate_key /var/lib/acme/certs/***CERT_DIRECTORY/privkey;
# Set up preferred protocols and ciphers. TLS1.2 is required for HTTP/2
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;
# This is a cache for SSL connections
ssl_session_cache shared:SSL:2m;
ssl_session_timeout 60m;
我有另一台端口 80 的服务器,它只是转发到 SSL 服务器。教程在这里。