Docker多项目二级域名部署指南:Nginx容器化配置实战

Docker与Nginx部署二级域名访问多Web项目的实践指南

一、技术背景与需求分析

在现代化Web应用架构中,单一服务器承载多个项目已成为常见需求。通过二级域名(如project1.example.comproject2.example.com)实现项目隔离,不仅能提升系统可维护性,还能增强安全性。传统部署方式需手动配置虚拟主机,而Docker容器化技术结合Nginx的反向代理能力,可实现自动化、可复用的部署方案。

核心优势

  1. 环境隔离:每个项目运行在独立容器中,避免依赖冲突
  2. 动态扩展:通过Docker Compose快速增减服务实例
  3. 统一管理:Nginx容器集中处理路由、负载均衡和SSL证书
  4. 快速回滚:容器镜像版本控制支持快速环境恢复

二、部署架构设计

2.1 网络拓扑结构

  1. [客户端] [Nginx容器] [多个Web项目容器]
  2. ├─ project1.example.com 项目1容器(8080端口)
  3. ├─ project2.example.com 项目2容器(8081端口)
  4. └─ static.example.com 静态资源容器(8082端口)

2.2 关键组件说明

  • Nginx容器:作为反向代理服务器,处理域名路由和SSL终止
  • Web项目容器:每个项目独立容器,暴露特定端口
  • Docker网络:自定义网络实现容器间通信

三、详细部署步骤

3.1 环境准备

  1. # 安装必要工具
  2. sudo apt install docker.io docker-compose nginx -y
  3. # 创建项目目录结构
  4. mkdir -p ~/docker-nginx-multidomain/{nginx/conf.d,projects/project{1..3}}

3.2 配置Nginx容器

3.2.1 创建自定义Nginx镜像(可选)

  1. # ~/docker-nginx-multidomain/nginx/Dockerfile
  2. FROM nginx:alpine
  3. RUN apk add --no-cache certbot openssl
  4. COPY conf.d/ /etc/nginx/conf.d/

3.2.2 基础配置模板

  1. # ~/docker-nginx-multidomain/nginx/conf.d/default.conf
  2. server {
  3. listen 80;
  4. server_name project1.example.com;
  5. location / {
  6. proxy_pass http://project1:8080;
  7. proxy_set_header Host $host;
  8. proxy_set_header X-Real-IP $remote_addr;
  9. }
  10. }
  11. server {
  12. listen 80;
  13. server_name project2.example.com;
  14. location / {
  15. proxy_pass http://project2:8081;
  16. # 其他代理配置...
  17. }
  18. }

3.3 Docker Compose编排

  1. # ~/docker-nginx-multidomain/docker-compose.yml
  2. version: '3.8'
  3. networks:
  4. webnet:
  5. driver: bridge
  6. services:
  7. nginx-proxy:
  8. image: nginx:alpine
  9. ports:
  10. - "80:80"
  11. - "443:443"
  12. volumes:
  13. - ./nginx/conf.d:/etc/nginx/conf.d
  14. - ./nginx/certs:/etc/nginx/certs
  15. networks:
  16. - webnet
  17. depends_on:
  18. - project1
  19. - project2
  20. project1:
  21. build: ./projects/project1
  22. expose:
  23. - "8080"
  24. networks:
  25. - webnet
  26. project2:
  27. image: node:alpine
  28. command: sh -c "cd /app && npm install && npm start"
  29. working_dir: /app
  30. volumes:
  31. - ./projects/project2:/app
  32. expose:
  33. - "8081"
  34. networks:
  35. - webnet

3.4 项目容器配置示例

3.4.1 Python Flask项目

  1. # ~/docker-nginx-multidomain/projects/project1/Dockerfile
  2. FROM python:3.9-slim
  3. WORKDIR /app
  4. COPY requirements.txt .
  5. RUN pip install -r requirements.txt
  6. COPY . .
  7. CMD ["gunicorn", "--bind", "0.0.0.0:8080", "app:app"]

3.4.2 Node.js Express项目

  1. // ~/docker-nginx-multidomain/projects/project2/server.js
  2. const express = require('express');
  3. const app = express();
  4. app.get('/', (req, res) => {
  5. res.send('Project 2 Home Page');
  6. });
  7. app.listen(8081, () => {
  8. console.log('Project 2 running on port 8081');
  9. });

四、高级配置技巧

4.1 SSL证书自动化

使用Certbot容器实现Let’s Encrypt证书自动续期:

  1. # 在docker-compose.yml中添加
  2. certbot:
  3. image: certbot/certbot
  4. volumes:
  5. - ./nginx/certs:/etc/letsencrypt
  6. command: certonly --webroot --webroot-path=/var/www/html -d project1.example.com -d project2.example.com --agree-tos --no-eff-email --email admin@example.com

4.2 负载均衡配置

  1. upstream project1_servers {
  2. server project1_1:8080 weight=3;
  3. server project1_2:8080;
  4. }
  5. server {
  6. listen 80;
  7. server_name project1.example.com;
  8. location / {
  9. proxy_pass http://project1_servers;
  10. # 其他配置...
  11. }
  12. }

4.3 安全加固方案

  1. 限制访问

    1. server {
    2. # 只允许特定IP访问管理后台
    3. allow 192.168.1.0/24;
    4. deny all;
    5. }
  2. HTTP安全头

    1. add_header X-Content-Type-Options "nosniff";
    2. add_header X-Frame-Options "SAMEORIGIN";
    3. add_header X-XSS-Protection "1; mode=block";

五、常见问题解决方案

5.1 容器间通信失败

问题现象:Nginx代理502错误
解决方案

  1. 确认所有容器在同一个Docker网络
  2. 检查容器名称是否与Nginx配置中的proxy_pass一致
  3. 验证目标容器端口是否暴露

5.2 域名解析不生效

排查步骤

  1. 使用ping project1.example.com测试DNS解析
  2. 检查本地hosts文件或DNS服务器配置
  3. 确认Nginx配置中的server_name与域名完全匹配

5.3 静态资源加载404

优化方案

  1. location /static/ {
  2. alias /var/www/static/;
  3. expires 30d;
  4. access_log off;
  5. }

六、性能优化建议

  1. 启用Gzip压缩

    1. gzip on;
    2. gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
  2. 缓存配置
    ```nginx
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m;

location / {
proxy_cache my_cache;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 404 10m;
}

  1. 3. **连接池优化**:
  2. ```nginx
  3. upstream backend {
  4. server project1:8080;
  5. keepalive 32;
  6. }
  7. server {
  8. location / {
  9. proxy_http_version 1.1;
  10. proxy_set_header Connection "";
  11. }
  12. }

七、扩展应用场景

  1. 蓝绿部署:通过修改Nginx配置实现无缝切换
  2. A/B测试:按权重分配流量到不同版本
  3. 金丝雀发布:初始只将少量流量导向新版本
  4. 多地域部署:结合DNS智能解析实现全球加速

八、总结与最佳实践

  1. 配置管理:使用环境变量区分开发/生产环境

    1. # docker-compose.yml示例
    2. environment:
    3. - NODE_ENV=${ENVIRONMENT}
  2. 日志集中:配置ELK或Loki收集容器日志

  3. 监控告警:使用Prometheus+Grafana监控容器指标
  4. CI/CD集成:在流水线中自动构建和部署容器

通过Docker与Nginx的组合方案,开发者可以高效地管理多个Web项目的域名路由,实现环境隔离与资源优化。实际部署时,建议先在测试环境验证配置,再逐步推广到生产环境。定期备份配置文件和证书,建立完善的回滚机制,确保系统稳定性。