Docker容器化高可用架构部署方案(六)

05-Nginx-LB配置详解

本文档详细介绍Nginx负载均衡器的配置,是整个架构中接收客户端请求的入口点。

架构位置

复制代码
客户端
   │
   ▼
┌─────────────────┐
│  VIP 172.20.1.100│  ← Keepalived浮动IP
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  Nginx-LB        │  ← 负载均衡层
│  172.20.1.11/12/13 │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  PHP服务集群     │  ← 3个PHP服务节点
│  172.20.2.11/12/13│
└─────────────────┘

配置组件

Nginx-LB使用3个配置文件:

  1. nginx.conf - 主配置文件,包含upstream定义

  2. conf.d/upstream.conf - 服务器块配置

  3. ssl.conf - SSL/TLS配置

完整配置

nginx.conf

复制代码
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
​
events {
    worker_connections 1024;
    use epoll;
    multi_accept on;
}
​
http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
​
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for" '
                    'upstream: $upstream_addr '
                    'upstream_status: $upstream_status '
                    'request_time: $request_time '
                    'upstream_response_time: $upstream_response_time';
​
    access_log /var/log/nginx/access.log main;
​
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    client_max_body_size 100M;
​
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css text/xml text/javascript 
               application/json application/javascript application/xml+rss 
               application/rss+xml font/truetype font/opentype 
               application/vnd.ms-fontobject image/svg+xml;
​
    upstream web_backend {
        least_conn;
        server 172.20.2.11:80 max_fails=3 fail_timeout=30s;
        server 172.20.2.12:80 max_fails=3 fail_timeout=30s;
        server 172.20.2.13:80 max_fails=3 fail_timeout=30s;
    }
​
    include /etc/nginx/conf.d/*.conf;
}

conf.d/upstream.conf

复制代码
server {
    listen 80;
    server_name localhost;
    
    location / {
        proxy_pass http://web_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_connect_timeout 10s;
        proxy_send_timeout 30s;
        proxy_read_timeout 30s;
    }
​
    location /health {
        access_log off;
        return 200 "healthy\n";
        add_header Content-Type text/plain;
    }
}

ssl.conf

复制代码
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;

配置项详解

1. worker_processes

复制代码
worker_processes auto;
  • auto:让Nginx自动检测CPU核心数并启动相应数量的worker进程

  • 推荐值:CPU核心数或auto

2. worker_connections

复制代码
worker_connections 1024;
  • 每个worker进程允许的最大并发连接数

  • 1024是保守值,可根据需要调大

3. use epoll

复制代码
use epoll;
  • 使用epoll事件模型(Linux高性能I/O复用)

  • 适用于高并发场景

4. multi_accept

复制代码
multi_accept on;
  • 一次accept尽可能多的连接

  • 提升并发处理能力

5. sendfile

复制代码
sendfile on;
tcp_nopush on;
tcp_nodelay on;
  • sendfile:使用内核级文件传输,减少上下文切换

  • tcp_nopush:在响应头后立即发送数据包

  • tcp_nodelay:禁用Nagle算法,降低延迟

6. 日志格式

复制代码
log_format main '...upstream: $upstream_addr...upstream_status: $upstream_status...';
  • 记录upstream地址和状态,便于排查问题

  • 包含请求时间、响应时间等关键指标

7. Gzip压缩

复制代码
gzip on;
gzip_types text/plain application/json...;
  • 启用gzip压缩减少传输量

  • 针对文本类内容压缩

8. upstream配置

复制代码
upstream web_backend {
    least_conn;
    server 172.20.2.11:80 max_fails=3 fail_timeout=30s;
    server 172.20.2.12:80 max_fails=3 fail_timeout=30s;
    server 172.20.2.13:80 max_fails=3 fail_timeout=30s;
}

负载均衡算法

  • least_conn:最少连接数优先

  • 其他可选:ip_hashhashround_robin(默认)

健康检查参数

  • max_fails=3:连续3次失败后认为服务器不可用

  • fail_timeout=30s:失败后30秒内不再尝试

9. 代理配置

复制代码
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  • 传递真实客户端IP到后端PHP服务

  • 保留原始请求协议(HTTP/HTTPS)

10. 健康检查端点

复制代码
location /health {
    access_log off;
    return 200 "healthy\n";
}
  • 用于Keepalived检测Nginx状态

  • 关闭访问日志减少磁盘IO

服务IP分配

节点 nginx-lb IP
Node1 172.20.1.11
Node2 172.20.1.12
Node3 172.20.1.13

Docker Compose配置

复制代码
nginx-lb:
  image: nginx:alpine
  container_name: nginx-lb
  networks:
    frontend-net:
      ipv4_address: 172.20.1.11  # Node1
      # 172.20.1.12 (Node2)
      # 172.20.1.13 (Node3)
    backend-net:
      ipv4_address: 172.20.2.100  # Node1
      # 172.20.2.101 (Node2)
      # 172.20.2.102 (Node3)
  volumes:
    - ./config/nginx-lb/nginx.conf:/etc/nginx/nginx.conf:ro
    - ./config/nginx-lb/conf.d:/etc/nginx/conf.d:ro
    - ./config/nginx-lb/ssl.conf:/etc/nginx/ssl.conf:ro
  restart: unless-stopped
  healthcheck:
    test: ["CMD-SHELL", "curl -f http://localhost/health > /dev/null 2>&1 || exit 1"]
    interval: 10s
    timeout: 5s
    retries: 3

常见问题

Q1: upstream返回502 Bad Gateway

  • 检查PHP服务是否运行:docker ps | grep php

  • 检查网络连通性:ping 172.20.2.11

  • 查看Nginx错误日志:docker logs nginx-lb

Q2: 所有upstream都失败

  • 确认3个PHP服务的healthcheck状态

  • 检查后端网络配置

Q3: 日志不记录upstream信息

  • 确认log_format包含$upstream_addr$upstream_status

  • 重载配置:docker exec nginx-lb nginx -s reload

下一步

相关推荐
herosunly9 小时前
60ms 不是启动快,而是不用重新启动:CubeSandbox 极速冷启动架构拆解
架构·cube sandbox
zlinear数据采集卡11 小时前
从气动比例阀到任意波形:硬核拆解ZLinear采集卡的DAC输出架构与工业闭环控制实战
arm开发·架构
2601_9619460812 小时前
AI API 网关实战:从单 Key 管理到企业级多租户架构
大数据·人工智能·金融·架构·api·个人开发
XUHUOJUN14 小时前
Windows 2025架构深度分析之Stretch Cluster 延迟工程现实
windows·microsoft·架构·azure local
Web极客码15 小时前
突破并发瓶颈:云端高性能架构如何赋能海外 AI Agent 矩阵的高效产出
服务器·人工智能·架构
小兔崽子去哪了15 小时前
Docker 删除镜像后磁盘空间没有释放?
后端·docker·容器
laoli_coding16 小时前
系统部署之框架选型方案
微服务·云原生·架构
掘金_答案16 小时前
上线那天,一个 ConcurrentHashMap 差点送走我的 AI 客服——3 天排查 JVM 血泪史
java·后端·架构
秦任之17 小时前
Gliding Horse 整体架构拼图:当 AI Agent 有了自己的操作系统
人工智能·架构
Zhu75817 小时前
在Docker环境部署ApacheGuacamole,对接PG数据库
数据库·docker·容器