$request_uri是内置提供的变量,就是请求的uri咯,consistent是一致性哈希算法,这个倒是可以说道说道。我们知道哈希就是无论输入什么值,都会得到一个固定长度的散列值,我们对不同的uri求散列值,如果后端服务器有6台服务器,然后给他们进行编号0-6,然后用求的散列值对6做取余运算,就一定会得到0-6中的一个值,然后把这个分配给对应编号的服务器。不过,这个算法有个问题,如果某个服务器挂掉,我们就得重新以5来做取余运算,然后重新把所有过程从来一遍。所以就出现了上面的一致性哈希算法,我们现在先不关注后端有几台服务器,我们把0到2的32次方减一这个多个数字分布在一个圆环上,就上钟表上的0-12一样,0的地方就是12.然后我们对后端每个服务器的ip地址做哈希计算,得到的值在和2的32次方做取余运算,那么后端的这些服务器一定会分布在这个圆环上的某个点处,然后我们在对hash选项指定的内容,此处是uri做hash计算,得到的值在和2的32次方取余,所以这些uri也会分布在这个圆环上。然后我们规定,在这个圆环上分布的服务器,负责响应它到它下一个服务器的区间上分布的请求。此时当后端的某台服务器挂掉时,只会影响这台服务器后面的URI请求,而不会影响其他服务器,只用把属于这台服务器的请求,给它上一台就好,我们画个图说明下。
我们用方块表示后端服务器经过哈希计算的分布情况,用红色的线表示不同uri请求的分布情况,服务器1只用负责1到2之间的uri请求,以此类推,5只用负责5到1之间的uri请求,如右图所示,假如2号服务器挂掉了,我们就把所有属于2号服务器的请求分配给1号服务器~好啦~这就是一致性哈希算法~~~很重要哟,许多地方都有用到。
除了支持web服务的负载均衡,nginx还支持其他服务的负载均衡,此时我们就得用到另外d的模块stream和stream_proxy_module。不过这两个模块必须得是1.9.13以上的版本~并且默认stream并没有加载。得在编译时加入--with-stream选项,不过如果我们用的是预编译的rpm包安装的话,默认是有这个的~以下是/etc/nginx/nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
stream {
upstream sshsrvs {
server 192.168.10.130:22;
server 192.168.10.131:22;
}
server {
listen 172.16.100.6:22202;
proxy_pass sshsrvs;
proxy_timeout 60s;
proxy_connect_timeout 10s;
}
}
我们启动或者重启nginx,然后我们就可以通过22202 访问后端的ssh服务了,MySQL服务也类似~当然是轮询访问啦~和上面的web服务类似。
下面关于Nginx的文章您也可能喜欢,不妨参考下:
CentOS 7.2下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1
CentOS 6.4安装配置Nginx+Pcre+php-fpm