Docker环境下Nginx反向代理多域名配置:同服务多域名访问需求
实现双域名指向同一后端且地址栏保持原域名的Nginx配置方案
完全可以实现你的需求,以下是具体的配置调整方案和关键说明:
核心配置思路
- 用一个通用命名的
upstream块统一指向后端服务,避免和域名绑定 - 通过
server_name同时指定两个域名,或复制独立server块分别对应域名 - 关键配置
proxy_set_header Host $host,确保后端接收原始请求域名,同时地址栏不会跳转
方案一:单server块适配双域名(配置简洁,适合无差异化需求)
# 重命名upstream为通用名称,避免和域名绑定 upstream panels-backend { server 172.20.1.100:3000; } server { # 同时指定两个需要匹配的域名 server_name panels-cliente1.company.com panels-cliente2.company.com; listen 443 ssl http2 ; access_log /var/log/nginx/access.log vhost; # 文件上传限制 client_max_body_size 50M; ssl_session_timeout 5m; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; # 注意:SSL证书必须包含两个域名的SAN(Subject Alternative Name),否则浏览器会报安全错误 ssl_certificate /etc/nginx/certs/cert.crt; ssl_certificate_key /etc/nginx/certs/cert.key; add_header Strict-Transport-Security "max-age=31536000" always; location / { proxy_pass http://panels-backend; # 核心配置:保留原始请求的Host头,确保地址栏显示用户输入的域名,同时后端能识别请求来源 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跳转HTTPS的配置,同样适配双域名 server { server_name panels-cliente1.company.com panels-cliente2.company.com; listen 80; return 301 https://$host$request_uri; }
方案二:双server块分别配置(灵活度高,适合后续差异化需求)
如果后续需要给两个域名配置不同的日志路径、自定义响应头等,可以复制独立的server块:
upstream panels-backend { server 172.20.1.100:3000; } # 第一个域名专属配置 server { server_name panels-cliente1.company.com; listen 443 ssl http2 ; access_log /var/log/nginx/client1-access.log vhost; client_max_body_size 50M; ssl_session_timeout 5m; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_certificate /etc/nginx/certs/cert.crt; ssl_certificate_key /etc/nginx/certs/cert.key; add_header Strict-Transport-Security "max-age=31536000" always; location / { proxy_pass http://panels-backend; 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; } } # 第二个域名专属配置 server { server_name panels-cliente2.company.com; listen 443 ssl http2 ; access_log /var/log/nginx/client2-access.log vhost; client_max_body_size 50M; ssl_session_timeout 5m; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_certificate /etc/nginx/certs/cert.crt; ssl_certificate_key /etc/nginx/certs/cert.key; add_header Strict-Transport-Security "max-age=31536000" always; location / { proxy_pass http://panels-backend; 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跳转HTTPS配置 server { server_name panels-cliente1.company.com panels-cliente2.company.com; listen 80; return 301 https://$host$request_uri; }
关键注意事项
- SSL证书兼容性:必须确保你的SSL证书包含两个域名的SAN扩展,否则HTTPS访问会被浏览器拦截。如果当前证书只包含单个域名,需要重新申请覆盖双域名的证书。
- DNS解析:确认两个域名的DNS记录都指向Nginx反向代理容器所在的服务器IP。
- 配置重载:修改配置后,需要在Docker容器内执行
nginx -s reload命令使配置生效。
内容的提问来源于stack exchange,提问作者Sebastian Pacheco
相关产品推荐
相关产品推荐

