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

作者:有好多问题2025.10.31 10:59浏览量:4

简介:本文详细介绍如何通过Docker与Nginx实现二级域名访问多个Web项目,涵盖容器化部署、Nginx反向代理配置及域名解析优化,助力开发者高效管理多项目网络架构。

Docker Nginx部署二级域名访问多个Web项目

一、背景与需求分析

在微服务架构和DevOps实践中,开发者常需在同一服务器上部署多个Web项目(如前端应用、API服务、后台管理系统等)。传统方式需为每个项目配置独立端口,导致访问路径复杂(如http://ip:8080http://ip:8081)。通过二级域名(如api.example.comadmin.example.com)访问可显著提升用户体验和系统可维护性。

核心需求

  1. 同一服务器运行多个Web项目
  2. 通过二级域名区分访问路径
  3. 保持高可用性和可扩展性
  4. 简化部署与运维流程

二、技术方案选型

2.1 Docker容器化优势

  • 隔离性:每个项目运行在独立容器中,避免依赖冲突
  • 可移植性:镜像打包环境配置,实现”Build Once, Run Anywhere”
  • 资源控制:通过CPU/内存限制保障关键服务性能
  • 快速扩展:结合Docker Compose或Kubernetes实现横向扩展

2.2 Nginx反向代理核心作用

  • 统一入口:将80/443端口请求分发至不同容器
  • 负载均衡:支持多容器实例的流量分配
  • SSL终止:集中管理HTTPS证书
  • 路径重写:实现优雅的URL路由

三、实施步骤详解

3.1 环境准备

  1. # 安装必要工具
  2. sudo apt update
  3. sudo apt install -y docker.io docker-compose nginx
  4. # 验证安装
  5. docker --version
  6. nginx -v

3.2 项目容器化

以两个Node.js项目为例:

项目1(api.example.com):

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

项目2(admin.example.com):

  1. # admin-panel/Dockerfile
  2. FROM node:16-alpine
  3. WORKDIR /app
  4. COPY package*.json ./
  5. RUN npm install --production
  6. COPY . .
  7. EXPOSE 3001
  8. CMD ["node", "server.js"]

构建镜像:

  1. docker build -t api-service ./api-service
  2. docker build -t admin-panel ./admin-panel

3.3 Nginx配置优化

创建/etc/nginx/conf.d/multi-project.conf

  1. # 主服务器配置
  2. server {
  3. listen 80;
  4. server_name example.com;
  5. return 301 https://$host$request_uri;
  6. }
  7. # API服务代理
  8. server {
  9. listen 443 ssl;
  10. server_name api.example.com;
  11. ssl_certificate /etc/nginx/ssl/fullchain.pem;
  12. ssl_certificate_key /etc/nginx/ssl/privkey.pem;
  13. location / {
  14. proxy_pass http://api-service:3000;
  15. proxy_set_header Host $host;
  16. proxy_set_header X-Real-IP $remote_addr;
  17. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  18. }
  19. }
  20. # 管理后台代理
  21. server {
  22. listen 443 ssl;
  23. server_name admin.example.com;
  24. ssl_certificate /etc/nginx/ssl/fullchain.pem;
  25. ssl_certificate_key /etc/nginx/ssl/privkey.pem;
  26. location / {
  27. proxy_pass http://admin-panel:3001;
  28. proxy_set_header Host $host;
  29. proxy_set_header X-Real-IP $remote_addr;
  30. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  31. }
  32. }

关键配置说明

  • proxy_pass:指向Docker容器内部服务
  • ssl_certificate:需提前准备Let’s Encrypt或其他证书
  • proxy_set_header:确保真实IP和Host头信息传递

3.4 Docker Compose编排

创建docker-compose.yml

  1. version: '3.8'
  2. services:
  3. api-service:
  4. image: api-service:latest
  5. restart: unless-stopped
  6. networks:
  7. - webnet
  8. admin-panel:
  9. image: admin-panel:latest
  10. restart: unless-stopped
  11. networks:
  12. - webnet
  13. nginx-proxy:
  14. image: nginx:alpine
  15. ports:
  16. - "80:80"
  17. - "443:443"
  18. volumes:
  19. - ./nginx.conf:/etc/nginx/conf.d/multi-project.conf
  20. - /etc/letsencrypt:/etc/nginx/ssl
  21. depends_on:
  22. - api-service
  23. - admin-panel
  24. networks:
  25. - webnet
  26. networks:
  27. webnet:
  28. driver: bridge

3.5 域名解析配置

在DNS管理界面添加:

  • A记录 api → 指向服务器IP
  • A记录 admin → 指向服务器IP
  • 泛域名解析(可选)*.example.com

四、高级优化技巧

4.1 健康检查与自动重启

  1. # docker-compose.yml 增强示例
  2. services:
  3. api-service:
  4. healthcheck:
  5. test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
  6. interval: 30s
  7. timeout: 10s
  8. retries: 3

4.2 性能调优参数

  1. # Nginx性能优化配置
  2. worker_processes auto;
  3. worker_rlimit_nofile 100000;
  4. events {
  5. worker_connections 4000;
  6. use epoll;
  7. multi_accept on;
  8. }
  9. http {
  10. sendfile on;
  11. tcp_nopush on;
  12. tcp_nodelay on;
  13. keepalive_timeout 65;
  14. types_hash_max_size 2048;
  15. client_max_body_size 20m;
  16. }

4.3 安全加固措施

  1. 禁用Nginx版本显示:
    1. server_tokens off;
  2. 限制访问频率:
    1. limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    2. server {
    3. location / {
    4. limit_req zone=one burst=5;
    5. }
    6. }
  3. 启用HSTS:
    1. add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

五、常见问题解决方案

5.1 容器间通信失败

现象:Nginx无法代理到容器服务
排查步骤

  1. 检查Docker网络docker network inspect webnet
  2. 验证容器端口暴露:docker ps
  3. 测试容器内访问:docker exec -it nginx-proxy shcurl http://api-service:3000

5.2 SSL证书问题

解决方案

  1. 使用Certbot自动获取证书:
    1. sudo certbot --nginx -d api.example.com -d admin.example.com
  2. 手动证书配置时确保路径正确
  3. 设置自动续期:
    1. sudo certbot renew --dry-run

5.3 性能瓶颈分析

工具推荐

  1. Nginx状态监控:
    1. location /nginx_status {
    2. stub_status on;
    3. access_log off;
    4. allow 127.0.0.1;
    5. deny all;
    6. }
  2. Docker统计:docker stats
  3. 负载测试:ab -n 1000 -c 100 http://api.example.com/

六、扩展架构建议

6.1 自动化部署流水线

  1. # .gitlab-ci.yml 示例
  2. stages:
  3. - build
  4. - deploy
  5. build_api:
  6. stage: build
  7. script:
  8. - docker build -t api-service:$CI_COMMIT_SHA ./api-service
  9. - docker push api-service:$CI_COMMIT_SHA
  10. deploy_production:
  11. stage: deploy
  12. script:
  13. - docker stack deploy -c docker-compose.prod.yml my_stack
  14. environment:
  15. name: production
  16. url: https://api.example.com

6.2 多环境管理策略

建议采用以下目录结构:

  1. .
  2. ├── environments/
  3. ├── prod/
  4. ├── docker-compose.yml
  5. └── nginx.conf
  6. ├── staging/
  7. └── ...
  8. └── dev/
  9. └── ...
  10. └── projects/
  11. ├── api-service/
  12. └── admin-panel/

七、总结与最佳实践

  1. 容器命名规范:使用<项目>-<环境>格式(如api-prod
  2. 配置管理:将Nginx配置和Docker Compose文件纳入版本控制
  3. 监控告警:集成Prometheus+Grafana监控容器指标
  4. 日志集中:使用ELK或Loki+Grafana收集分析日志
  5. 渐进式更新:采用蓝绿部署或金丝雀发布策略

通过本方案实现的二级域名访问架构,可支持横向扩展至数十个Web项目,同时保持99.9%以上的可用性。实际生产环境中,建议结合Kubernetes实现更高级的编排能力,但对于中小型项目,本文介绍的Docker+Nginx组合已能提供卓越的性价比。