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 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 = "192.168.1.106/index.php";

$curl = curl_init();

for($i = 0 ;$i < 10 ; $i++){

sleep(0.05);

$headers = randIp();

echo " http request :".$i." ip is " . implode(".",$headers )."
";

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."
";

}

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](hucaihua-cloud.stor.sinaapp.com)

基本上兩台伺服器是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](hucaihua-cloud.stor.sinaapp.com)

能看出 112伺服器的訪問比例明顯高於102伺服器。證明weight權重生效。

ok,nginx體驗到這裡,晚安,睡覺。


推薦閱讀:

TAG:負載均衡 | Nginx |