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;
}
相关推荐
奔跑的架构师1 小时前
[A-50]ARMv9/v8-DVFS系统架构
linux·arm开发·架构·系统架构·arm
迷途呀1 小时前
CI/CD 自动化部署实践:让代码提交后自动上线
linux·运维·nginx·ci/cd·自动化
闲云自留地1 小时前
动手玩 Nova:Hypervisor、主机聚合、可用分区、虚拟机生命周期实操
运维·架构·openstack
赴生-2 小时前
Liunx 操作系统 进程概念(上)
linux
binqian2 小时前
【linux】OpenSSH升级文档
linux·运维·网络
吴声子夜歌2 小时前
Shell编程——if条件语句
linux·运维·shell
和裕2 小时前
蜂窝板 vs 七层瓦楞重型纸箱:大件工业设备运输性能与成本全对比
大数据·运维·网络·人工智能·算法
Dawn-bit2 小时前
Linux 运维基础扩展:跳板机、堡垒机与物理服务器全流程
linux·运维·服务器·云计算·运维开发
新时代牛马2 小时前
Linux 定时任务:crontab、anacron 与systemd timer
linux·运维·服务器
IT摆渡者3 小时前
1panel 配置申请手动解析网站SSL证书
服务器·网络协议·ssl