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

子域名映射服务器指定端口及同服务器多HTTPS子域名部署问题咨询

子域名映射服务器指定端口及同服务器多HTTPS子域名部署问题咨询

嘿,这个问题在多服务部署场景里太常见了,我给你几个生产环境中常用的靠谱解决方案,你可以根据自己的服务器环境来选:

方案一:用Nginx做反向代理(最通用的选择)

这是最经典的处理方式,让Nginx作为整个服务器的流量入口,帮你区分不同子域名的请求,同时统一管理HTTPS证书,完美解决443端口被占用的问题。

  1. 先调整Registry容器的端口:把原来直接监听443的Registry容器改成监听内部端口,比如5000(这个端口不用对外暴露,只在服务器内部访问就行)。
  2. 安装并配置Nginx
    • 先在服务器上安装Nginx,Debian/Ubuntu系统用apt install nginx,CentOS/RHEL用yum install nginx
    • 进入Nginx的配置目录(比如/etc/nginx/sites-available/),新建两个虚拟主机配置文件,分别对应两个子域名:
      • 针对registry.mywebsite.com的配置:
        server {
            listen 443 ssl;
            server_name registry.mywebsite.com;
        
            # 替换成你的SSL证书路径
            ssl_certificate /path/to/your/registry-cert.crt;
            ssl_certificate_key /path/to/your/registry-cert.key;
        
            # 将请求转发到Registry容器的内部端口
            location / {
                proxy_pass http://localhost:5000;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
            }
        }
        
      • 针对pages.mywebsite.com的配置:
        server {
            listen 443 ssl;
            server_name pages.mywebsite.com;
        
            ssl_certificate /path/to/your/pages-cert.crt;
            ssl_certificate_key /path/to/your/pages-cert.key;
        
            # 如果是静态页面服务,直接指定文件根目录
            location / {
                root /var/www/pages-static;
                index index.html index.htm;
            }
            # 如果是其他动态服务,就转发到对应的内部端口,比如:
            # location / {
            #     proxy_pass http://localhost:8080;
            #     proxy_set_header Host $host;
            # }
        }
        
    • 把这两个配置文件软链接到sites-enabled目录,然后重启Nginx生效:systemctl restart nginx
  3. 证书自动管理:推荐用Let's Encrypt的certbot工具自动申请和续期免费SSL证书,运行certbot --nginx跟着向导走,它会自动帮你配置好Nginx的SSL部分,省不少事。

方案二:用Traefik做容器化反向代理(适合全Docker环境)

如果你的pages服务也是跑在Docker容器里,那Traefik会更省心——它能自动发现Docker容器,自动申请和管理SSL证书,几乎不用手动写复杂配置。

  1. 部署Traefik:创建一个docker-compose.yml文件,配置Traefik作为流量入口:
    version: '3'
    services:
      traefik:
        image: traefik:v2.9
        command:
          - "--providers.docker=true"
          - "--providers.docker.exposedbydefault=false"
          - "--entrypoints.web.address=:80"
          - "--entrypoints.websecure.address=:443"
          - "--certificatesresolvers.my-acme-resolver.acme.httpchallenge=true"
          - "--certificatesresolvers.my-acme-resolver.acme.httpchallenge.entrypoint=web"
          - "--certificatesresolvers.my-acme-resolver.acme.email=your-email@mywebsite.com"
          - "--certificatesresolvers.my-acme-resolver.acme.storage=/letsencrypt/acme.json"
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - "/var/run/docker.sock:/var/run/docker.sock:ro"
          - "./letsencrypt:/letsencrypt"
    
  2. 修改Registry容器配置:给Registry容器加上Traefik标签,让它被自动识别:
    services:
      registry:
        image: registry:2
        labels:
          - "traefik.enable=true"
          - "traefik.http.routers.registry.rule=Host(`registry.mywebsite.com`)"
          - "traefik.http.routers.registry.entrypoints=websecure"
          - "traefik.http.routers.registry.tls.certresolver=my-acme-resolver"
    
  3. 部署Pages容器:同样给Pages容器加标签,比如用Nginx容器跑静态页面:
    services:
      pages:
        image: nginx:alpine
        volumes:
          - ./pages-content:/usr/share/nginx/html
        labels:
          - "traefik.enable=true"
          - "traefik.http.routers.pages.rule=Host(`pages.mywebsite.com`)"
          - "traefik.http.routers.pages.entrypoints=websecure"
          - "traefik.http.routers.pages.tls.certresolver=my-acme-resolver"
    
  4. 启动服务:运行docker-compose up -d,Traefik会自动完成证书申请和流量转发,你直接访问两个子域名就能正常使用了。

方案三:用Apache做反向代理(如果你熟悉Apache生态)

思路和Nginx一致,只是配置语法不同。先启用Apache的mod_proxymod_proxy_httpmod_ssl模块,然后配置虚拟主机:

<VirtualHost *:443>
    ServerName registry.mywebsite.com
    SSLEngine on
    SSLCertificateFile /path/to/registry-cert.crt
    SSLCertificateKeyFile /path/to/registry-cert.key

    ProxyPass / http://localhost:5000/
    ProxyPassReverse / http://localhost:5000/
</VirtualHost>

<VirtualHost *:443>
    ServerName pages.mywebsite.com
    SSLEngine on
    SSLCertificateFile /path/to/pages-cert.crt
    SSLCertificateKeyFile /path/to/pages-cert.key

    # 静态页面服务配置
    DocumentRoot /var/www/pages
    DirectoryIndex index.html
</VirtualHost>

配置完成后重启Apache服务即可。

总结一下:如果是混合环境(既有Docker又有非Docker服务),Nginx是最灵活的选择;如果全是Docker服务,Traefik能帮你省很多配置功夫。

备注:内容来源于stack exchange,提问作者naraghi

火山引擎 最新活动