摘要:于是乎,,,搜到最多的詞就是均衡負(fù)載,搭配的一般都是?;仡^再看看,先換個(gè)瀏覽器首次訪問(wèn)再次訪問(wèn)帶上首次訪問(wèn)帶上再次次訪問(wèn)可見(jiàn)的確是達(dá)到了均衡負(fù)載同時(shí)共享的目的。
前言
大學(xué)三年多,也做個(gè)幾個(gè)網(wǎng)站和APP后端,老是被人問(wèn)到,如果用戶多了服務(wù)器會(huì)不會(huì)掛,總是很尷尬的回答:“哈哈,我們的用戶還少,到了服務(wù)器撐不住的時(shí)候,估計(jì)都上市了吧”。說(shuō)是這么說(shuō),但是對(duì)于有強(qiáng)迫癥的我,這個(gè)問(wèn)題一直回響在我腦海里,久久不散啊。如今大四下了,終于有時(shí)間來(lái)深入了解一下這個(gè)問(wèn)題了。
貌似解決大訪問(wèn)量的方案有硬件和軟件兩個(gè)大類的方法,硬件一般比較貴,學(xué)生黨就不去考慮了。還是想想怎么用軟件解決吧。于是乎,Google,Baidu,balabala... 搜到最多的詞就是“均衡負(fù)載”,搭配的一般都是Nginx。找到了方向,那就擼起袖子干活吧。
集群搭建首先在vmware12中安裝3臺(tái)debain,命名為debian1,debian2,debian3。一路默認(rèn)就好(其實(shí)并不好,后面會(huì)說(shuō))。
vmware有個(gè)問(wèn)題,一旦窗口獲得焦點(diǎn),就自動(dòng)關(guān)閉了小鍵盤,導(dǎo)致我設(shè)置root密碼的時(shí)候輸入為空(它也沒(méi)提示)。
后來(lái)我想用su命令才發(fā)現(xiàn)密碼錯(cuò)誤,輸入空密碼一樣錯(cuò)誤,就只有找回密碼了。
對(duì)于debian來(lái)說(shuō),這樣改:在grub界面光標(biāo)指向待啟動(dòng)的系統(tǒng),然后按 e 鍵進(jìn)行編輯,如圖:
在 quiet 后面加個(gè)1(注意要有空格),按F10,你就可以以root身份進(jìn)入命令行界面的。
這時(shí)候就用passwd修改密碼,然后reboot就可以了。
終于打開了,準(zhǔn)備試試網(wǎng)絡(luò),發(fā)現(xiàn)無(wú)法訪問(wèn)外網(wǎng),但是windows主機(jī)可以,如果一路默認(rèn)的話不應(yīng)該出現(xiàn)問(wèn)題,最有可能就是殺毒軟件把vmware的服務(wù)進(jìn)程給關(guān)了(裝了360...)。在windows中啟動(dòng)Vmware的DHCP服務(wù)
然后虛擬機(jī)要reboot一下來(lái)獲取ip。好了,現(xiàn)在虛擬機(jī)可以訪問(wèn)外網(wǎng)了。
安裝nginx,才發(fā)現(xiàn)根本連不上,一看才發(fā)現(xiàn)是老美的源,應(yīng)該是一路默認(rèn)惹的禍啊,修改為科大源(我為母校自豪,哈哈)。
vi /etc/apt/source.list
修改為:
deb http://mirrors.ustc.edu.cn/debian/ wheezy main non-free contrib deb http://mirrors.ustc.edu.cn/debian/ wheezy-proposed-updates main non-free contrib deb-src http://mirrors.ustc.edu.cn/debian/ wheezy main non-free contrib deb-src http://mirrors.ustc.edu.cn/debian/ wheezy-proposed-updates main non-free contrib deb http://mirrors.ustc.edu.cn/debian-security/ wheezy/updates main non-free contrib deb-src http://mirrors.ustc.edu.cn/debian-security/ wheezy/updates main non-free contrib
然后執(zhí)行這個(gè)命令來(lái)更新: apt-get update
安裝: apt-get install nginx
啟動(dòng): /etc/init.d/nginx start
隨便用一個(gè)虛擬機(jī)開啟一個(gè)瀏覽器打開localhost,成功啟動(dòng),如圖:
vi用不慣安裝vim: apt-get install vim 報(bào)錯(cuò):
The following packages have unmet dependencies: vim : Depends: vim-common (= 2:7.3.547-7) but 2:7.4.488-7 is to be installed E: Unable to correct problems, you have held broken packages.
可見(jiàn)沖突了,解決方法:
先執(zhí)行 apt-get remove vim-common 卸載vim-common
再進(jìn)行安裝vim,執(zhí)行 apt-get install vim
找找nginx的根目錄,我們打開配置文件(和Apache一樣,配置文件模塊化的,不是一個(gè)多帶帶的nginx.conf)看一看
vim /etc/nginx/sites-enabled/default
中間有一行
root /usr/share/nginx/www;
這就是根目錄啦
修改index.html來(lái)區(qū)分三臺(tái)主機(jī)
用ipconfig 分別獲得 ip 地址,在windows中訪問(wèn)
debian1 http://192.168.182.128/ debian2 http://192.168.182.129/ debian3 http://192.168.182.130/基礎(chǔ)嘗試
先來(lái)一個(gè)小例子,以便對(duì)均衡負(fù)載產(chǎn)生一個(gè)直觀的感受吧。
我們把debian1作為主服務(wù)器承擔(dān)請(qǐng)求分發(fā)的任務(wù),即外部訪問(wèn)的是debian1,然后debain1把請(qǐng)求發(fā)送給debian2或者debain3,如下圖:
在debian1中修改配置文件 :vim /etc/nginx/nginx.conf
在http配置項(xiàng)中加入如下
upstream site { server 192.168.182.129:80; server 192.168.182.130:80; } server{ listen 80; location / { proxy_pass http://site; } }
這是選擇的輪詢的模式
保存重啟nginx。
現(xiàn)在在windows中訪問(wèn)debian1,http://192.168.182.128/。多次刷新 可見(jiàn)如下兩圖依次出現(xiàn):
說(shuō)明發(fā)送給 debian1 的請(qǐng)求的確是均勻分配到 debian2和debian3了,亦即輪詢。
session共享上面的例子可以說(shuō)簡(jiǎn)單到?jīng)]有什么實(shí)用價(jià)值,大型網(wǎng)站一般不可能是純靜態(tài)的,一般都涉及到用戶登錄的問(wèn)題,那么就涉及到session的問(wèn)題了。你想用戶在A登陸了,A記住了用戶的登錄狀態(tài),可是下一次用戶請(qǐng)求被分配到B去了怎么辦?顯然不可能讓用戶再登陸一次。所以要實(shí)現(xiàn)session共享。一般有幾個(gè)解決辦法:
iphash,把特定ip發(fā)送給特定主機(jī),就不存在session這個(gè)問(wèn)題了,因?yàn)?個(gè)用戶對(duì)應(yīng)1臺(tái)主機(jī)。但是某時(shí)刻當(dāng)來(lái)自某個(gè)IP地址的請(qǐng)求特別多,那么將導(dǎo)致某臺(tái)負(fù)載服務(wù)器的壓力可能非常大,而其他負(fù)載服務(wù)器卻空閑的不均衡情況,這就違背了我們負(fù)載均衡的初衷。
搭建redis集群或者memcached集群,用集群自帶的同步方法來(lái)幫我們?cè)诓煌闹鳈C(jī)中同步session,這樣就相當(dāng)于把原來(lái)的一份session變成了N分session(有點(diǎn)浪費(fèi),哈哈),session的同步就依賴于NoSql集群的同步了。
不使用session,換作cookie。但是秉承著防御性編程的原則,我們不能相信用戶輸入,因?yàn)閏ookie可能被禁用,甚至篡改。
多帶帶設(shè)置一個(gè)session服務(wù)器,負(fù)載服務(wù)器得到一個(gè)sessionid過(guò)后,去session服務(wù)器獲得會(huì)話狀態(tài),然后根據(jù)狀態(tài)來(lái)響應(yīng)用戶請(qǐng)求,如果會(huì)話狀態(tài)為空,則在session服務(wù)器中設(shè)置一個(gè)會(huì)話狀態(tài),然后返回給用戶一個(gè)sessionid。
我準(zhǔn)備采用方案4,即用debian1作為分發(fā)服務(wù)器,同時(shí)作為session服務(wù)器(用redis實(shí)現(xiàn)),負(fù)載服務(wù)器每次都要向分發(fā)服務(wù)器請(qǐng)求用戶的session對(duì)應(yīng)的會(huì)話狀態(tài),以此決定響應(yīng)方式。
php 環(huán)境搭建在debain2,3中搭建php環(huán)境
先在2中修改
命令 :
apt-get update #更新源 apt-get install php5 #安裝php5 apt-get install php5-cli #安裝php5 命令行工具 apt-get install php5-fpm
最后一句就報(bào)錯(cuò)了:
The following packages have unmet dependencies: gnupg : Depends: libreadline6 (>= 6.0) but it is not going to be installed Recommends: gnupg-curl but it is not going to be installed php5-fpm : Depends: libssl1.0.0 (>= 1.0.0) but it is not going to be installed Depends: php5-common (= 5.4.45-0+deb7u2) but it is not going to be installed Depends: ucf but it is not going to be installed Depends: tzdata but it is not going to be installed PreDepends: dpkg (>= 1.16.1~) but it is not going to be installed
搞了好久也沒(méi)解決,還是換個(gè)fastcgi管理工具吧(回頭再來(lái)啃一啃):
apt-get install spawn-fcgi
啟動(dòng)spawn-fcgi:
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u www-data -g www-data -f /usr/bin/php-cgi
說(shuō)明:
-a : PHP FastCGI 綁定IP地址 -p : PHP FastCGI 指定端口 -u : PHP FastCGI 用戶名 -g : PHP FastCGI 用戶組 -f : 指向 PHP5 fastcgi
另外
`vim /etc/rc.local`
加入上述命令使得它開機(jī)自啟
配置nginx的php選項(xiàng)(還是看官網(wǎng)比較好,不要到處亂搜):
location ~ [^/].php(/|$) { fastcgi_split_path_info ^(.+?.php)(/.*)$; if (!-f $document_root$fastcgi_script_name) { return 404; } fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; }
重啟:/etc/init.d/nginx restart
在根目錄中加入1.php
訪問(wèn),終于成功了,淚奔
接下來(lái)對(duì)debain3 如法炮制??偹闶峭瓿蛇@一步了。
redis 環(huán)境搭建在debain1中搭建redis服務(wù)器
命令:
wget http://download.redis.io/releases/redis-2.8.12.tar.gz tar xzf redis-2.8.12.tar.gz cd redis-2.8.12 make
編譯成功,運(yùn)行: ./src/redis-server redis.conf
修改配置 打開 redis.conf
把 bind 127.0.0.1 修改為 bind 0.0.0.0 即任意主機(jī)可以訪問(wèn)
找到“requirepass”字段,在后面加上密碼 password
重啟redis服務(wù)器:
./src/redis-cli -h 127.0.0.1 -p 6379 shutdown #關(guān)閉 ./src/redis-server redis.conf 開啟
這時(shí)你會(huì)發(fā)現(xiàn)如果用redis客戶端直接訪問(wèn)會(huì)報(bào)錯(cuò)
要輸入密碼后在能正常使用,如圖:
在debain2,3中配置phpredis
命令:
apt-get install php5-dev #php開發(fā)者工具,后面編譯需要 wget https://github.com/nicolasff/phpredis/archive/master.tar.gz tar xvf master.tar.gz cd phpredis-master/ phpize ./configure --enable-redis make && make install
然后修改配置:
vim /etc/php5/cgi/php.ini
在Dynamic Extensions 后面添加extension=redis.so
重啟服務(wù):還真沒(méi)找到成熟的解決辦法,只有采取笨辦法了
lsof -i :9000 #列出該端口相關(guān)信息,包含PID kill -9 pid # 把上一步顯示出來(lái)的pid挨個(gè)殺死 /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u www-data -g www-data -f /usr/bin/php-cgi #啟動(dòng)
測(cè)試:在debian3的nginx根目錄添加1.php 代碼如下:
connect ( $redis_host, $redis_port ); $redis->auth ( $redis_psw ); $redis->set("a",1); echo $redis->get("a"); ?>
結(jié)果如下:
可見(jiàn)是成功了,對(duì)debian2如法炮制,效果一樣
邏輯實(shí)現(xiàn)負(fù)載服務(wù)器查看客戶端是否帶有sessionid這個(gè)參數(shù),如果有,則去session服務(wù)器獲取會(huì)話狀態(tài)并返回結(jié)果,否則產(chǎn)生一個(gè)session和會(huì)話狀態(tài)存入session服務(wù)器并返回sessionid給客戶端。這是一個(gè)大概的邏輯輪廓,細(xì)節(jié)就不討論了,實(shí)現(xiàn)如下:
修改debian2,3的nginx配置文件使得默認(rèn)路徑是index.php 而非 index.html,同時(shí)刪掉原有的index.html,加入index.php。重啟。
index.php 代碼如下:
//初始化連接
$redis_host = "192.168.182.128";
$redis_port = 6379;
$redis_psw = "password";
$redis = new Redis ();
$redis->connect ( $redis_host, $redis_port );
$redis->auth ( $redis_psw );
$sessionid = ceil($_GET["sessionid"]);
$hostname = "debian2";//debian3就要改成debian3
if(empty($sessionid)){//沒(méi)有sessionid
$sessionid = rand(10000000,99999999);//簡(jiǎn)便起見(jiàn)產(chǎn)生8位數(shù)字作為有效id $status = "已經(jīng)登陸,由 ".$hostname." 設(shè)置session"; $redis->set($sessionid,$status);//保存 $data = array("當(dāng)前站點(diǎn)"=>$hostname,"sessionid"=>$sessionid,"info"=>"這是您第一次登陸"); echo json_encode($data,JSON_UNESCAPED_UNICODE); exit();
}
$status = $redis->get($sessionid);
if(empty($status)){//sessionid無(wú)效
$sessionid = rand(10000000,99999999);//簡(jiǎn)便起見(jiàn)產(chǎn)生8位數(shù)字作為有效id $status = "已經(jīng)登陸,由 ".$hostname." 設(shè)置session"; $redis->set($sessionid,$status); $data = array("當(dāng)前站點(diǎn)"=>$hostname,"sessionid"=>$sessionid,"info"=>"這是您第一次登陸"); echo json_encode($data,JSON_UNESCAPED_UNICODE); exit();
}
$data = array("當(dāng)前站點(diǎn)"=>$hostname,"sessionid"=>$sessionid,"info"=>$status);
echo json_encode($data,JSON_UNESCAPED_UNICODE);
exit();
?>
測(cè)試
首次訪問(wèn)debian1
再次訪問(wèn)debain1,這里就出了點(diǎn)問(wèn)題,不知道為什么,一直發(fā)送到到debian2,連續(xù)嘗試很多次,沒(méi)有一次請(qǐng)求到debian3,根本就沒(méi)有輪詢啊。但是過(guò)了幾分鐘再次訪問(wèn)debian1
請(qǐng)求就發(fā)送到debian3了,我估計(jì)是用了php過(guò)后,nginx把一小段時(shí)間內(nèi)的請(qǐng)求發(fā)送到同一主機(jī)了,但是一大段時(shí)間上還是輪詢的。
但是我換了個(gè)瀏覽器過(guò)后,又變成每次輪詢了。一頭汗...... 所以這還是和瀏覽器有關(guān)的?(暫時(shí)搞不定?;仡^再看看,先換個(gè)瀏覽器)
首次訪問(wèn)debian1
再次訪問(wèn)debian1
帶上sessionid首次訪問(wèn)debian1
帶上sessionid再次次訪問(wèn)debian1
可見(jiàn)的確是達(dá)到了均衡負(fù)載同時(shí)session共享的目的。
總結(jié)這篇文章寫下來(lái)可真是費(fèi)了些力氣,中間出了好多錯(cuò),不過(guò)一個(gè)一個(gè)有耐心的解決掉,最后出來(lái)的結(jié)果還是令人挺有成就感的。畢竟心里的一塊大石算是落了。以后有空再嘗試一下其他幾種方法。
PS : 修改配置文件的時(shí)候,一定要先備份再修改,不然出了問(wèn)題都不能恢復(fù)。
更新啃了好久,終于找到上面包依賴(沖突)的問(wèn)題了(得感謝我的一位同學(xué))。都是源惹的禍,我當(dāng)時(shí)是直接找了一段代碼放進(jìn)source.list, 實(shí)際上把wheezy全部改成jessie,就行了,因?yàn)槲业膁ebian是8.3 而wheezy代表debian7。
用了錯(cuò)誤的源會(huì)導(dǎo)致很多的兼容問(wèn)題,趕緊換回來(lái)。換回來(lái)過(guò)后安裝php相關(guān)的組件就沒(méi)有任何問(wèn)題了。
更新 03/30上面修改root密碼的方法我后來(lái)又試了一下,沒(méi)成功,原來(lái)之所以成功估計(jì)是因?yàn)樵瓉?lái)我的root密碼正好是空,所以在進(jìn)入單用戶模式的時(shí)候不需要輸入密碼。后來(lái)我的密碼不是空,進(jìn)入單用戶模式一樣要輸入root密碼,自然達(dá)不到找回密碼的目的。最好還是用U盤啟動(dòng),用U盤里的系統(tǒng)來(lái)修改本機(jī)root密碼。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/39257.html
摘要:于是乎,,,搜到最多的詞就是均衡負(fù)載,搭配的一般都是?;仡^再看看,先換個(gè)瀏覽器首次訪問(wèn)再次訪問(wèn)帶上首次訪問(wèn)帶上再次次訪問(wèn)可見(jiàn)的確是達(dá)到了均衡負(fù)載同時(shí)共享的目的。 前言 大學(xué)三年多,也做個(gè)幾個(gè)網(wǎng)站和APP后端,老是被人問(wèn)到,如果用戶多了服務(wù)器會(huì)不會(huì)掛,總是很尷尬的回答:哈哈,我們的用戶還少,到了服務(wù)器撐不住的時(shí)候,估計(jì)都上市了吧。說(shuō)是這么說(shuō),但是對(duì)于有強(qiáng)迫癥的我,這個(gè)問(wèn)題一直回響在我腦海...
摘要:并沒(méi)有因?yàn)椴灰恢露煌褂眠B接,確實(shí)存儲(chǔ)了一個(gè),如下工程目錄實(shí)際操縱過(guò)程中遇到一個(gè)問(wèn)題啟動(dòng)工程的時(shí)候報(bào)錯(cuò)解決方法對(duì)于依賴,增加了一個(gè),且版本為。啟動(dòng),未報(bào)錯(cuò),問(wèn)題解決。后續(xù)有時(shí)間再研究。 1.環(huán)境信息nginx-1.11.10redis-latest包(redis windows版本)springboot1.5.1.RELEASE 2.新建一個(gè)SpringBoot項(xiàng)目,參考如下鏈接:h...
閱讀 1448·2021-09-03 10:29
閱讀 3470·2019-08-29 16:24
閱讀 2041·2019-08-29 11:03
閱讀 1425·2019-08-26 13:52
閱讀 2938·2019-08-26 11:36
閱讀 2800·2019-08-23 17:19
閱讀 572·2019-08-23 17:14
閱讀 822·2019-08-23 13:59