简介:本文详细介绍了如何使用Docker与Nginx实现HTTPS二级域名无端口访问多个Web项目,涵盖配置要点、证书管理及负载均衡策略,适合开发者及运维人员参考。
在微服务架构和DevOps普及的今天,开发者常需在同一服务器上部署多个Web项目(如前端应用、API服务、管理后台等)。传统方案中,每个项目需绑定不同端口(如8080、8081),用户需手动输入端口号访问,体验差且易出错。通过Docker容器化与Nginx反向代理结合,可实现:
project1.example.com、project2.example.com直接访问,无需记忆端口。Docker将每个Web项目打包为独立容器,通过docker-compose.yml定义服务依赖和网络配置。例如:
version: '3'services:project1:image: nginx:alpinevolumes:- ./project1/dist:/usr/share/nginx/htmlnetworks:- web_networkproject2:image: node:alpinecommand: npm startvolumes:- ./project2:/appnetworks:- web_networknetworks:web_network:driver: bridge
Nginx作为反向代理服务器,接收外部请求后根据域名路由至对应容器。关键配置包括:
server_name:匹配二级域名(如project1.example.com)。proxy_pass:指向Docker容器内部端口(如http://project1:80)。需在DNS服务商(如阿里云、Cloudflare)配置CNAME记录,将*.example.com指向服务器公网IP。
curl -fsSL https://get.docker.com | shsudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-composesudo chmod +x /usr/local/bin/docker-compose
sudo apt install certbot python3-certbot-nginxsudo certbot certonly --manual --preferred-challenges dns -d *.example.com
创建nginx.conf文件,定义多个server块:
http {server {listen 443 ssl;server_name project1.example.com;ssl_certificate /etc/nginx/ssl/fullchain.pem;ssl_certificate_key /etc/nginx/ssl/privkey.pem;location / {proxy_pass http://project1:80;proxy_set_header Host $host;}}server {listen 443 ssl;server_name project2.example.com;ssl_certificate /etc/nginx/ssl/fullchain.pem;ssl_certificate_key /etc/nginx/ssl/privkey.pem;location / {proxy_pass http://project2:3000;proxy_set_header Host $host;}}}
通过Docker卷挂载证书与配置:
services:nginx:image: nginx:alpineports:- "443:443"volumes:- ./nginx.conf:/etc/nginx/nginx.conf- /etc/letsencrypt/live/example.com:/etc/nginx/ssldepends_on:- project1- project2
docker-compose up -dcurl -I https://project1.example.com # 应返回200状态码
配置Certbot定时任务:
(crontab -l 2>/dev/null; echo "0 3 * * * /usr/bin/certbot renew --quiet") | crontab -
对高并发项目,可配置Nginx上游模块:
upstream project1_servers {server project1:80 weight=3;server project1_backup:80 backup;}
dig project1.example.com验证。通过docker-compose.override.yml区分开发、测试、生产环境:
# docker-compose.override.ymlservices:project1:environment:- NODE_ENV=developmentports:- "8080:80" # 开发环境暴露端口
在GitLab CI或Jenkins中添加步骤:
deploy:stage: deployscript:- docker-compose build- docker-compose up -donly:- master
通过Docker与Nginx的组合,开发者可高效实现二级域名无端口访问多个Web项目,核心步骤包括:
建议:
auth_basic或JWT验证。此方案适用于中小型团队快速部署多项目,兼顾安全性与可维护性,是现代Web架构的优选实践之一。