Nginx-Cluster 构建

时间:2024-09-06 14:03:02

nx-Cluster and ReverseProxyServer
-----------ReProxy-------------------------Client-----------
192.168.56.202 nginx 192.168.56.200 nginx+phpMyAdmin
| 192.168.56.201 nginx
nginx 这个轻量级、高性能的 web server 主要可以干两件事情:
〉直接作为http server(代替apache,对PHP需要FastCGI处理器支持);
〉另外一个功能就是作为反向代理服务器实现负载均衡

环境:
Nginx反向代理 192.168.56.202
Nginx+php-fpm+MySql 192.168.56.201 index.php-server2
Nginx+php-fpm+MySql 192.168.56.200 index.php-server1 phpMyAdmin
针对不同请求de负载均衡:
a. 在最简单地构建反向代理的时候 (nginx仅仅处理静态不处理动态内容,动态内容交给后台的apache server来处理),我们具体的设置为:
在nginx.conf中修改:
location ~ \.php$ {
proxy_pass http://192.168.56.201:80;
}

测试:http://192.168.56.202/index.php 正常打开server2动态页面
http://192.168.56.202/index.html 正常打开代理服务静态页面

如上是最为简单的使用nginx做为反向代理服务器的例子;
b. 我们现在对如上例子进行扩展,使其支持如上的两台服务器。
location ^~ /phpmyadmin/ {
proxy_pass http://192.168.56.200:80;
}
location ~ \.php$ {
proxy_pass http://192.168.56.201:80;
}
测试:http://192.168.56.202/index.php 正常打开server2动态页面
http://192.168.56.202/phpmyadmin 正常打开phpMyAdmin页面

上面第一个部分location ^~ /phpMyAdmin/,表示不使用正则表达式匹配(^~),而是直接匹配,也就是如果客户端访问的 URL是以
http://192.168.56.202/ phpmyadmin 开头的话(本地的nginx目录下根本没有phpMyAdmin目录),nginx会自动pass到127.0.0.1:80 的nginx服务
器,该服务器对phpMyAdmin目录下的页面进行解析,然后将结果发送给nginx,后者显示;
因此综上,我们实现了针对不同请求的负载均衡。
  〉如果用户访问静态页面index.html,最前端的nginx直接进行响应;
  〉如果用户访问index.php页面的话,192.168.56.201:80 的Nginx进行响应;
  〉如果用户访问目录phpMyAdmin下的页面的话,192.168.56.200:80 的Nginx进行响应;

3)访问同一页面 的负载均衡:
  即用户访问http://192.168.56.202/index.php 这个同一页面的时候,我们实现两台服务器的负载均衡 (实际情况中,这两个服务器上的数
据要求同步一致,这里我们分别定义了打印server1和server2是为了进行辨认区别)。

http模块内--定义服务器
upstream myCluster {
server 192.168.56.200:80;
server 192.168.56.201:80;
}
server模块内--定义集群
location ~ \.php$ {
proxy_pass http://myCluster; //于上面cluster定义名称相同
proxy_redirect off;
proxy_set_header Host $host; //返回主机名
proxy_set_header X-Real-IP $remote_addr; //真实ip
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; //启动转发
}
测试:http://192.168.56.202/index.php 正常打开动态页面,反复刷新页面反复出现Server1及Server2

这样的话,如果访问http://192.168.56.202/index.php 页面的话,nginx目录下根本没有该文件,但是它会自动将其pass到myCluster定义的服
务区机群中,分别由192.168.56.200:80;或者192.168.56.201:80;来做处理。
上面在定义upstream的时候每个server之后没有定义权重,表示两者均衡;如果希望某个更多响应的话例如:
upstream myCluster {
server 192.168.56.200:80 weight=5;
server 192.168.56.201:80;
}

这样表示5/6的几率访问第一个server,1/6访问第二个。另外还可以定义max_fails和fail_timeout等参数。
综上,我们使用nginx的反向代理服务器reverse proxy server的功能,将其布置到多台apache server的前端。
nginx仅仅用来处理静态页面响应和动态请求的代理pass,后台的apache server作为app server来对前台pass过来的动态页面进行处理并返回
给nginx。

通过以上的架构,我们可以实现nginx和Nginx构成的集群cluster的负载均衡。
两种均衡:
1)可以在nginx中定义访问不同的内容,代理到不同的后台server; 如上例子中的访问phpMyAdmin目录代理到第一台server上;访问
index.php代理到第二台server上;
2)可以在nginx中定义访问同一页面,均衡 (当然如果服务器性能不同可以定义权重来均衡)地代理到不同的后台server上。 如上的例子访问
indext.php页面,会均衡地代理到server1或者server2上。
实际应用中,server1和server2上分别保留相同的app程序和数据,需要考虑两者的数据同步。