You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用NGINX同时作为Web主机并将子域名请求转发至Docker服务端口的配置方案咨询

NGINX同时作为Web主机并将子域名请求转发至Docker服务端口的配置方案咨询

兄弟我太懂你这种“明明觉得这事应该超简单却卡半天”的崩溃感了!之前折腾树莓派+NGINX+Docker子域名转发时我也踩了一堆坑,结合你的现有配置,给你一步步捋清楚怎么弄:

第一步:先搞定Cloudflare的DNS解析

首先得确保两个子域名能正确指向服务器:

  • 登录Cloudflare域名管理后台,给music.domain.tlddocker-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

火山引擎 最新活动