使用NGINX同时作为Web主机并将子域名请求转发至Docker服务端口的配置方案咨询
NGINX同时作为Web主机并将子域名请求转发至Docker服务端口的配置方案咨询
兄弟我太懂你这种“明明觉得这事应该超简单却卡半天”的崩溃感了!之前折腾树莓派+NGINX+Docker子域名转发时我也踩了一堆坑,结合你的现有配置,给你一步步捋清楚怎么弄:
第一步:先搞定Cloudflare的DNS解析
首先得确保两个子域名能正确指向服务器:
- 登录Cloudflare域名管理后台,给
music.domain.tld和docker-admin.domain.tld各新增一条A记录,值填和主域名domain.tld一致的服务器公网IP,保持代理模式为开启状态(橙色云朵图标)。
第二步:修改NGINX配置
你现有的主域名配置已经跑通了,现在只需要新增子域名的转发规则就行。可以直接在/etc/nginx/sites-available/domain.tld里补充内容,也可以单独新建子域名配置文件(后者更清晰,不过两种方式都可行)。
先更新HTTP跳转规则(80端口)
把原来的80端口server块修改为覆盖主域名和子域名,确保所有HTTP请求都自动跳转到HTTPS:
server { listen 80; listen [::]:80; # 新增两个子域名到规则里 server_name domain.tld www.domain.tld music.domain.tld docker-admin.domain.tld; return 302 https://$server_name$request_uri; }
新增子域名的HTTPS转发规则
在现有443端口的主域名server块下方,分别添加两个独立的server块,对应两个Docker服务:
1. music.domain.tld的转发配置
server { listen 443 ssl http2; listen [::]:443 ssl http2; # 复用你已有的SSL证书(如果是Cloudflare的Origin CA证书,默认支持子域名;若为单域名证书,需要重新生成包含子域名的版本) ssl_certificate /etc/ssl/cert.pem; ssl_certificate_key /etc/ssl/key.pem; # 保留Cloudflare客户端验证,确保请求仅来自Cloudflare(和主域名配置保持一致) ssl_client_certificate /etc/ssl/cloudflare.crt; ssl_verify_client on; server_name music.domain.tld; # 核心:将请求转发到Docker服务的本地端口 location / { proxy_pass http://localhost:1000; # 必须添加这些HTTP头,否则Docker里的WebGUI可能出现样式错乱、登录失败或无法识别请求来源的问题 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; } }
2. docker-admin.domain.tld的转发配置
server { listen 443 ssl http2; listen [::]:443 ssl http2; ssl_certificate /etc/ssl/cert.pem; ssl_certificate_key /etc/ssl/key.pem; ssl_client_certificate /etc/ssl/cloudflare.crt; ssl_verify_client on; server_name docker-admin.domain.tld; location / { proxy_pass http://localhost:1001; # 同样添加必要的代理头 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; } }
第三步:验证配置并重启NGINX
修改完配置后,先检查语法是否正确:
sudo nginx -t
如果输出test is successful,就重启NGINX让配置生效:
sudo systemctl restart nginx
几个避坑提醒
- 确保你的Docker服务绑定的是
0.0.0.0:1000/0.0.0.0:1001(而非仅127.0.0.1),不过你说能通过服务器IP:端口访问,这点应该没问题。 - 如果出现证书错误,大概率是当前证书不包含子域名,去Cloudflare重新生成一个覆盖所有子域名的Origin CA证书即可。
- Cloudflare的SSL模式保持Full(严格),确保端到端加密正常运行。
备注:内容来源于stack exchange,提问作者Plankt0n




