子域名映射服务器指定端口及同服务器多HTTPS子域名部署问题咨询
子域名映射服务器指定端口及同服务器多HTTPS子域名部署问题咨询
嘿,这个问题在多服务部署场景里太常见了,我给你几个生产环境中常用的靠谱解决方案,你可以根据自己的服务器环境来选:
方案一:用Nginx做反向代理(最通用的选择)
这是最经典的处理方式,让Nginx作为整个服务器的流量入口,帮你区分不同子域名的请求,同时统一管理HTTPS证书,完美解决443端口被占用的问题。
- 先调整Registry容器的端口:把原来直接监听443的Registry容器改成监听内部端口,比如5000(这个端口不用对外暴露,只在服务器内部访问就行)。
- 安装并配置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。
- 先在服务器上安装Nginx,Debian/Ubuntu系统用
- 证书自动管理:推荐用Let's Encrypt的certbot工具自动申请和续期免费SSL证书,运行
certbot --nginx跟着向导走,它会自动帮你配置好Nginx的SSL部分,省不少事。
方案二:用Traefik做容器化反向代理(适合全Docker环境)
如果你的pages服务也是跑在Docker容器里,那Traefik会更省心——它能自动发现Docker容器,自动申请和管理SSL证书,几乎不用手动写复杂配置。
- 部署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" - 修改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" - 部署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" - 启动服务:运行
docker-compose up -d,Traefik会自动完成证书申请和流量转发,你直接访问两个子域名就能正常使用了。
方案三:用Apache做反向代理(如果你熟悉Apache生态)
思路和Nginx一致,只是配置语法不同。先启用Apache的mod_proxy、mod_proxy_http、mod_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




