如何通过Nginx实现单域名多服务反向代理配置

一、公网环境下的Nginx容器化部署方案

在云服务器具备公网IP且域名解析已完成的前提下,采用容器化部署可实现环境隔离与快速迭代。建议采用双网络架构:

  • 反向代理网络:用于Nginx与后端服务的内部通信
  • 互联网接入网络:处理公网流量入口

1.1 Docker Compose配置实践

  1. version: '3.8'
  2. services:
  3. nginx-proxy:
  4. image: nginx:alpine
  5. container_name: nginx-reverse-proxy
  6. ports:
  7. - "80:80"
  8. - "443:443"
  9. volumes:
  10. - ./nginx/conf.d:/etc/nginx/conf.d:ro
  11. - ./nginx/logs:/var/log/nginx
  12. - ./certs:/etc/nginx/certs:ro
  13. - /etc/localtime:/etc/localtime:ro
  14. networks:
  15. - internal-proxy
  16. - external-internet
  17. restart: always
  18. healthcheck:
  19. test: ["CMD", "curl", "-f", "http://localhost:80/health"]
  20. interval: 30s
  21. timeout: 10s
  22. retries: 3
  23. networks:
  24. internal-proxy:
  25. driver: bridge
  26. internal: true
  27. external-internet:
  28. driver: bridge

关键配置说明:

  1. 证书管理:通过数据卷挂载TLS证书,建议采用Let’s Encrypt自动续期方案
  2. 健康检查:内置健康监测接口,便于与容器编排系统集成
  3. 网络隔离:内部网络禁用外部访问,提升安全性

二、Nginx核心配置架构设计

采用模块化配置策略,将不同功能拆分为独立配置文件:

2.1 基础安全配置 (base.conf)

  1. # 强制HTTPS跳转
  2. server {
  3. listen 80;
  4. server_name ~^(.*)$;
  5. return 301 https://$host$request_uri;
  6. }
  7. # HTTPS基础配置
  8. server {
  9. listen 443 ssl http2;
  10. server_name _;
  11. ssl_certificate /etc/nginx/certs/fullchain.pem;
  12. ssl_certificate_key /etc/nginx/certs/privkey.pem;
  13. ssl_protocols TLSv1.2 TLSv1.3;
  14. ssl_ciphers HIGH:!aNULL:!MD5;
  15. # HSTS配置
  16. add_header Strict-Transport-Security "max-age=31536000" always;
  17. # 禁止解析内网IP
  18. real_ip_header X-Forwarded-For;
  19. set_real_ip_from 10.0.0.0/8;
  20. set_real_ip_from 172.16.0.0/12;
  21. set_real_ip_from 192.168.0.0/16;
  22. }

2.2 多服务代理配置 (services.conf)

  1. # 示例1:基于路径的路由
  2. server {
  3. listen 443 ssl;
  4. server_name example.com;
  5. location /api/ {
  6. proxy_pass http://backend-api:8080/;
  7. proxy_set_header Host $host;
  8. proxy_set_header X-Real-IP $remote_addr;
  9. # WebSocket支持
  10. proxy_http_version 1.1;
  11. proxy_set_header Upgrade $http_upgrade;
  12. proxy_set_header Connection "upgrade";
  13. }
  14. location /static/ {
  15. alias /var/www/static/;
  16. expires 30d;
  17. access_log off;
  18. }
  19. }
  20. # 示例2:基于子域名的路由
  21. server {
  22. listen 443 ssl;
  23. server_name app1.example.com;
  24. location / {
  25. proxy_pass http://app1-service:3000;
  26. proxy_buffering off;
  27. }
  28. }

三、高级流量管理策略

3.1 负载均衡配置

  1. upstream backend_pool {
  2. zone backend_pool 64k;
  3. least_conn;
  4. server backend1:8080 weight=5;
  5. server backend2:8080 weight=3;
  6. server backend3:8080 backup;
  7. keepalive 32;
  8. }
  9. server {
  10. listen 443 ssl;
  11. server_name loadbalanced.example.com;
  12. location / {
  13. proxy_pass http://backend_pool;
  14. proxy_next_upstream error timeout invalid_header;
  15. }
  16. }

3.2 限流与安全防护

  1. # 速率限制配置
  2. limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
  3. server {
  4. listen 443 ssl;
  5. server_name api.example.com;
  6. location / {
  7. limit_req zone=api_limit burst=20 nodelay;
  8. proxy_pass http://api-service;
  9. }
  10. # 防护配置
  11. client_max_body_size 10m;
  12. client_body_timeout 10s;
  13. keepalive_timeout 75s;
  14. }

四、运维实践与故障排查

4.1 证书自动化管理

建议采用Certbot工具实现证书自动续期:

  1. # 安装Certbot
  2. apk add certbot python3
  3. # 创建续期脚本
  4. echo "0 3 * * * certbot renew --nginx --quiet --no-self-upgrade" > /etc/crontabs/root

4.2 日志分析方案

  1. # 增强型日志配置
  2. log_format main_ext '$remote_addr - $remote_user [$time_local] "$request" '
  3. '$status $body_bytes_sent "$http_referer" '
  4. '"$http_user_agent" "$http_x_forwarded_for" '
  5. '$request_time $upstream_response_time';
  6. access_log /var/log/nginx/access.log main_ext;
  7. error_log /var/log/nginx/error.log warn;

4.3 常见问题处理

  1. 502 Bad Gateway

    • 检查后端服务是否正常运行
    • 验证防火墙规则是否放行代理端口
    • 查看Nginx错误日志定位具体原因
  2. 证书验证失败

    • 确认证书文件权限设置为644
    • 检查证书链是否完整(包含中间证书)
    • 验证系统时间是否准确
  3. 性能瓶颈排查

    • 使用stap工具分析TCP连接状态
    • 通过nginx -T测试完整配置
    • 监控proxy_buffer_size等参数设置

五、扩展架构建议

  1. 高可用方案

    • 部署多节点Nginx集群
    • 使用Keepalived实现VIP切换
    • 配置共享存储存放证书和配置
  2. 动态配置管理

    • 集成Consul Template实现配置自动更新
    • 采用Nginx Plus的API动态配置功能
    • 通过CI/CD流水线管理配置变更
  3. 服务发现集成

    • 与容器编排平台的服务发现机制对接
    • 实现基于DNS的服务路由
    • 支持服务实例的自动注册与摘除

通过上述架构设计,可构建出具备高安全性、高可用性和良好扩展性的服务代理平台。实际部署时需根据具体业务需求调整参数配置,并建立完善的监控告警体系确保系统稳定运行。