![nginx两个站点配置冲突](https://linux22.com/image/1452556/nginx%E4%B8%A4%E4%B8%AA%E7%AB%99%E7%82%B9%E9%85%8D%E7%BD%AE%E5%86%B2%E7%AA%81.png)
我为我的一个域配置了 nginx。它作为 Wildfly 应用服务器的前端。有一天,我决定在同一台机器上配置 beta 测试环境。所以我将另一个子域添加到配置中。重启后,nginx 停止为第一个应用程序提供服务。我的配置文件是:
主要子域名:
server {
listen 80;
server_name sub.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443;
server_name sub.example.com;
ssl_certificate /etc/nginx/ssl/bundle.crt;
ssl_certificate_key /etc/nginx/ssl/sub.example.com.key;
ssl on;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/sub.example.com.access.log;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://localhost:8080;
proxy_read_timeout 90;
}
}
测试子域名:
server {
listen 443;
server_name sub-test.example.com;
return 301 http://$host$request_uri;
}
server {
listen 80;
server_name sub-test.example.com;
access_log /var/log/nginx/sub-test.example.com.access.log;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://localhost:8080;
proxy_read_timeout 90;
}
}
我需要补充的是,上述每个配置单独使用时都能按预期工作。但它们放在一起时效果并不好。请求其中第一个配置会返回 NOT FOUND HTTP 状态。
当然,问题可能出在我的 Wildfly 服务器上。它配置为处理虚拟主机,我不确定它是否正常。但是当两个应用程序都运行并且只有其中一个由 nginx 代理时,它运行正常。
感谢帮助。
答案1
Patryk,很遗憾,您无法设置多个基于名称的 HTTPS 服务器。解释很长,但您可以检查一下这里了解一些深入的信息和例子(基于 apache,对 nginx 不了解)
答案2
您可以使用多个 https 站点。
这项技术被称为 SNI,即服务器名称指示。参考
通过将 SSL 部分移出服务器配置,您还可以减少配置证书的麻烦。我在反向代理上使用以下结构:
sites.d/ | -ssl.conf | -vhost1.conf | -vhost2.conf
ssl.conf 包含:
ssl_certificate /etc/ssl/certs/ssl.crt; ssl_certificate_key /etc/ssl/certs/server.key;
另一种选择是使用具有不同通用名称的单独证书。