Ubuntu20.04下Nginx配置静态站点与Docker Spring Cloud站点共存
问题根因
当前两个站点无法共存的核心原因是宿主机Nginx和Docker部署的新站点前端服务同时抢占了80、443公网端口,同一时间同一端口只能被一个服务绑定。解决方案是统一使用宿主机Nginx作为公网流量入口,基于域名做请求分流,Docker内的新站点不再直接暴露公网端口,仅监听本地回环地址。
操作步骤
1. 调整新站点Docker Compose配置
修改docker-compose.yml中newsite-frontend服务的配置,移除公网端口映射,调整站点域名相关环境变量:
newsite-frontend: image: ........... container_name: newsite-frontend restart: always environment: - SERVER_NAME=new.mysite.cc - BACKEND_SERVER_HOST=${BACKEND_HOST:-172.20.0.5} - BACKEND_SERVER_PORT=${BACKEND_PORT:-6688} - USE_HTTPS=true ports: # 仅绑定本地回环地址的8081端口,映射到容器内部80端口,不对外暴露 - "127.0.0.1:8081:80" networks: newsite-network: ipv4_address: 172.20.0.6
其余服务(nacos、backend)的配置不需要改动,同Docker网络内的服务可以直接通过内部IP通信,不影响可用性。
修改完成后,在docker-compose.yml所在目录执行以下命令重启前端服务:
docker-compose up -d newsite-frontend
验证服务正常:在宿主机执行curl http://127.0.0.1:8081,能正常返回新站点首页内容即配置生效。
2. 为新域名申请SSL证书
提前将new.mysite.cc的DNS A记录解析到当前服务器的公网IP,解析生效后直接使用已有的Certbot工具申请证书:
certbot --nginx -d new.mysite.cc
按照提示操作即可,证书签发成功后会存放在/etc/letsencrypt/live/new.mysite.cc/目录下。
3. 调整宿主机Nginx配置
在原有Nginx配置的基础上,新增new.mysite.cc对应的流量转发规则,原有mysite.cc的配置完全不需要改动。
新增配置内容如下:
# HTTP请求统一跳转HTTPS server { listen 80; listen [::]:80; server_name new.mysite.cc; return 301 https://$host$request_uri; } # HTTPS站点配置 server { server_name new.mysite.cc; listen [::]:443 ssl ipv6only=on; listen 443 ssl; ssl_certificate /etc/letsencrypt/live/new.mysite.cc/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/new.mysite.cc/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # 转发前端请求到Docker内的前端服务 location / { proxy_pass http://127.0.0.1:8081; 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; # 如果站点用了WebSocket,添加以下三行配置 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } # 如果前端需要调用后端接口,放开以下配置,根据实际接口前缀调整location匹配规则 # location /api/ { # proxy_pass http://127.0.0.1:6688/; # 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; # } }
4. 验证并重载Nginx配置
执行以下命令测试Nginx配置语法是否正确:
nginx -t
返回syntax is ok和test is successful后,重载Nginx配置生效:
systemctl reload nginx
注意事项
- 服务器安全组/防火墙仅需对外开放80、443端口,8848(nacos)、6688(后端)、8081(本地前端)端口不要对公网开放,避免服务暴露带来安全风险。
- 如果后续需要新增其他二级域名,按照相同逻辑添加Nginx server块,Docker服务映射本地不冲突的端口即可。
内容的提问来源于stack exchange,提问作者xaero
相关产品推荐
相关产品推荐

