Docker Nginx多项目部署指南:二级域名高效配置实践

Docker Nginx多项目部署指南:二级域名高效配置实践

一、引言:为何需要二级域名访问多项目?

在现代化Web开发中,企业或开发者常需同时运行多个Web项目(如前端应用、API服务、后台管理系统等)。若将所有项目部署在同一域名下,需通过路径(如/app1/app2)区分,这不仅增加路由复杂度,还可能引发SEO问题。而通过二级域名(如app1.example.comapp2.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

  1. FROM node:16-alpine
  2. WORKDIR /app
  3. COPY package*.json ./
  4. RUN npm install
  5. COPY . .
  6. EXPOSE 3000
  7. CMD ["npm", "start"]

此文件定义了项目镜像的构建步骤,包括安装依赖、复制代码、暴露端口及启动命令。

2. 构建并运行容器

  1. # 构建镜像
  2. docker build -t my-app .
  3. # 运行容器(示例)
  4. docker run -d --name app1 -p 3001:3000 my-app
  5. docker run -d --name app2 -p 3002:3000 my-app

此处将两个实例分别映射到宿主机的3001和3002端口,后续Nginx将通过这些端口访问容器。

关键点

  • 每个项目应使用独立的容器,避免端口冲突。
  • 若项目需持久化数据(如数据库),应使用-v参数挂载卷。

四、Nginx反向代理配置

1. 部署Nginx容器

  1. 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块:

  1. # app1.example.com 配置
  2. server {
  3. listen 80;
  4. server_name app1.example.com;
  5. location / {
  6. proxy_pass http://宿主机IP:3001; # 对应app1容器的映射端口
  7. proxy_set_header Host $host;
  8. proxy_set_header X-Real-IP $remote_addr;
  9. }
  10. }
  11. # app2.example.com 配置
  12. server {
  13. listen 80;
  14. server_name app2.example.com;
  15. location / {
  16. proxy_pass http://宿主机IP:3002; # 对应app2容器的映射端口
  17. proxy_set_header Host $host;
  18. proxy_set_header X-Real-IP $remote_addr;
  19. }
  20. }

关键配置说明

  • server_name:指定二级域名,需与DNS解析一致。
  • proxy_pass:将请求转发至对应容器的映射端口。
  • proxy_set_header:传递原始请求头,确保后端服务能获取真实客户端信息。

3. 启用HTTPS(可选)

若需HTTPS,需获取SSL证书(如Let’s Encrypt),并修改server块:

  1. server {
  2. listen 443 ssl;
  3. server_name app1.example.com;
  4. ssl_certificate /etc/nginx/certs/app1.example.com.crt;
  5. ssl_certificate_key /etc/nginx/certs/app1.example.com.key;
  6. location / {
  7. proxy_pass http://宿主机IP:3001;
  8. # 其他proxy配置...
  9. }
  10. }

五、DNS解析与测试验证

1. 配置DNS记录

在域名服务商处,为每个二级域名添加A记录,指向服务器公网IP。例如:

  • app1.example.com服务器IP
  • app2.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路径是否正确。

七、进阶优化建议

1. 使用Docker Compose管理多容器

编写docker-compose.yml,一键启动所有容器及Nginx:

  1. version: '3'
  2. services:
  3. app1:
  4. build: ./app1
  5. ports:
  6. - "3001:3000"
  7. app2:
  8. build: ./app2
  9. ports:
  10. - "3002:3000"
  11. nginx:
  12. image: nginx
  13. ports:
  14. - "80:80"
  15. - "443:443"
  16. volumes:
  17. - ./nginx.conf:/etc/nginx/nginx.conf
  18. - ./certs:/etc/nginx/certs
  19. depends_on:
  20. - app1
  21. - app2

2. 自动化证书续期

使用certbot配合Docker,定期更新Let’s Encrypt证书:

  1. docker run -it --rm --name certbot \
  2. -v "/path/to/certs:/etc/letsencrypt" \
  3. certbot/certbot renew --dry-run

3. 监控与日志收集

  • 使用docker logs 容器名查看容器日志。
  • 配置Nginx的access_logerror_log,集中存储至ELK等日志系统。

八、总结与最佳实践

通过Docker与Nginx的组合,可高效实现二级域名访问多个Web项目,关键步骤包括:

  1. 容器化部署各项目,确保端口隔离。
  2. 配置Nginx反向代理,精准路由二级域名请求。
  3. 完成DNS解析与HTTPS设置,保障安全性。
  4. 定期测试与监控,快速定位问题。

最佳实践

  • 使用环境变量管理配置(如ENV APP_PORT=3000)。
  • 编写自动化脚本(如deploy.sh)简化部署流程。
  • 定期备份Nginx配置与证书文件。

此方案适用于中小企业、开发团队及个人开发者,能显著提升多项目管理的效率与可靠性。