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

下一步

相关推荐
jiayong233 小时前
harness 与 hermes-agent 扩展性、安全与运维
运维·人工智能·安全·ai·架构·智能体·harness
容器魔方3 小时前
KubeEdge SIG AI: 基于KubeEdge-Ianvs的大模型联邦微调算法
大数据·人工智能·算法·云原生·容器·云计算
糯米导航3 小时前
飙算工具箱|AI编程工具赋能多模态 AIGC 架构实战
架构·aigc·ai编程
Agent手记3 小时前
电信装维如何智能派单?AI 工程师匹配原理与智能体架构拆解
人工智能·ai·架构
tianyuanwo3 小时前
企业级容器镜像管理实践:基于JFrog Artifactory的私有镜像仓库搭建与配置指南
docker·云原生·registry
最后一支迷迭香3 小时前
Mac使用docker下的两个冷知识
macos·docker·容器
数据库小学妹3 小时前
数据库高可用架构实战:从主从复制到两地三中心的四层演进与避坑
数据库·经验分享·架构·dba
亚空间仓鼠3 小时前
Docker容器化高可用架构部署方案(十八)
docker·容器·架构
木雷坞3 小时前
Open WebUI 连不上 Ollama:Docker Compose 排查记录
人工智能·docker·ai编程
蜀道山老天师3 小时前
Docker 部署 Nginx Proxy Manager:可视化反向代理 + SSL 证书一键配置
nginx·docker·ssl