1、配置负载均衡
配置语法
syntax: upstream name{...}
default: -
context:http
2、 小 demo
将 ip 为 192.168.43.101 主机上的 nginx 修改 default.conf 如下
upstream centos113 {
server 192.168.43.113:8001;
server 192.168.43.113:8002;
server 192.168.43.113:8003;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
proxy_pass http://centos113;
include proxy_params;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
在 ip 为 192.168.43.113 的主机上 启动 监听 3 个不同端口的服务,分别是 8001,8002,8003,作为 被代理的服务
server1.conf 配置如下,监听 8001
server {
listen 8001;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /opt/nginx/app/code;
index 1.html;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server2.conf 配置如下,监听 8002
server {
listen 8002;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /opt/nginx/app/code;
index 2.html;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server3.conf 配置如下,监听 8003
server {
listen 8003;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /opt/nginx/app/code;
index 3.html;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
下面在浏览器地址栏中,输入 http://192.168.43.101
连续刷新几次,你会发现页面出现不同的变化
3、模拟某个服务 down 掉
通过 防火墙 拦截,编写对应的 iptables 规则
[root@CentOS6 conf.d]# iptables -I INPUT -p tcp --dport 8002 -j DROP
[root@CentOS6 conf.d]#
这时刷新 http://192.168.43.101,只会显示 1.html 和 3.html,因为 8002 被防火墙拦截,请求超时后,nginx 会认为它已经 down 掉了。
如果通过 iptables 规则,放开 8002 端口拦截,nginx 检测到 8002 端口能够正常访问后,又恢复了 1.html ,2.html 和 3.html 轮询加载
[root@CentOS6 conf.d]# iptables -I INPUT -p tcp --dport 8002 -j ACCEPT
[root@CentOS6 conf.d]#
4、upstream 配置项详解
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
server backup1.exmple.com:8080 backup;
server backup2.example.com:8080 backup;
}
- backend:跟在 upstream 后面,表示一组虚拟服务的名字,这个名字是自定义的 如 ‘cenos113’ ,它的大括号中,加的是每一个 server,
- 每个 server 的配置: 不仅支持域名(如: backup1.exmple.com:8080 ),也支持 ip (如:192.168.43.113:8001 ),也支持 socket 方式(如:unix:/tmp/backend3 )
- weight:用于配置该 server 对应的 权重,对应轮询方式而言,权重越大,请求分配到这个 server 的机率越高。
- backup:表示这个 server 是预留的 备份服务器,在其他成员存活的情况下,这个 backup 节点不对外提供服务,当同组的其他所有节点无法提供服务时,backup 节点就会被利用起来提供服务。
后端服务器在负载均衡调度中的状态
修改 ip 为 192.168.43.101 主机上的 nginx 修改 default.conf 如下
upstream centos113 {
server 192.168.43.113:8001 down;
server 192.168.43.113:8002 weight=3;
server 192.168.43.113:8003 max_fails=1 fail_timeout=10s;
server 192.168.43.113:8004 backup;
}
5、nginx 调度算法
5.1、权重 weight
upstream centos113 {
server 192.168.43.113:8001 down;
server 192.168.43.113:8002 weight=3;
server 192.168.43.113:8003 weight=2 max_fails=1 fail_timeout=10s;
server 192.168.43.113:8004 backup;
}
5.2、ip_hash,注意:得要 去掉 backup,去掉 weight
upstream centos113 {
ip_hash;
server 192.168.43.113:8001 down;
server 192.168.43.113:8002;
server 192.168.43.113:8003 max_fails=1 fail_timeout=10s;
server 192.168.43.113:8004 backup;
}
5.3、least_conn 最小连接,哪台 server 的连接数最小,则分发给该 server
upstream centos113 {
least_conn;
server 192.168.43.113:8001 down;
server 192.168.43.113:8002;
server 192.168.43.113:8003 max_fails=1 fail_timeout=10s;
server 192.168.43.113:8004 backup;
}
5.4、通过 hash key 的方式配置 url_hash ,注意:此时 upstream 中 不支持 backup 配置
配置语法
syntax: hash key [consistent];
default:-
context:upstream
this directive appeared in version 1.7.2
- key:表示用于进行 hash 变量,如 $request_uri
upstream centos113 {
hash $request_uri;
server 192.168.43.113:8001 weight=5;
server 192.168.43.113:8002;
server 192.168.43.113:8003 max_fails=1 fail_timeout=10s;
server 192.168.43.113:8004;
}
这里配置的时,当每一次请求的 uri 相同时,会代理到同一台 server 上。
同理,我们也可以 通过 正则表达式,提取 $request_uri 上的某一个参数或者值 来进行 hash。