明天的明天 永远的永远 未知的一切 我与你一起承担 ??

是非成败转头空 青山依旧在 几度夕阳红 。。。
随笔 - 1274, 文章 - 0, 评论 - 214, 阅读 - 319万
  博客园  :: 首页  :: 管理
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

nginx 负载均衡的三种方式

Posted on   且行且思  阅读(9)  评论(0编辑  收藏  举报

nginx负载均衡的三种方式
在Nginx中实现负载均衡主要有三种方式,每种方式都有其特定的应用场景和优缺点。以下是这三种方式:

1. 轮询(Round Robin)
基本原理:Nginx默认的负载均衡方式,它将客户端的请求按顺序轮流分配到每个后端服务器上。

配置示例:
http {
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;

      # 可以选择负载均衡策略,例如:

# least_conn;

# ip_hash;

 

# 后端服务器列表
#server 127.0.0.1:8080 weight=3;  # 权重3,处理更多请求
#server 127.0.0.1:8081;
#server 127.0.0.1:8082 backup;     # 备份节点,主节点故障时启用

    }
 
    server {
        location / {
            proxy_pass http://backend;
        }
    }
}
优点:简单易用,无需额外配置。

缺点:不适合所有类型的服务器,例如,如果服务器处理能力不同,可能导致某些服务器过载而其他服务器空闲。

2. 权重(Weighted)
基本原理:允许你为后端服务器指定不同的权重,权重高的服务器将获得更多的请求。

配置示例:
http {
    upstream backend {
        server backend1.example.com weight=3;
        server backend2.example.com weight=1;
        server backend3.example.com weight=2;
    }
 
    server {
        location / {
            proxy_pass http://backend;
        }
    }
}

优点:可以根据服务器的处理能力进行灵活分配,提高资源利用率。

缺点:配置稍显复杂,需要手动设置权重。

3. IP Hash
基本原理:根据客户端的IP地址进行哈希计算,将同一个IP地址的请求定向到同一台服务器上,适用于需要会话保持(session persistence)的场景。

配置示例:
http {
    upstream backend {
        ip_hash;
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
    }
 
    server {
        location / {
            proxy_pass http://backend;
        }
    }
}
优点:确保来自同一用户的请求始终被路由到同一台服务器,适用于需要会话保持的应用。

缺点:如果后端服务器发生故障或需要增加新的服务器,可能导致某些用户被永久路由到故障服务器上,除非手动调整配置或重启Nginx。

总结选择
轮询(Round Robin):适用于简单的负载均衡需求,无需过多配置。

权重(Weighted):适用于需要根据服务器性能分配负载的情况。

IP Hash(IP-based Session Persistence):适用于需要会话保持的应用,确保同一用户的请求始终被路由到同一台服务器。

选择哪种方式取决于你的具体需求和应用场景。通常,结合使用这些方法可以满足大多数负载均衡需求。例如,你可以使用权重来优化资源分配,同时利用IP Hash来保证用户的会话一致性。

 

======================= 实例 ====================================

复制代码
#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }
    include       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"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    
    upstream backend {
    server localhost:8011;
    server localhost:8014;
    server localhost:8015;

    # 可以选择负载均衡策略,例如:
    least_conn;
    # ip_hash;
    }
    
    server {
        listen       8012;         #平台API
        server_name  localhost;


        location / {
             #禁止浏览器缓存 index.html 和 version.json
            if ($request_filename ~* .*\.(htm|html|json)$) 
            {
               expires -1;
               #add_header Cache-Control "no-store";
               add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate";
            }
            
            client_max_body_size  1024m;
            client_body_buffer_size 1024m; 
            
            root   "D:\web\admin\dist";
            try_files $uri $uri/ @router;
            index  index.html index.htm;
            error_page 405 =200 http://$host$request_uri;
        }

        location /api/ {
            client_max_body_size  1024m;
            client_body_buffer_size 1024m; 
            
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header REMOTE-HOST $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            #proxy_pass http://localhost:8011/;     #http://localhost:8011/ http://192.168.1.104:8011/;
            proxy_pass http://backend/;
        }
        
        location @router {
            rewrite ^.*$ /index.html last;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
        

    include iot.conf;
}
复制代码

负载 要留意域名后,是否有/

 

4. 高级配置选项

健康检查

  • 被动检查:Nginx默认检测后端响应,标记不可用实例。

    server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
历史上的今天:
2022-02-11 Visual Studio 2022 初探 (vs2022 码)
2010-02-11 Flex :直接显示ToolTip和errorTip(不需要将鼠标移到组件上)
点击右上角即可分享
微信分享提示