jjzjj

Nginx的6种负载均衡策略

怀中猫yy 2025-05-11 原文

Nginx的6种负载均衡策略【轮询/加权轮询weight/ip_hash/least_conn/urlhash/fair】

总结:nginx负载均衡策略

1、轮询策略

轮询策略其实是一个特殊的加权策略,不同的是,服务器组中的各个服务器的权重都是1

upstream backend {
server 192.168.136.136 weight=1;
server 192.168.136.136:81 weight=1;
server 192.168.136.136:82 weight=1;
server 192.168.136.136:83 weight=1;
}

server {
    listen       80;
    server_name  localhost;

    location / {
        proxy_pass  http://backend;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }

}

2、轮询加权策略

通过加入 weight的值进行加权处理,权重值越大,服务器越容易被访问,因此,性能好的服务器应适当加大权重值

upstream backend {
server 192.168.136.136 weight=1;
server 192.168.136.136:81 weight=2;
server 192.168.136.136:82 weight=3;
server 192.168.136.136:83 weight=4;
}

server {
    listen       80;
    server_name  localhost;

    location / {
        proxy_pass  http://backend;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }

}

3、ip 哈希策略

ip_hash 策略能够将某个客户端IP的请求固定到同一台服务器上,例如A用户访问服务器,通过固定算法后,被固定到 192.168.136.136 的web服务器上,那么,用户A下次访问时,依旧会到访问 192.168.136.136 服务器。因此,该策略解决了多台服务器Session不共享的问题【因为不同的客户端会被分到不同的服务器,且之后这种对应关系是不变的】

ip_hash 策略类似于url_hash ,一个采用Ip地址进行计算,一个采用URL地址进行计算。

upstream backend {
ip_hash;
server 192.168.136.136 ;
server 192.168.136.136:81;
server 192.168.136.136:82 ;
server 192.168.136.136:83;
}

server {
    listen       80;
    server_name  localhost;

    location / {
        proxy_pass  http://backend;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }

}

该算法不能保证服务器的负载均衡,可能存在个别服务器访问量很大,很小的情况.

另外,实际生产环境不建议使用此算法,如果要解决session共享的问题,我们可以使用第三方中间件 redis 来完成共享问题
4、least_conn 策略

最少连接,把请求转发给连接数最少的服务器。

轮询算法/轮询加权算法会把请求按照一定比例分发请求到各服务器上,但是,有些请求占用时间长,如果把这些响应占用时间长的请求大比例发送到了某一台服务器,那么这台服务器随着时间的增加会负载比较高【因为响应较长的请求还没处理完,新的请求又来了】,在这种情况下,采用 least_conn 的方式是最适合的,它能达到更好的负载均衡

upstream backend {
least_conn;
server 192.168.136.136 ;
server 192.168.136.136:81;
server 192.168.136.136:82 ;
server 192.168.136.136:83;
}

server {
    listen       80;
    server_name  localhost;

    location / {
        proxy_pass  http://backend;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }

}

此负载策略适合用于,请求处理时间长短不一造成服务器过载的情况
5、url_hash 策略

url_hash 和 ip_hash 类似,不同的是,客户端ip可能变,但客户端发送的请求URL不同功能模块虽说不同,但同一个功能点的URL是固定不变的

该算法主要是解决 缓存命中率的问题【例如下载文件】

upstream backend {
hash $request_uri;
server 192.168.136.136 ;
server 192.168.136.136:81;
server 192.168.136.136:82 ;
server 192.168.136.136:83;
}

server {
    listen       80;
    server_name  localhost;

    location / {
        proxy_pass  http://backend;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }

}

注:配置文件中不是 url_hash ,而是 hash $request_uri;
6、智能的fair 策略【Nginx默认不支持,需下载第三方模块】

fair 采用的不是固定的轮询算法进行负载均衡,而是智能的根据页面大小、加载时间长短进行负载计算

upstream backend {
fair;
server 192.168.136.136 ;
server 192.168.136.136:81;
server 192.168.136.136:82 ;
server 192.168.136.136:83;
}

server {
    listen       80;
    server_name  localhost;

    location / {
        proxy_pass  http://backend;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }

}

注: 该策略,在nginx的默认模块中是不支持的,需要下载 nginx-upstream-fair 模块

修改nginx配置文件,重新加载时,报错

有关Nginx的6种负载均衡策略的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby-on-rails - 如何用不同的用户运行nginx主进程 - 2

    A/ctohttp://wiki.nginx.org/CoreModule#usermaster进程曾经以root用户运行,是否可以以不同的用户运行nginxmaster进程? 最佳答案 只需以非root身份运行init脚本(即/etc/init.d/nginxstart),就可以用不同的用户运行nginxmaster进程。如果这真的是你想要做的,你将需要确保日志和pid目录(通常是/var/log/nginx&/var/run/nginx.pid)对该用户是可写的,并且您所有的listen调用都是针对大于1024的端口(因为绑定(

  3. ruby-on-rails - 覆盖 Controller 中的 protect_from_forgery 策略 - 2

    我想使用两种不同的protect_from_forgery策略构建一个Rails应用程序:一种用于Web应用程序,一种用于API。在我的应用程序Controller中,我有这行代码:protect_from_forgerywith::exception为了防止CSRF攻击,它工作得很好。在我的API命名空间中,我创建了一个继承self的应用程序Controller的api_controller,它是API命名空间中所有其他Controller的父类,我将上面的代码更改为:protect_from_forgery:null_session.遗憾的是,我在尝试发出POST请求时遇到错误:“

  4. ruby-on-rails - Websocket-rails 不适用于 Nginx 和 Unicorn 的生产环境 - 2

    我有带有gemwebsocket-rails0.7的Rails3.2应用程序。在开发机上,一切正常在生产环境中,我使用Nginx/1.6作为代理服务器,Unicorn作为http服务器。Thin用于独立模式(在https://github.com/websocket-rails/websocket-rails/wiki/Standalone-Server-Mode之后)。nginx配置:location/websocket{proxy_passhttp://localhost:3001/websocket;proxy_http_version1.1;proxy_set_headerUp

  5. ruby - 没有 nginx 的 Puma - 同一 IP 上的多个 ruby​​ 应用程序 :PORT - 2

    Nginx在生产中的重要性通常基于它为慢速客户端提供服务的能力;在RESTfulAPI的设置中,它似乎是生产堆栈的一个不必要的层,尤其是Puma(不像广泛使用的unicorn可以处理nginx工作)。Pumacanallowmultipleslowclientstoconnectwithoutrequiringaworkertobeblockedontherequesttransaction.Becauseofthis,Pumahandlesslowclientsgracefully.HerokurecommendsPumaforuseinscenarioswhereyouexpect

  6. ruby-on-rails - EC2 实例在负载均衡器中停止服务 - 2

    我有一个EC2实例正在运行。我有一个负载均衡器,它与EC2实例相关联。PingTarget:HTTP:3001/healthCheckTimeout:5secondsInterval:24secondsUnhealthythreshold:2Healthythreshold:10现在该实例显示为OutofService。我什至尝试更改监听端口等等。一切正常,直到重新启动我的EC2实例。任何帮助将不胜感激。仅供引用:我有一个在端口3001上运行的Rails应用程序,我有一个用于HTTP:80(loadbalancer)到HTTP:3001的监听器。我还在终端中通过ssh检查了正在运行的应

  7. ruby-on-rails - Foreman无法启动Nginx,但我可以手动启动。为什么? - 2

    我目前正在运行Foreman在暂存(Ubuntu)上,一旦我开始工作,就会切换到使用upstart。我的Procfile.staging看起来像这样:nginx:sudoservicenginxstartunicorn:bundleexecunicorn-c./config/unicorn.rbredis:bundleexecredis-serversidekiq:bundleexecsidekiq-v-C./config/sidekiq.yml我可以使用以下方法成功启动nginx:$sudoservicenginxstart然而,当我运行$foremanstart时,当其他三个进程成

  8. ruby-on-rails - 负载测试期间 Unicorn CPU 使用率激增,优化方法 - 2

    我对为我的RubyonRails3.1.3应用优化我的Unicorn设置的方法很感兴趣。我目前正在高CPU超大实例上生成14个工作进程,因为我的应用程序在负载测试期间似乎受CPU限制。在模拟负载测试中,每秒大约20个请求重放请求,我的实例上的所有8个内核都达到峰值,盒子负载飙升至7-8个。每个unicorn实例使用大约56-60%的CPU。我很好奇可以通过哪些方式对其进行优化?我希望能够每秒将更多请求汇集到这种大小的实例上。内存和所有其他I/O一样完全正常。在我的测试过程中,CPU越来越低。 最佳答案 如果您受CPU限制,您希望使用

  9. Linux操作系统CentOS7安装Nginx[详细版] - 2

    Nginx安装1.官网下载Nginx2.使用XShell和Xftp将压缩包上传到Linux虚拟机中3.解压文件nginx-1.20.2.tar.gz4.配置nginx5.启动nginx6.拓展(修改端口和常用命令)(一)修改nginx端口(二)常用命令1.官网下载Nginxhttp://nginx.org/en/download.html这里我下载的是1.20.2版本,大家按需下载对应稳定版即可2.使用XShell和Xftp将压缩包上传到Linux虚拟机中没有XShell可以参考《Linux操作系统CentOS7连接XShell》3.解压文件nginx-1.20.2.tar.gz1)检查是否存

  10. 最强Http缓存策略之强缓存和协商缓存的详解与应用实例 - 2

    HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地,以便下次请求时能够直接从缓存中获取资源,从而减少网络请求次数,提高网页的加载速度和用户体验。缓存分为强缓存和协商缓存两种模式。一.强缓存强缓存是指浏览器直接从本地缓存中获取资源,而不需要向web服务器发出网络请求。这是因为浏览器在第一次请求资源时,服务器会在响应头中添加相关缓存的响应头,以表明该资源的缓存策略。常见的强缓存响应头如下所述:Cache-ControlCache-Control响应头是用于控制强制缓存和协商缓存的缓存策略。该响应头中的指令如下:max-age:指定该资源在本地缓存的最长有效时间,以秒为单位。例如:Ca

随机推荐