分配方式
Nginx的upstream支持5种 分配方式,其中 轮询、权重、IP散列这三种为Nginx原生支持的分配方式,fair 和 url_hash 为第三方支持的分配方式。
1,轮询
轮询是upstream的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器,如果某个后端服务器 down 掉后,能自动剔除。
upstream zhang21(名称){
server 192.168.1.11:8888;
server 192.168.1.22:8888;
server 192.168.1.33:8888;
}
2,weight(权重)
轮询的加强版,既可以指定轮询比率,weight 和访问几率成正比,主要应用于后端服务器异质的场景下。
upstream zhang21 {
server 192.168.1.11 weight=1;
server 192.168.1.22 weight=2;
server 192.168.1.33 weight=3;
}
3,ip_hash
每个请求按照访问 Ip(即Nginx的前置服务器或客户端IP)的 hash结果分配,这样每个访客会固定访问一个后端服务器,可以解决 session 一致问题。
upstream zhang21 {
ip_hash;
server 192.168.1.11:7777;
server 192.168.1.22:8888;
server 192.168.1.33:9999;
}
4,fair
fair顾名思义,公平地按照后端服务器的响应时间(rt)来分配请求,响应时间(rt)小的后端服务器优先分配请求。
upstream zhang21 {
server 192.168.1.11;
server 192.168.1.22;
server 192.168.1.33;
}
5,url_hash
与 ip_hash类似,但是按照访问 url 的 hash 结果来分配请求,使得每个 url 定向到同一个后端服务器,主要应用于后端服务器为缓存的场景下。
upstream zhang21 {
server 192.168.1.11;
server 192.168.1.22;
server 192.168.1.33;
hash $request_uri;
hash_method crc32;
}
其中,hash_method为使用的hash算法,需要注意,此时server语句中不能添加 weight等参数。
设备状态
从上面可以看出upstream中server指令语法如下:
server address [ parameters ]
address可以是主机名、域名、ip或Unix Socket,也可以指定端口号;
parameters表示可选参数,有如下这些:
down,表示当前server已停用;
backup,表示当前server是备用服务器,只有其它非backup后端服务器都挂掉了或很忙才会分配请求给它;
weight,表示当前server负载权重,权重越大几率愈高;
max_fails 和 fail_timeout 一般会关联使用,如果某台server在 fail_timeout 时间内出现了 max_fails 次连接失败,那么Nginx会认为其已经挂掉,从而在 fail_timeout 时间内不再去请求它,fail_timeout默认是 10s,max_fails默认是1,即默认情况只要是发生错误就认为服务器挂了,如果将max_fails设置为0,则表示取消这项检查。
举个栗子
四台主机,一台处理转发,另外三台为后端处理服务器。
192.168.1.11 #前
192.168.1.22
192.168.1.33
192.168.1.44
在 1.11上的简单配置
在nginx.conf的http{ }下;
upstream zhang21 {
server 192.168.1.22;
server 192.168.1.33;
server 192.168.1.44;
}
在虚拟主机server { } 中配置;
location / {
root html;
index index.html index.htm;
proxy_pass http://zhang21(upstream名称);
}
在三台后台主机上的简单配置
配置虚拟主机server { };
server {
listen 80;
root /var/www;
location / {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include fastcgi_params;
}
}