引言
在官方文档中可以看到Nginx负载均衡是通过upstream模块来实现的,内置实现了三种负载策略:轮询,最少连接,IpHash,可以满足常用场景,优化nginx反向代理,其中还涉及到一个重要参数weight,用于给对应服务加权,数字越高执行概率越大。在查阅资料时还看到了通过第三方实现的两种策略(fair、url_hash)本文中暂不讨论。
实现方式
下面举几个例子看一下具体配置方式,注意upstream模块要配置在server外面,一般配置在跟server同级的上方,server调用我会统一写在最后,可以复制使用。
轮询策略
upstream pollServer {
#本地服务
server 127.0.0.1:8080 weight=5;
#远程服务
server 192.168.50.1:8080 weight=1;
server 192.168.50.2:8080 weight=6;
# 权重值越大执行概率越高
}
最少连接策略
upstream leastServer {
#策略配置关键字
least_conn;
#本地服务
server 127.0.0.1:8080;
#远程服务
server 192.168.50.1:8080;
server 192.168.50.2:8080;
}
IP_Hash策略
upstream hashServer {
#根据ip保持同一用户始终处于同一节点
hash $request_uri consistent
#策略配置关键字
ip_hash;
#本地服务
server 127.0.0.1:8080;
#远程服务
server 192.168.50.1:8080;
server 192.168.50.2:8080;
}
IP_Hash策略有一个比较常见的坑,所有经过反向代理的请求ip都会变成本机ip,需要在http层内,server层同级加入这一句代码以便获取客户端真实IPproxy_set_header X-Real-IP $remote_addr;
最后就是从请求进来这个服务到三种策略调用的过程和解析:
写一个server
server {
#侦听www.test.com的80端口
listen 80;
server_name www.test.com;
# 拦截www.test.com/poll/*的请求
location /poll/ {
access_log logs/poll.log;# 日志记录
# include /usr/local/nginx/conf/conf.d/*.conf;#引入其他配置
# 代理到pollServer轮询策略
proxy_pass http://pollServer/;
}
# 拦截www.test.com/least/*的请求
location /least/ {
access_log logs/least.log;
# 代理到leastServer轮询策略
proxy_pass http://leastServer/;
}
# 拦截www.test.com/hash/*的请求
location /hash/ {
access_log logs/hash.log;
# 代理到hashServer轮询策略
proxy_pass http://hashServer/;
}
}