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內容基本如下:
```
<?phpecho "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." 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](http://hucaihua-cloud.stor.sinaapp.com/nginx_test_1.png)基本上兩台伺服器是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](http://hucaihua-cloud.stor.sinaapp.com/nginx_test_2.png)能看出 112伺服器的訪問比例明顯高於102伺服器。證明weight權重生效。
ok,nginx體驗到這裡,晚安,睡覺。
推薦閱讀: