Nginx不同子域名代理至对应后端服务的配置问题
解决Nginx域名转发错误的问题
嘿,我来帮你捋捋这个Nginx配置的问题!你现在遇到的所有域名都跳转到3000端口的情况,核心原因出在HTTP跳转规则的覆盖和缺少HTTPS版的dashboard服务器配置上,咱们一步步来修正:
问题分析
你的第一个server块监听80端口,把example.com、www.example.com和dashboard.example.com都包含进去了——只要访问这些域名的HTTP版本,都会被强制跳转到HTTPS。但你只配置了example.com的HTTPS server块,没有为dashboard.example.com配置对应的HTTPS规则,所以当dashboard.example.com跳转到HTTPS后,Nginx找不到匹配的server,就会默认使用第一个匹配到的HTTPS server(也就是指向3000端口的用户服务),自然所有请求都跑到用户端去了。另外,你第二个监听80的dashboard server块根本不会被触发,因为第一个server块已经精确匹配了dashboard.example.com的HTTP请求。
修正后的完整配置
把配置改成这样,就能实现你想要的效果:
# 处理用户域名的HTTP跳转,强制转到HTTPS server { listen 80; listen [::]:80; server_name example.com www.example.com; return 302 https://$server_name$request_uri; } # 单独处理dashboard域名的HTTP跳转 server { listen 80; listen [::]:80; server_name dashboard.example.com; return 302 https://$server_name$request_uri; } # 普通用户服务的HTTPS配置 server { listen 443 ssl http2; listen [::]:443 ssl http2; ssl_certificate /etc/ssl/cert.pem; ssl_certificate_key /etc/ssl/key.pem; server_name example.com www.example.com; location / { proxy_pass http://localhost:3000; # 添加必要的代理头部,让Express应用获取正确的客户端信息 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; } } # 管理员服务的HTTPS配置(关键!之前缺失的部分) server { listen 443 ssl http2; listen [::]:443 ssl http2; ssl_certificate /etc/ssl/cert.pem; ssl_certificate_key /etc/ssl/key.pem; server_name dashboard.example.com; location / { proxy_pass http://localhost:3001; # 同样添加代理头部 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; } }
关键改动说明
- 拆分了原来的HTTP跳转server块,让用户域名和dashboard域名的HTTP请求分别处理,避免互相干扰。
- 新增了
dashboard.example.com的HTTPS server块,专门转发到3001端口,这样HTTPS请求就能正确匹配到管理员服务了。 - 额外添加了几个常用的
proxy_set_header配置,这能让你的Express应用获取到正确的客户端真实IP、请求协议等信息,很多业务逻辑都会依赖这些数据。
配置改完后,记得重启Nginx让配置生效:
sudo nginx -s reload
内容的提问来源于stack exchange,提问作者Vizious Developer
相关产品推荐
相关产品推荐

