盒子
盒子
Posts List
  1. 一.环境准备
  2. 二.nginx配置集群
  3. 三.两台服务器分别开启apache服务
  4. 四.php_curl模拟http请求

nginx负载均衡之旅

一.环境准备

nginx最强大的功能就在于反向代理与负载均衡,今天准备实地感受一下。

我对正向代理,反向代理的理解:

正向代理:代理服务器服务的是用户,代理服务器从内容服务器取回数据给用户。

反向代理:代理服务器服务的对象不是用户,而是其他内容服务器。用户访问反向代理服务器(nginx服务器),由反向代理服务器决定转发给哪台服务器处理请求。


准备三台内网服务器,ip分别是:

192.168.1.112 (安装开启apache)

192.168.1.102 (安装开启apache)

192.168.1.106 (安装开启nginx)

二.nginx配置集群

修改nginx.conf配置,位置在/usr/local/etc/nginx/nginx.conf下,增加服务器集群cmssp

upstream cmssp{
server 192.168.1.112;
server 192.168.1.102;
#fair;
#url_hash;
#ip_hash;
order;
}

三条server分别代表三台服务器

fair , url_hash , ip_hash , order
分别代表四中负载均衡规则,这里不详细介绍。

修改服务器分发配置

server {
listen 80;
server_name localhost;
root /Users/hucaihua/Documents/code/cmssp/server/;
location / {
#index index.html index.htm index.php;
#include /usr/local/etc/nginx/conf.d/php-fpm;
proxy_pass http://cmssp;
}
}

注意:proxy_pass的意思就是当收到代表location 过滤规则的请求时,转发给cmssp集群,也就是上面配置的upstream cmssp集群,名字随意取。

修改完成后,测试配置是否正确

nginx -t

三.两台服务器分别开启apache服务

为了区分不同服务器,我分别对不同服务器返回不同的内容,php内容基本如下:

<?php
echo "I am server xxx , ip is :xxxx";

四.php_curl模拟http请求

由于默认情况下,nginx使用的负载均衡规则是ip_hash,也就是同一ip转发给相同服务器处理。因此需要模拟不同的ip 发起http请求.

模拟代码如下:

<?php
function task() {
$url = "http://192.168.1.106/index.php";
$curl = curl_init();
for($i = 0 ;$i < 10 ; $i++){
sleep(0.05);
$headers = randIp();
echo " http request :".$i."\t ip is " . implode(".",$headers )."\r\n";
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_BINARYTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0"); //模拟浏览器类型
curl_setopt($curl, CURLOPT_TIMEOUT, 300); // 设置超时限制防止死循环
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
$tmpInfo = curl_exec($curl);
echo " response: ".$tmpInfo."\r\n";
}
if (curl_errno($curl)) {
print "Error: " . curl_error($curl);
} else {
curl_close($curl);
}
}
//此函数提供了国内的IP地址
function randIP(){
$ip_long = array(
array('607649792', '608174079'), //36.56.0.0-36.63.255.255
array('1038614528', '1039007743'), //61.232.0.0-61.237.255.255
array('1783627776', '1784676351'), //106.80.0.0-106.95.255.255
array('2035023872', '2035154943'), //121.76.0.0-121.77.255.255
array('2078801920', '2079064063'), //123.232.0.0-123.235.255.255
array('-1950089216', '-1948778497'), //139.196.0.0-139.215.255.255
array('-1425539072', '-1425014785'), //171.8.0.0-171.15.255.255
array('-1236271104', '-1235419137'), //182.80.0.0-182.92.255.255
array('-770113536', '-768606209'), //210.25.0.0-210.47.255.255
array('-569376768', '-564133889'), //222.16.0.0-222.95.255.255
);
$rand_key = mt_rand(0, 9);
$ip= long2ip(mt_rand($ip_long[$rand_key][0], $ip_long[$rand_key][1]));
$headers['CLIENT-IP'] = $ip;
$headers['X-FORWARDED-FOR'] = $ip;
$headerArr = array();
foreach( $headers as $n => $v ) {
$headerArr[] = $n .':' . $v;
}
return $headerArr;
}
task();

这段代码是我从网上摘下来的,稍微修改了下。

测试结果如下:
image

基本上两台服务器是1:1的访问比例

修改下权重

upstream cmssp{
server 192.168.1.112 weight=3;
server 192.168.1.102 weight=1;
#server 192.168.1.106;
#fair;
#ip_hash;
#url_hash;
#order;
}

测试结果如下:
image

能看出 112服务器的访问比例明显高于102服务器。证明weight权重生效。

ok,nginx体验到这里,晚安,睡觉。

支持一下
扫一扫,支持牛头码农