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

一、容器化部署架构设计
在云原生环境下,推荐采用容器化方式部署Nginx反向代理服务。典型架构包含三个核心网络平面:

  1. 外部网络层:承载80/443端口的公网访问流量
  2. 反向代理网络:连接Nginx与各个业务容器
  3. 内部服务网络:业务容器间的通信网络

建议使用Docker Compose进行编排,关键配置参数如下:

  1. version: '3.8'
  2. services:
  3. nginx-proxy:
  4. image: nginx:alpine
  5. container_name: reverse-proxy
  6. ports:
  7. - "80:80"
  8. - "443:443"
  9. volumes:
  10. - ./config:/etc/nginx/conf.d
  11. - ./certs:/etc/nginx/certs
  12. - ./logs:/var/log/nginx
  13. networks:
  14. - proxy-net
  15. - service-net
  16. restart: unless-stopped
  17. networks:
  18. proxy-net:
  19. driver: bridge
  20. service-net:
  21. external: true

二、SSL证书管理方案
现代Web服务必须启用HTTPS加密通信,推荐采用Let’s Encrypt免费证书:

  1. 使用Certbot工具自动获取证书
  2. 证书存储路径建议统一管理:
    • /etc/nginx/certs/fullchain.pem (公钥)
    • /etc/nginx/certs/privkey.pem (私钥)
  3. 配置文件权限设置:
    1. chmod 600 /etc/nginx/certs/privkey.pem
    2. chmod 644 /etc/nginx/certs/fullchain.pem

三、核心配置文件详解
配置文件采用模块化设计,包含三个关键文件:

  1. 默认配置文件(default.conf)
    实现HTTP到HTTPS的强制跳转:

    1. server {
    2. listen 80;
    3. server_name _;
    4. return 301 https://$host$request_uri;
    5. }
  2. 主配置文件(main.conf)
    处理SSL终止和基础路由:

    1. server {
    2. listen 443 ssl;
    3. server_name example.com;
    4. ssl_certificate /etc/nginx/certs/fullchain.pem;
    5. ssl_certificate_key /etc/nginx/certs/privkey.pem;
    6. ssl_protocols TLSv1.2 TLSv1.3;
    7. ssl_ciphers HIGH:!aNULL:!MD5;
    8. location / {
    9. proxy_pass http://default-service:8080;
    10. proxy_set_header Host $host;
    11. proxy_set_header X-Real-IP $remote_addr;
    12. }
    13. }
  3. 服务路由配置(services/)
    为每个子服务创建独立配置文件,例如vault.conf:
    ```nginx
    upstream vault_backend {
    server vault-service:80;
    keepalive 32;
    }

server {
listen 443 ssl;
server_name vault.example.com;

  1. ssl_certificate /etc/nginx/certs/fullchain.pem;
  2. ssl_certificate_key /etc/nginx/certs/privkey.pem;
  3. location / {
  4. proxy_pass http://vault_backend;
  5. proxy_http_version 1.1;
  6. proxy_set_header Connection "";
  7. # WebSocket支持
  8. proxy_set_header Upgrade $http_upgrade;
  9. proxy_set_header Connection "upgrade";
  10. }
  11. # 静态资源缓存配置
  12. location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
  13. expires 30d;
  14. add_header Cache-Control "public";
  15. }

}

  1. 四、高级功能实现
  2. 1. 健康检查机制
  3. ```nginx
  4. location /health {
  5. access_log off;
  6. allow 127.0.0.1;
  7. deny all;
  8. return 200 "healthy\n";
  9. }
  1. 请求限流配置
    ```nginx
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

server {
location /api/ {
limit_req zone=one burst=5;
proxy_pass http://api-service;
}
}

  1. 3. A/B测试路由
  2. ```nginx
  3. split_clients $remote_addr $ab_test {
  4. 50% "group_a";
  5. 50% "group_b";
  6. }
  7. upstream group_a {
  8. server service-v1:80;
  9. }
  10. upstream group_b {
  11. server service-v2:80;
  12. }
  13. server {
  14. location /experimental {
  15. if ($ab_test = "group_a") {
  16. proxy_pass http://group_a;
  17. }
  18. proxy_pass http://group_b;
  19. }
  20. }

五、运维最佳实践

  1. 配置热重载机制
    ```bash

    测试配置语法

    docker exec nginx-proxy nginx -t

平滑重载配置

docker exec nginx-proxy nginx -s reload

  1. 2. 日志管理方案
  2. ```nginx
  3. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  4. '$status $body_bytes_sent "$http_referer" '
  5. '"$http_user_agent" "$http_x_forwarded_for"';
  6. access_log /var/log/nginx/access.log main;
  7. error_log /var/log/nginx/error.log warn;
  1. 性能优化参数
    ```nginx
    worker_processes auto;
    worker_rlimit_nofile 65535;
    events {
    worker_connections 4096;
    multi_accept on;
    }

http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
client_max_body_size 20M;
}
```

六、故障排查指南

  1. 常见问题诊断流程:

    • 检查容器日志:docker logs nginx-proxy
    • 验证网络连通性:docker exec nginx-proxy curl -v http://service:80
    • 测试SSL握手:openssl s_client -connect example.com:443 -servername example.com
  2. 典型问题解决方案:

    • 502 Bad Gateway:检查后端服务是否正常运行
    • 证书过期:设置自动化续期脚本
    • 连接超时:调整proxy_read_timeout参数

通过这种结构化配置方案,可以实现单个域名下不同二级域名精准映射到多个后端服务,同时支持SSL终止、负载均衡、健康检查等企业级功能。实际部署时建议结合CI/CD流水线实现配置文件的自动化管理,通过监控系统实时跟踪服务状态,构建高可用的反向代理架构。