{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2019-12-25 21:39:41","updateBy":"admin","updateTime":"2025-06-18 21:32:46","remark":null,"id":10,"articleTitle":"Nginx（三）负载均衡","articleUrl":"nginx_slb","articleThumbnail":"https://www.asumimoe.com/imgfiles/20250618/4b57c2e46f8949e5a30d4e2e9e8a8fd5.png","articleFlag":"0","draftStatus":"1","reprintStatement":"1","articleSummary":"Nginx 作为高性能的反向代理服务器，其负载均衡功能是核心优势之一。它可将客户端请求智能分发到多个后端服务器，实现高可用、高性能的分布式架构。","articleContent":"Nginx 作为高性能的反向代理服务器，其负载均衡功能是核心优势之一。它可将客户端请求智能分发到多个后端服务器，实现高可用、高性能的分布式架构。\n\n### 核心配置模块：`upstream`\n\n定义后端服务器集群的基础模块：\n\n```nginx\nhttp {\n    upstream backend {  # 定义名为backend的服务器组\n        server 192.168.1.100:8080 weight=5;  # 权重5\n        server 192.168.1.101:8080;           # 默认权重1\n        server backup.example.com:8080 backup; # 备份服务器\n    }\n}\n```\n\n---\n\n## 负载均衡策略\n\n### 1. 轮询 (Round Robin)\n\n**默认策略**：按顺序分发请求\n\n```nginx\nupstream backend {\n    server srv1.example.com;\n    server srv2.example.com;\n}\n```\n\n### 2. 加权轮询 (Weighted Round Robin)\n\n**根据权重分配流量**\n\n```nginx\nupstream backend {\n    server srv1.example.com weight=3;  # 处理3/4的请求\n    server srv2.example.com weight=1;  # 处理1/4的请求\n}\n```\n\n### 3. IP 哈希 (IP Hash)\n\n**保持会话一致性**：相同客户端始终访问同一后端\n\n```nginx\nupstream backend {\n    ip_hash;  # 启用IP哈希\n    server srv1.example.com;\n    server srv2.example.com;\n}\n```\n\n### 4. 最少连接 (Least Connections)\n\n**动态分配**：优先选择当前连接数最少的服务器\n\n```nginx\nupstream backend {\n    least_conn;\n    server srv1.example.com;\n    server srv2.example.com;\n}\n```\n\n### 5. 响应时间优先 (Least Time) - *Nginx Plus专属*\n\n**商业版特性**：基于响应时间和连接数\n\n```nginx\nupstream backend {\n    least_time header;  # 根据首字节响应时间\n    server srv1.example.com;\n    server srv2.example.com;\n}\n```\n\n## 高级配置参数\n\n### 1. 服务器健康检查\n\n```nginx\nupstream backend {\n    server srv1.example.com max_fails=3 fail_timeout=30s;\n    server srv2.example.com max_fails=2 fail_timeout=20s;\n}\n```\n\n- `max_fails`：允许失败次数\n- `fail_timeout`：失败后暂停服务时间\n\n### 2. 长连接优化\n\n```nginx\nupstream backend {\n    server srv1.example.com;\n    keepalive 32;         # 保持的空闲连接数\n    keepalive_timeout 60s; # 空闲连接超时时间\n}\n\nserver {\n    location / {\n        proxy_pass http://backend;\n        proxy_http_version 1.1;\n        proxy_set_header Connection \"\";\n    }\n}\n```\n\n### 3. 备份服务器\n\n```nginx\nupstream backend {\n    server primary1.example.com;\n    server primary2.example.com;\n    server backup.example.com backup;  # 仅当主服务器宕机时启用\n}\n```\n\n### 4. 慢启动 (Slow Start) - *Nginx Plus*\n\n```nginx\nupstream backend {\n    server srv1.example.com slow_start=30s;\n}\n```\n\n## 完整配置示例\n\n```nginx\nhttp {\n    # 定义商品服务集群\n    upstream product_service {\n        least_conn;  # 最少连接策略\n        server 10.0.1.20:8080 weight=3 max_fails=2 fail_timeout=30s;\n        server 10.0.1.21:8080 weight=2;\n        server 10.0.1.22:8080 backup;  # 备份节点\n        keepalive 32;\n    }\n\n    # 定义用户服务集群\n    upstream user_service {\n        ip_hash;  # 会话保持\n        server 10.0.2.30:8080;\n        server 10.0.2.31:8080;\n    }\n\n    server {\n        listen 80;\n        \n        # 商品路由\n        location /api/products {\n            proxy_pass http://product_service;\n            proxy_set_header Host $host;\n            proxy_set_header X-Real-IP $remote_addr;\n            \n            # 故障转移配置\n            proxy_next_upstream error timeout http_500 http_502 http_503;\n            proxy_next_upstream_timeout 2s;\n            proxy_next_upstream_tries 2;\n        }\n\n        # 用户路由\n        location /api/users {\n            proxy_pass http://user_service;\n            proxy_set_header Host $host;\n            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        }\n    }\n}\n```\n\n## 性能调优参数\n\n| 参数                    | 默认值 | 推荐值 | 作用               |\n| ----------------------- | ------ | ------ | ------------------ |\n| `worker_connections`    | 512    | 4096   | 单worker最大连接数 |\n| `keepalive_timeout`     | 75s    | 15s    | 客户端连接保持时间 |\n| `proxy_connect_timeout` | 60s    | 5s     | 连接后端超时       |\n| `proxy_read_timeout`    | 60s    | 30s    | 读取响应超时       |\n| `proxy_send_timeout`    | 60s    | 30s    | 发送请求超时       |\n\n```nginx\nproxy_connect_timeout 600; #nginx跟后端服务器连接超时时间(代理连接超时，单位秒)\nproxy_read_timeout 600; #连接成功后，后端服务器响应时间(代理接收超时，单位秒)\nproxy_send_timeout 600; #后端服务器数据回传时间(代理发送超时，单位秒)\nproxy_buffer_size 64k; #设置代理服务器（nginx）保存用户头信息的缓冲区大小\nproxy_buffers   4 32k; #proxy_buffers缓冲区，网页平均在32k以下的话，这样设置\nproxy_busy_buffers_size 64k; #高负荷下缓冲大小（proxy_buffers*2）\nproxy_temp_file_write_size 64k; #设定缓存文件夹大小，大于这个值，将从upstream服务器传\nproxy_buffers 4 256k;设置用于读取应答（来自被代理服务器）的缓冲区数目和大小，默认情况也为分页大小，根据操作系统的不同可能是4k或者8k\nproxy_busy_buffers_size 256k;\nproxy_temp_file_write_size 256k;设置在写入proxy_temp_path时数据的大小，预防一个工作进程在传递文件时阻塞太长\nproxy_temp_path /data0/proxy_temp_dir;\nproxy_temp_path和proxy_cache_path指定的路径必须在同一分区\nproxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;设置内存缓存空间大小为200MB，1天没有被访问的内容自动清除，硬盘缓存空间大小为30GB。\nclient_body_buffer_size 512k;如果把它设置为比较大的数值，例如256k，那么，无论使用firefox还是IE浏览器，来提交任意小于256k的图片，都很正常。如果注释该指令，使用默认的client_body_buffer_size设置，也就是操作系统页面大小的两倍，8k或者16k，问题就出现了。\n无论使用firefox4.0还是IE8.0，提交一个比较大，200k左右的图片，都返回500 Internal ServerError错误\nproxy_intercept_errors on;表示使nginx阻止HTTP应答代码为400或者更高的应答。\n```","categoryId":12,"viewCount":761,"categoryName":"Nginx","author":"球接子","authorAvatar":null,"tagIds":[14,13,7],"tagNames":["中间件","Nginx","负载均衡"]}}