点击蓝字

关注我们
认识Nginx集群方式
目前,为了减少单台服务器运算负荷以及单点故障的损失,越来越多的大型网站,都基于服务器集群上建立,服务器集群就是指将很多服务器集中起来一起进行同一种服务,在客户端看来就像是只有一个服务器,而本文将要介绍的集群方式便是Nginx集群。
基本概念
Nginx集群是将多个物理机器组成一个逻辑计算机,实现负载均衡和容错,实质就是由虚拟主机+反向代理+upstream分发模块组成,虚拟主机负责接受和响应请求,反向代理作用是带领用户去数据服务器拿数据,配置文件中upstream模块负责告诉Nginx去哪个数据服务器拿数据,基本数据走向如下:

1|反向代理主机Nginx接受客户机请求

2|找配置文件中upstream模块

3|upstream告诉一个数据服务器IP

4|Nginx向数据服务器转发用户的请求

5|数据服务器接受请求并处理请求

6|数据服务器响应请求给Nginx

7|Nginx响应请求给用户

配置文件中upstream模块及代理模块
通过上述对Nginx集群基本概念有了基本了解之后,我们知道,实现Nginx集群就少不了Nginx中的负载均衡模块upstream以及反向代理模块,这两个模块都是在Nginx的配置文件nginx.conf进行配置,配置示例如下:
http {# ...upstream tomcat{server 127.0.0.1:9000;server 127.0.0.1:9002;}# ...}
上面的代码表示:我们选取了两个服务器主机,分别是127.0.0.1:9000和127.0.0.1:9002,这两个主机就是我们准备用来接收前端请求的负载机,当然你有多个负载机都可以写入里面。
在设置好负载均衡upstream模块之后,我们就可以在server节点中配置反向代理,让前端的请求能够代理到上面配置的负载机上,示例如下:
server {# ...location / {root html;index index.html index.htm;proxy_pass http://tomcat;}# ...}
这里的proxy_pass配置应为http://+upstream名称。
分发方式
在介绍Nginx集群概念时,我们提到反向代理去找配置文件中upstream模块“问去哪拿数据,upstream告诉一个数据服务器IP,而具体告诉是哪一个数据服务器ip也是遵循设置的分发方式,常见的分发方式有:轮询分发方式、基于权重分发方式、基于ip_hash分发方式、基于开发语言的分发方式、基于浏览器的分发方式、基于源地址的分发方式。

|1)轮询分发方式
轮询是upstream的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器,如果某个后端服务器down掉后,能自动剔除,配置实例如下:
upstream example {server 192.168.1.101:8888;server 192.168.1.102:8888;server 192.168.1.103:8888;}

|2)基于权重分发方式
轮询的加强版,即可以指定轮询比率,权重和访问几率成正比,主要应用于后端服务器异质的场景下,配置实例如下:
upstream example {server 192.168.1.101 weight=1;server 192.168.1.102 weight=2;server 192.168.1.103 weight=3;}

|3)基于ip_hash分发方式
每个请求按照访问ip(即Nginx的前置服务器或者客户端IP)的hash结果分配,这样每个访客会固定访问一个后端服务器,可以解决session一致问题,配置实例如下:
upstream example {ip_hash;server 192.168.1.101:7777;server 192.168.1.102:8888;server 192.168.1.103:9999;}

|4)基于开发语言的分发方式
常见开发语言的后缀aspaspx php jsp html,基于使用使用的开发语言进行分配服务器可以将不同语言开发的程序交给特定的语言环境来执行,配置实例如下:
http {upstream php {server 192.168.1.101;}upstream jsp {server 192.168.1.102;}upstream html {server 192.168.1.103;}location~ * \ .php$ {proxy_pass http : //php; #访问php结尾的,分发到101}location~ * \ .jsp$ {proxy_pass http : //jsp; #访问jsp结尾的,分发到102}location ~ * \ .html${proxy_pass http : //html; #访问html结尾的,分发到103}

|5)基于浏览器的分发方式
基于浏览器的分发,按照在不同平台(手机、PC)的浏览器请求进行分发,配置实例如下:
upstream mobile{ip_hash;server 192.168.1.101}upstream pc {ip_hash;server 192.168.1.102}// 在定义server的时进行location规则判断server {listen 80;server_name 192.168.1.100; // (分发主机)location / {if ($http_user_agent~ * Elinks) {proxy_pass http : //mobile; 来自Elinks浏览器的请求,交给mobile来处理}if ($http_user_agent~ * Mozilla) {proxy_pass http : //pc; 来自Mozilla类型的浏览器的请求,交给pc处理,IE和火狐都属于Mozilla}}}

|6)基于源地址的分发方式
类似进入联通移动的网站,不同城市地区不同页面,这就是服务器根绝IP地址来了解本人当前所在位置,然后将请求分发到对应的服务器所实现的,配置实例如下:
upstream gx.server {ip_hash;server 192.168.1.101 //定义gx的IP访问的服务器}upstream gd.server {ip_hash;server192.168.1.102 //定义gd的IP访问的服务器}upstream default.server {ip_hash;server 192.168.1.1003//定义其他地区访问的服务器}//定义一个IP库geo$geo {defaultdefault;192.168.2.0 / 24gx;192.168.3.0 / 24gd; //定义gx和gd的IP段}//在server里添加loscation规则example location / {proxy_pass http : //$geo.server$request_uri}





