Docker Nginx多项目部署指南:二级域名高效配置实践
一、引言:为何需要二级域名访问多项目?
在现代化Web开发中,企业或开发者常需同时运行多个Web项目(如前端应用、API服务、后台管理系统等)。若将所有项目部署在同一域名下,需通过路径(如/app1、/app2)区分,这不仅增加路由复杂度,还可能引发SEO问题。而通过二级域名(如app1.example.com、app2.example.com)访问,可实现逻辑隔离、提升安全性,并简化权限管理。
结合Docker与Nginx的解决方案,能以容器化方式快速部署项目,并通过Nginx的反向代理功能,将不同二级域名的请求路由至对应容器。本文将详细阐述这一过程的实现步骤与关键配置。
二、环境准备与工具选择
1. 基础环境要求
- 服务器:Linux系统(推荐Ubuntu/CentOS),需具备公网IP或内网穿透能力。
- 域名:已注册主域名(如
example.com),并可在DNS服务商处配置二级域名解析。 - Docker:安装最新稳定版Docker引擎,用于容器化部署Web项目。
- Nginx:作为反向代理服务器,需安装Docker版或宿主机版Nginx(本文以Docker版为例)。
2. 工具选择理由
- Docker:提供轻量级、可移植的容器环境,避免项目间依赖冲突,简化部署流程。
- Nginx:高性能反向代理服务器,支持负载均衡、SSL终止、路径重写等功能,适合处理多域名路由。
三、项目容器化部署
1. 创建Dockerfile
以Node.js项目为例,编写Dockerfile:
FROM node:16-alpineWORKDIR /appCOPY package*.json ./RUN npm installCOPY . .EXPOSE 3000CMD ["npm", "start"]
此文件定义了项目镜像的构建步骤,包括安装依赖、复制代码、暴露端口及启动命令。
2. 构建并运行容器
# 构建镜像docker build -t my-app .# 运行容器(示例)docker run -d --name app1 -p 3001:3000 my-appdocker run -d --name app2 -p 3002:3000 my-app
此处将两个实例分别映射到宿主机的3001和3002端口,后续Nginx将通过这些端口访问容器。
关键点:
- 每个项目应使用独立的容器,避免端口冲突。
- 若项目需持久化数据(如数据库),应使用
-v参数挂载卷。
四、Nginx反向代理配置
1. 部署Nginx容器
docker run -d --name nginx-proxy -p 80:80 -p 443:443 -v /path/to/nginx.conf:/etc/nginx/nginx.conf -v /path/to/certs:/etc/nginx/certs nginx
-p 80:80 -p 443:443:映射HTTP/HTTPS端口。-v /path/to/nginx.conf:挂载自定义Nginx配置文件。-v /path/to/certs:挂载SSL证书目录(若需HTTPS)。
2. 配置二级域名路由
编辑nginx.conf,添加以下server块:
# app1.example.com 配置server {listen 80;server_name app1.example.com;location / {proxy_pass http://宿主机IP:3001; # 对应app1容器的映射端口proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}# app2.example.com 配置server {listen 80;server_name app2.example.com;location / {proxy_pass http://宿主机IP:3002; # 对应app2容器的映射端口proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}
关键配置说明:
server_name:指定二级域名,需与DNS解析一致。proxy_pass:将请求转发至对应容器的映射端口。proxy_set_header:传递原始请求头,确保后端服务能获取真实客户端信息。
3. 启用HTTPS(可选)
若需HTTPS,需获取SSL证书(如Let’s Encrypt),并修改server块:
server {listen 443 ssl;server_name app1.example.com;ssl_certificate /etc/nginx/certs/app1.example.com.crt;ssl_certificate_key /etc/nginx/certs/app1.example.com.key;location / {proxy_pass http://宿主机IP:3001;# 其他proxy配置...}}
五、DNS解析与测试验证
1. 配置DNS记录
在域名服务商处,为每个二级域名添加A记录,指向服务器公网IP。例如:
app1.example.com→服务器IPapp2.example.com→服务器IP
2. 测试访问
- 浏览器访问
http://app1.example.com,应显示app1项目内容。 - 访问
http://app2.example.com,应显示app2项目内容。 - 使用
curl -v http://app1.example.com检查HTTP头,确认Host字段正确传递。
六、常见问题与解决方案
1. 问题:Nginx报错“502 Bad Gateway”
- 原因:容器未运行或端口映射错误。
- 解决:
- 检查容器状态:
docker ps -a,确保目标容器处于Up状态。 - 验证端口映射:
docker port 容器名,确认宿主机端口与容器端口一致。
- 检查容器状态:
2. 问题:二级域名无法解析
- 原因:DNS记录未生效或缓存问题。
- 解决:
- 使用
nslookup app1.example.com检查解析结果。 - 等待DNS传播(通常几分钟至几小时),或更换DNS服务商测试。
- 使用
3. 问题:HTTPS证书不匹配
- 原因:证书域名与
server_name不一致。 - 解决:
- 重新生成证书,确保包含所有二级域名(如使用Let’s Encrypt的
--dns插件)。 - 检查Nginx配置中
ssl_certificate路径是否正确。
- 重新生成证书,确保包含所有二级域名(如使用Let’s Encrypt的
七、进阶优化建议
1. 使用Docker Compose管理多容器
编写docker-compose.yml,一键启动所有容器及Nginx:
version: '3'services:app1:build: ./app1ports:- "3001:3000"app2:build: ./app2ports:- "3002:3000"nginx:image: nginxports:- "80:80"- "443:443"volumes:- ./nginx.conf:/etc/nginx/nginx.conf- ./certs:/etc/nginx/certsdepends_on:- app1- app2
2. 自动化证书续期
使用certbot配合Docker,定期更新Let’s Encrypt证书:
docker run -it --rm --name certbot \-v "/path/to/certs:/etc/letsencrypt" \certbot/certbot renew --dry-run
3. 监控与日志收集
- 使用
docker logs 容器名查看容器日志。 - 配置Nginx的
access_log和error_log,集中存储至ELK等日志系统。
八、总结与最佳实践
通过Docker与Nginx的组合,可高效实现二级域名访问多个Web项目,关键步骤包括:
- 容器化部署各项目,确保端口隔离。
- 配置Nginx反向代理,精准路由二级域名请求。
- 完成DNS解析与HTTPS设置,保障安全性。
- 定期测试与监控,快速定位问题。
最佳实践:
- 使用环境变量管理配置(如
ENV APP_PORT=3000)。 - 编写自动化脚本(如
deploy.sh)简化部署流程。 - 定期备份Nginx配置与证书文件。
此方案适用于中小企业、开发团队及个人开发者,能显著提升多项目管理的效率与可靠性。