Docker+Nginx+HTTPS:多Web项目二级域名无端口访问全攻略

Docker+Nginx+HTTPS:多Web项目二级域名无端口访问全攻略

一、技术架构与核心价值

在微服务架构盛行的今天,企业常面临多Web项目部署难题:传统方案需为每个项目配置独立端口,导致访问路径复杂(如http://domain.com:8080/project1)。本文提出的Docker+Nginx+HTTPS二级域名无端口方案,通过反向代理与域名路由技术,实现https://project1.domain.com等简洁访问方式,显著提升用户体验与系统安全性。

该方案核心价值体现在三方面:

  1. 资源隔离:每个Web项目运行于独立Docker容器,避免进程冲突
  2. 统一入口:Nginx作为反向代理服务器,隐藏后端服务细节
  3. 安全强化:通过HTTPS加密与子域名隔离,降低跨站攻击风险

二、环境准备与证书配置

2.1 基础环境要求

  • Docker Engine 20.10+
  • Nginx官方镜像(nginx:alpine最佳)
  • 已备案的域名(如example.com)
  • 有效的SSL证书(推荐Let’s Encrypt免费证书)

2.2 证书获取与配置

以Certbot为例获取证书:

  1. # 安装Certbot
  2. sudo apt install certbot python3-certbot-nginx
  3. # 获取通配符证书(需DNS验证)
  4. certbot certonly --manual --preferred-challenges=dns \
  5. -d "*.example.com" --server https://acme-v02.api.letsencrypt.org/directory

获取的证书文件结构如下:

  1. /etc/letsencrypt/live/example.com/
  2. ├── cert.pem # 域名证书
  3. ├── chain.pem # 中间证书
  4. ├── fullchain.pem # 完整证书链
  5. └── privkey.pem # 私钥

三、Docker容器化部署

3.1 多项目容器规划

建议采用docker-compose进行编排,示例配置如下:

  1. version: '3.8'
  2. services:
  3. project1:
  4. image: node:16-alpine
  5. working_dir: /app
  6. volumes:
  7. - ./project1:/app
  8. command: npm start
  9. networks:
  10. - webnet
  11. project2:
  12. image: python:3.9-slim
  13. working_dir: /app
  14. volumes:
  15. - ./project2:/app
  16. command: python app.py
  17. networks:
  18. - webnet
  19. networks:
  20. webnet:
  21. driver: bridge

关键点说明:

  • 所有项目共享webnet网络,实现容器间通信
  • 每个项目暴露不同端口(如3000、5000),但不对外直接暴露

四、Nginx反向代理配置

4.1 主配置文件结构

  1. # /etc/nginx/nginx.conf
  2. user nginx;
  3. worker_processes auto;
  4. events {
  5. worker_connections 1024;
  6. }
  7. http {
  8. include /etc/nginx/mime.types;
  9. default_type application/octet-stream;
  10. # 加载所有子域名配置
  11. include /etc/nginx/conf.d/*.conf;
  12. }

4.2 子域名配置示例

project1.example.com创建配置文件:

  1. # /etc/nginx/conf.d/project1.conf
  2. server {
  3. listen 443 ssl;
  4. server_name project1.example.com;
  5. ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  6. ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  7. ssl_protocols TLSv1.2 TLSv1.3;
  8. ssl_ciphers HIGH:!aNULL:!MD5;
  9. location / {
  10. proxy_pass http://project1:3000; # 指向Docker容器
  11. proxy_set_header Host $host;
  12. proxy_set_header X-Real-IP $remote_addr;
  13. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  14. }
  15. }

project2.example.com创建类似配置,仅修改server_nameproxy_pass端口。

五、高级功能实现

5.1 HTTP自动跳转HTTPS

在Nginx主配置中添加:

  1. server {
  2. listen 80;
  3. server_name *.example.com;
  4. return 301 https://$host$request_uri;
  5. }

5.2 路径重写规则

当Web应用使用根路径时(如React的/),需配置:

  1. location / {
  2. proxy_pass http://project1:3000/;
  3. proxy_redirect off;
  4. proxy_set_header Host $host;
  5. }

5.3 WebSocket支持

对于需要WebSocket连接的项目:

  1. location /ws {
  2. proxy_pass http://project1:3000/ws;
  3. proxy_http_version 1.1;
  4. proxy_set_header Upgrade $http_upgrade;
  5. proxy_set_header Connection "upgrade";
  6. }

六、常见问题排查

6.1 502 Bad Gateway错误

  • 检查Docker容器是否正常运行:docker ps -a
  • 验证Nginx错误日志:tail -f /var/log/nginx/error.log
  • 确认代理目标端口是否正确

6.2 SSL证书验证失败

  • 检查证书路径是否正确
  • 验证证书有效期:openssl x509 -noout -dates -in /path/to/cert.pem
  • 确保证书包含SAN(Subject Alternative Name)字段

6.3 跨域问题解决方案

在Nginx配置中添加:

  1. location / {
  2. add_header 'Access-Control-Allow-Origin' '*';
  3. add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
  4. add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
  5. if ($request_method = 'OPTIONS') {
  6. add_header 'Access-Control-Max-Age' 1728000;
  7. add_header 'Content-Type' 'text/plain; charset=utf-8';
  8. add_header 'Content-Length' 0;
  9. return 204;
  10. }
  11. }

七、性能优化建议

  1. 启用HTTP/2:在Nginx配置中添加listen 443 ssl http2;
  2. 静态资源缓存
    1. location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    2. expires 30d;
    3. add_header Cache-Control "public";
    4. }
  3. 连接池优化
    1. upstream project1 {
    2. server project1:3000;
    3. keepalive 32;
    4. }

八、自动化部署方案

推荐使用Ansible进行自动化配置:

  1. # playbook.yml
  2. - hosts: webservers
  3. tasks:
  4. - name: Copy Nginx config
  5. copy:
  6. src: ./conf.d/
  7. dest: /etc/nginx/conf.d/
  8. notify: Reload Nginx
  9. - name: Ensure Docker services are running
  10. docker_compose:
  11. project_src: /path/to/docker-compose.yml
  12. state: present
  13. handlers:
  14. - name: Reload Nginx
  15. systemd:
  16. name: nginx
  17. state: reloaded

九、安全加固措施

  1. 限制访问IP
    1. allow 192.168.1.0/24;
    2. deny all;
  2. 速率限制
    1. limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    2. server {
    3. location / {
    4. limit_req zone=one;
    5. }
    6. }
  3. 定期更新证书:设置Certbot自动续期
    1. certbot renew --dry-run

十、总结与扩展

本方案通过Docker容器化实现环境隔离,利用Nginx反向代理完成流量分发,结合HTTPS加密保障通信安全。实际部署时需注意:

  1. 监控容器资源使用情况(推荐Prometheus+Grafana)
  2. 定期备份Nginx配置与证书
  3. 考虑使用Traefik等现代反向代理替代Nginx

对于超大规模部署,可进一步研究:

  • Kubernetes Ingress Controller方案
  • 服务网格(Service Mesh)架构
  • 自动证书管理(如cert-manager)

通过本文所述方法,开发者能够以标准化方式管理多个Web项目,显著提升运维效率与系统安全性。实际实施时建议先在测试环境验证,再逐步推广到生产环境。