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;
}
相关推荐
格调UI成品12 分钟前
预警系统安全体系构建:数据加密、权限分级与误报过滤方案
大数据·运维·网络·数据库·安全·预警
盘古开天16661 小时前
如何用废弃电脑变成服务器搭建web网站(公网访问零成本)
服务器·电脑·免费公网ip
xuanzdhc4 小时前
Linux 基础IO
linux·运维·服务器
愚润求学4 小时前
【Linux】网络基础
linux·运维·网络
bantinghy4 小时前
Linux进程单例模式运行
linux·服务器·单例模式
小和尚同志5 小时前
29.4k!使用 1Panel 来管理你的服务器吧
linux·运维
帽儿山的枪手5 小时前
为什么Linux需要3种NAT地址转换?一探究竟
linux·网络协议·安全
就叫飞六吧9 天前
基于keepalived、vip实现高可用nginx (centos)
python·nginx·centos
shadon1789 天前
回答 如何通过inode client的SSLVPN登录之后,访问需要通过域名才能打开的服务
linux
AWS官方合作商9 天前
AWS ACM 重磅上线:公有 SSL/TLS 证书现可导出,突破 AWS 边界! (突出新功能的重要性和突破性)
服务器·https·ssl·aws