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

下一步

相关推荐
RInk7oBjo1 小时前
从零设计生产级 Multi-Agent Harness:架构、评估、记忆、成本与 MCP 工具接入全拆解
架构
前端老曹1 小时前
Docker 从入门到放弃:完整指南
运维·docker·容器
张伯毅2 小时前
如何构建一个生产级 AI Agent CLI —— 以 Claude Code 架构探索
人工智能·架构
covco3 小时前
分布式架构实战:全平台矩阵管理系统的技术实现与性能优化
分布式·矩阵·架构
咖啡里的茶i3 小时前
在Docker环境中安装Hadoop cluster 实验报告一
hadoop·docker·容器
汪汪大队u3 小时前
续:从 Docker Compose 到 Kubernetes(2)—— 服务优化与排错
网络·后端·物联网·struts·容器
rabbit_pro3 小时前
Docker compose部署Ollama使用模型
linux·运维·docker
ILL11IIL4 小时前
k8s的pod管理及优化
云原生·容器·kubernetes
dhashdoia4 小时前
GPT-5.5 代码开发实战:Codex与Browser Use深度集成与星链4SAPI优化方案
java·数据库·人工智能·gpt·架构