Nginx负载均衡配置

介绍

早期的网站流量和业务功能都比较简单,单台服务器就可以满足基本需求,但是随着互联网的发展,业务流量越来越大并且业务逻辑也越来越复杂,单台服务器的性能及单点故障问题就凸显出来了,因此需要多台服务器组成应用集群,进行性能的水平扩展以及避免单点故障出现。

根据上图,将会使用Nginx来实现负载均衡,而Nginx的负载均衡是基于反向代理的,只不过此时所代理的服务器不是一台,而是多台。

接下来跟大家分享一下关于Nginx负载均衡的配置

轮询

Nginx将所有请求均匀的分给集群中的每台服务器。

bash 复制代码
upstream web_app {
server 192.168.10.2:7001;
server 192.168.10.3:7001;
}

server {
listen 80;
server_name localhost;

location / {
 proxy_pass http://web_app/;
}
}

upstream:定义一个服务集群。upstream定义服务集群时,配置的服务地址只能是 域名+端口 或者 ip+端口,不能带有协议和路径,否则nginx会报 invalid host in upstream这个错误信息。

proxy_pass: 将匹配的请求代理转发到proxy_pass后面配置的服务上,这里因为需要配置负载均衡,所以这里http://后面必须要跟上upstream定义的服务集群

权重(weight)

bash 复制代码
upstream test {
server 192.168.10.2:7001 weight=2;
server 192.168.10.3:7001 weight=1;
}

前面两次请求都会转发到192.168.10.2:7001,后面一次请求会转发到192.168.10.3:7001

如果继续请求,依然是前面两次转发到192.168.10.2:7001,后面一次转发到192.168.10.3:7001

ip_hash

根据用户的ip,计算出一个hash值,如果负载均衡缓存中有这个hash对应的服务器,则直接转发到对应的服务器上。

bash 复制代码
upstream test {
ip_hash;
server 192.168.10.2:7001;
server 192.168.10.3:7001;
}

使用ip_hash策略后,只要用户的电脑ip不发生变化,就会始终请求同一台服务器。

hash

根据请求的uri计算出一个hash值,然后将该请求转发到一台服务器上面,后续请求通过hash计算后,如果有相同的hash,那么就会将该请求转发到该hash对应的服务器上面。

可以进行hash计算的有remote_addr(客户端ip)、request_uri(请求uri)、args(请求参数)。

bash 复制代码
upstream test {
hash $request_uri;
server 192.168.10.2:7001;
server 192.168.10.3:7001;
}

另外:

如果 request1 命中了 192.168.10.2 服务器,如果 192.168.10.2 服务器宕机,之前通过 request1 计算出来的哈希值与 192.168.10.2 服务器的对应关系会失效,并且 request1 会重新分发给 192.168.10.3 服务器。后续 192.168.10.2 服务器恢复正常后,request1 还是会分配给 192.168.10.3 服务器。

least_conn

把请求转发给连接数较少的服务器。轮询算法是把请求平均地转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。此负载均衡适合请求处理时间长短不一造成服务器过载的情况。

bash 复制代码
upstream test {
least_conn;
server 192.168.10.2:7001;
server 192.168.10.3:7001;
}

max_fails

允许服务处理请求时服务出错的次数,默认为1。当服务处理请求发生错误的次数超过max_fails时,后面的请求暂时不会转发到这台发生错误的服务器。

bash 复制代码
upstream test {
server 192.168.10.2:7001 max_fail=100;
server 192.168.10.3:7001;
}

此时,如果192.168.10.2这台服务器在处理请求时,出现了100次错误,那么后续所有的请求都会被转发到192.168.10.3这台服务器上面。

fail_timeout

如果某个服务处理请求时发生错误的次数超过 max_fails,nginx 将暂时禁止将请求转发到该服务。当达到fail_timeout设置的时间后,nginx会尝试将请求转发到刚才被禁止的服务,如果服务正常,那么后续的请求可以继续转发到这台服务,如果服务错误,那么继续等待fail_timeout时间后再来检测。fail_timeout默认时间是10s。

bash 复制代码
upstream test {
server 192.168.10.2:7001 max_fail=100 fail_timeout=30s;
server 192.168.10.3:7001;
}

此时,如果192.168.10.2这台服务器在处理请求时,出现了100次错误,那么后续所有的请求都会被转发到192.168.10.3这台服务器上面,当30秒以后,会重新将请求转发到192.168.10.2这台服务器上面,如果192.168.10.2这台服务器处理请求时依然达到了100次错误,将继续被禁止30秒。

down

标识down的服务器暂时不支持被请求。

bash 复制代码
upstream test {
server 192.168.10.2:7001 down;
server 192.168.10.3:7001;
}

此时,所有请求都会被转发到192.168.10.3这台服务器上面。

backup

备用服务器,当所有非backup服务发生错误被停用或者设置为down时,nginx会启用标识为backup的服务器。

bash 复制代码
upstream test {
server 192.168.10.2:7001 backup;
server 192.168.10.3:7001;
}

max_conns

单一服务器同时处理请求的个数。

bash 复制代码
upstream test {
server 192.168.10.2:7001 max_conns=50000;
server 192.168.10.3:7001;
}
相关推荐
玉树临风江流儿2 分钟前
Linux驱动开发(速记版)--设备模型
linux·驱动开发
杰哥在此15 分钟前
Python知识点:如何使用Multiprocessing进行并行任务管理
linux·开发语言·python·面试·编程
枫叶丹42 小时前
【在Linux世界中追寻伟大的One Piece】进程信号
linux·运维·服务器
刻词梨木2 小时前
ubuntu中挂载点内存不足,分配不合理后使用软链接的注意事项
linux·运维·ubuntu
灯火不休ᝰ3 小时前
[win7] win7系统的下载及在虚拟机中详细安装过程(附有下载文件)
linux·运维·服务器
数云界6 小时前
如何在 DAX 中计算多个周期的移动平均线
java·服务器·前端
加油,旭杏6 小时前
【中间件学习】fastCG介绍和使用
学习·nginx·fastcgi
powerfulzyh7 小时前
Ubuntu24.04远程开机
linux·ubuntu·远程工作
ulimpid7 小时前
Command | Ubuntu 个别实用命令记录(新建用户、查看网速等)
linux·ubuntu·command
HHoao7 小时前
Ubuntu启动后第一次需要很久才能启动GTK应用问题
linux·运维·ubuntu