news 2026/5/13 6:32:33

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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
Node1172.20.1.11
Node2172.20.1.12
Node3172.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

下一步

  • 06-Keepalived配置详解.md - 了解VIP高可用

  • 07-PHP服务配置详解.md - 了解PHP服务配置

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/13 6:31:54

Arm Compiler armclang优化指南与实战技巧

1. Arm Compiler armclang 深度解析:从基础到高级优化作为一名长期从事嵌入式开发的工程师,我深知编译器在Arm架构开发中的核心地位。Arm Compiler armclang作为Arm官方推出的编译工具链,其优化能力和对Arm指令集的支持程度直接决定了最终产品…

作者头像 李华
网站建设 2026/5/13 6:27:24

我写的C语言代码笔记

单链表&#xff1a;#include <stdio.h> #include <stdlib.h>//实现初始化&#xff0c;头插&#xff0c;尾插&#xff0c;删除&#xff0c;输出等单链表的基本操作 typedef struct Node {int data;struct Node* next; }Node;//初始化 Node* intList() {Node* list …

作者头像 李华
网站建设 2026/5/13 6:14:17

基于MCP协议构建AI代码安全沙盒:原理、实现与工程实践

1. 项目概述&#xff1a;一个为AI模型安全执行代码的“沙盒”工具最近在折腾AI应用开发&#xff0c;特别是那些能调用外部工具、执行代码的智能体&#xff08;Agent&#xff09;时&#xff0c;一个绕不开的核心问题就是&#xff1a;如何让AI安全地运行它生成的代码&#xff1f;…

作者头像 李华
网站建设 2026/5/13 6:13:06

海光3250平台DPDK L2转发性能深度调优与实战解析

1. 海光3250平台与DPDK的黄金组合 国产处理器近年来在性能上突飞猛进&#xff0c;海光C86 3250八核处理器就是其中的佼佼者。这颗基于x86架构的CPU在实际网络包处理场景中表现如何&#xff1f;我最近用DPDK的L2转发&#xff08;l2fwd&#xff09;应用做了深度测试&#xff0c;发…

作者头像 李华
网站建设 2026/5/13 6:12:10

羽毛球正反手搓球、发球、接发球一定要学会,你就能制霸前场!

文章目录 引言 I 发球 发力源泉:手指与手腕的“抖弹” 反手发球 🎯 秘诀一:球头上下 → 控制高低(弧度与落点) 🎯 秘诀二:球头左右 → 控制方向(线路变化) II 接发 站位 握拍: "捻拍" 只打三个球——放网、勾对角、推腰 III 搓球的手法 展搓:正面击打球托…

作者头像 李华