Docker Nginx部署二级域名:多Web项目高效访问指南

一、背景与需求分析

在现代化Web开发中,单个服务器往往需要托管多个Web项目(如前端应用、API服务、后台管理系统等)。传统方式通过端口号区分项目(如http://domain.com:8080)存在以下问题:

  1. 用户体验差:用户需记忆复杂端口,违背简洁性原则。
  2. SEO不友好:搜索引擎对非标准端口URL的收录优先级较低。
  3. 维护成本高:项目增减需手动修改端口映射,易出错。

解决方案:通过二级域名(如app1.domain.comapi.domain.com)实现项目隔离,结合Docker容器化与Nginx反向代理,可高效解决上述问题。

二、技术选型与原理

1. Docker容器化优势

  • 隔离性:每个项目运行在独立容器中,避免依赖冲突。
  • 可移植性:镜像打包环境,确保跨平台一致性。
  • 资源控制:通过--memory--cpus限制资源使用。

2. Nginx反向代理原理

Nginx作为反向代理服务器,接收来自二级域名的请求,根据server_name匹配规则将请求转发至对应Docker容器的端口。例如:

  • 请求app1.domain.com → 转发至容器app1的80端口。
  • 请求api.domain.com → 转发至容器api的3000端口。

三、实施步骤详解

1. 环境准备

  • 域名配置:在DNS服务商处添加二级域名解析,指向服务器IP。
    1. # 示例:添加两条A记录
    2. app1.domain.com 服务器IP
    3. api.domain.com 服务器IP
  • Docker安装
    1. # Ubuntu示例
    2. curl -fsSL https://get.docker.com | sh
    3. systemctl enable docker
  • Nginx容器部署
    1. docker run -d --name nginx-proxy \
    2. -p 80:80 -p 443:443 \
    3. -v /etc/nginx/conf.d:/etc/nginx/conf.d \
    4. -v /etc/nginx/certs:/etc/nginx/certs \
    5. nginx:latest

2. 项目容器化

以Node.js项目为例,创建Dockerfile

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

构建并运行容器:

  1. docker build -t app1 .
  2. docker run -d --name app1 -e PORT=3000 app1

3. Nginx配置二级域名

创建/etc/nginx/conf.d/app1.conf

  1. server {
  2. listen 80;
  3. server_name app1.domain.com;
  4. location / {
  5. proxy_pass http://localhost:3000; # 容器内部端口
  6. proxy_set_header Host $host;
  7. proxy_set_header X-Real-IP $remote_addr;
  8. }
  9. }

关键点

  • server_name必须与DNS解析的二级域名一致。
  • proxy_pass指向容器暴露的端口(非宿主机端口)。

4. 多项目配置示例

若需部署api.domain.com指向另一个容器,新增配置文件api.conf

  1. server {
  2. listen 80;
  3. server_name api.domain.com;
  4. location / {
  5. proxy_pass http://localhost:8080; # 假设API容器暴露8080
  6. proxy_set_header Host $host;
  7. }
  8. }

重启Nginx生效:

  1. docker exec nginx-proxy nginx -s reload

四、常见问题与解决方案

1. 域名不生效

  • 检查DNS解析:使用dig app1.domain.com确认A记录指向正确。
  • Nginx配置错误:通过nginx -t验证语法,检查server_name拼写。

2. 502 Bad Gateway

  • 容器未运行:执行docker ps确认目标容器状态为Up
  • 端口冲突:确保宿主机端口未被占用(如80、443)。

3. HTTPS配置

生成SSL证书(以Let’s Encrypt为例):

  1. docker run -it --rm --name certbot \
  2. -v "/etc/letsencrypt:/etc/letsencrypt" \
  3. -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
  4. certbot/certbot certonly --standalone -d app1.domain.com -d api.domain.com

修改Nginx配置启用HTTPS:

  1. server {
  2. listen 443 ssl;
  3. server_name app1.domain.com;
  4. ssl_certificate /etc/nginx/certs/fullchain.pem;
  5. ssl_certificate_key /etc/nginx/certs/privkey.pem;
  6. location / {
  7. proxy_pass http://localhost:3000;
  8. }
  9. }

五、优化建议

  1. 自动化部署:使用docker-compose管理多容器,示例docker-compose.yml
    1. version: '3'
    2. services:
    3. app1:
    4. image: app1
    5. expose:
    6. - "3000"
    7. nginx:
    8. image: nginx
    9. ports:
    10. - "80:80"
    11. - "443:443"
    12. volumes:
    13. - ./nginx.conf:/etc/nginx/nginx.conf
  2. 负载均衡:对高流量项目,在Nginx中配置upstream模块实现多容器负载均衡。
  3. 健康检查:在Nginx中添加health_check模块,自动剔除故障容器。

六、总结

通过Docker容器化与Nginx反向代理的结合,可实现二级域名对多Web项目的高效管理。核心步骤包括:

  1. 配置DNS二级域名解析。
  2. 容器化各Web项目并暴露端口。
  3. 编写Nginx配置文件匹配域名与容器端口。
  4. 解决常见问题并优化部署流程。

此方案显著提升了项目可维护性与用户体验,适用于中小型团队的多项目托管需求。