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;
}
相关推荐
羑悻的小杀马特6 分钟前
环境变量简介
linux
跳跳的向阳花7 分钟前
03-03、SpringCloud第三章,负载均衡Ribbon和Feign
spring cloud·ribbon·负载均衡
小陈phd39 分钟前
Vscode LinuxC++环境配置
linux·c++·vscode
运维&陈同学42 分钟前
【zookeeper01】消息队列与微服务之zookeeper工作原理
运维·分布式·微服务·zookeeper·云原生·架构·消息队列
是阿建吖!43 分钟前
【Linux】进程状态
linux·运维
hzyyyyyyyu1 小时前
内网安全隧道搭建-ngrok-frp-nps-sapp
服务器·网络·安全
明明跟你说过1 小时前
Linux中的【tcpdump】:深入介绍与实战使用
linux·运维·测试工具·tcpdump
Komorebi.py2 小时前
【Linux】-学习笔记05
linux·笔记·学习
Mr_Xuhhh2 小时前
重生之我在学环境变量
linux·运维·服务器·前端·chrome·算法