|
rabbitmq-server是一個(gè)消息中間件,由erlang語(yǔ)言寫(xiě)就。erlang號(hào)稱是能達(dá)到六西格瑪標(biāo)準(zhǔn)的電信級(jí)編程語(yǔ)言,時(shí)下很流行撒。IDC服務(wù)器監(jiān)控似乎跟這個(gè)東西風(fēng)馬牛不向及啊,呵呵,其實(shí)監(jiān)控本質(zhì)就是消息的傳送。這么就說(shuō)得通了。
進(jìn)程自動(dòng)監(jiān)控的想法是很早以前就有了,當(dāng)時(shí)的情況是這樣的:客服人員經(jīng)常晚上半夜三更給我打電話,說(shuō)系統(tǒng)慢啊,不可訪問(wèn)啊,其實(shí)我上去一看,90%的
問(wèn)題出在程序員寫(xiě)的Java程序上,現(xiàn)象非常討厭,進(jìn)程是存在的,日志照常甩出,端口依然存活,就是反映慢到死,這個(gè)問(wèn)題到現(xiàn)在也還是無(wú)解??!沒(méi)辦法,只
能夠重啟應(yīng)用程序,一重啟就好。這么做的次數(shù)多了,自己也煩不勝煩。于是就想出個(gè)偷懶的主意,能否讓客服自己來(lái)重啟進(jìn)程呢?當(dāng)然可以了,給客服個(gè)WEB頁(yè)
面,上面有重啟的連接,點(diǎn)擊即可。問(wèn)題也來(lái)了,頁(yè)面么,就用php可以搞定,但是涉及到要重啟進(jìn)程,php顯然是不適合做這件事的,理由如下:php運(yùn)行
的時(shí)候是繼承了apache設(shè)置的權(quán)限,缺省應(yīng)該是nobody,如果用suexec或者其他身份運(yùn)行,明顯就是為php提升了權(quán)限,這樣很可能會(huì)帶來(lái)大
問(wèn)題,不可取。比較可行的方法是:php發(fā)送消息到消息服務(wù)器,然后各服務(wù)器跟消息服務(wù)器通訊,取出各自的消息,再由本地進(jìn)程控制重啟。這樣漏洞比較少。
也沒(méi)有權(quán)限的危險(xiǎn)。
具體實(shí)現(xiàn)的架構(gòu)如下:
php提供展示頁(yè)面,調(diào)用stomp協(xié)議發(fā)送消息;rabbitmq做消息中間服務(wù)器,存儲(chǔ)并轉(zhuǎn)發(fā)消息;服務(wù)器端用Python來(lái)接收stomp消息,并調(diào)用shell命令執(zhí)行重啟等命令。結(jié)構(gòu)圖如下:
01 |
rabbitmq-server-1.5.5.tar.gz |
02 |
rabbitmq-stomp-5ee5e2c0b64a.tar.bz2(不要下default.zip那個(gè)包,不能用) |
08 |
tar jxvf Python-2.6.2.tar.bz2 |
10 |
./configure --prefix=/data/python262;make;make install |
11 |
cd ..;rm -rf Python-2.6.2 |
13 |
tar zxvf otp_src_R13B.tar.gz |
15 |
./configure --prefix=/data/erlang;make;make install |
16 |
cd ..;rm -rf otp_src_R13B |
17 |
export PATH=/data/python262/bin:/data/erlang/bin:$PATH |
19 |
tar zxvf rabbitmq-server-1.5.5.tar.gz |
20 |
ln -s rabbitmq-server-1.5.5 rabbitmq-server |
23 |
cd ..;rm -rf rabbitmq-server-1.5.5.tar.gz |
25 |
tar jxvf rabbitmq-stomp-5ee5e2c0b64a.tar.bz2 |
26 |
cd rabbitmq-stomp-5ee5e2c0b64a |
28 |
cd ..;rm -rf rabbitmq-stomp-5ee5e2c0b64a.tar.bz2 |
29 |
vi rabbitmq-server/scripts/rabbitmq-server |
33 |
-pa /data/mq/rabbitmq-stomp-5ee5e2c0b64a/ebin |
35 |
stomp_listeners [{"0.0.0.0",61613}] |
36 |
extra_startup_steps [{"STOMP-listeners",rabbit_stomp,kickstart,[]}]' |
37 |
./rabbitmq-server/scripts/rabbitmq-server -detached |
38 |
#缺省的用戶是guest,密碼也是guest,這太不安全了,改之: |
39 |
./rabbitmq-server/scripts/rabbitmqctl delete_user guest |
40 |
./rabbitmq-server/scripts/rabbitmqctl add_user songxr Loveyou |
41 |
./rabbitmq-server/scripts/rabbitmqctl map_user_vhost songxr / |
這樣rabbitmq+stomp就配置好了。
搜遍了網(wǎng)上的php stomp客戶端,有好幾個(gè),都是一堆文件,其實(shí)我們只用到了一個(gè)最簡(jiǎn)單的功能,就是發(fā)送,干脆自己寫(xiě)了個(gè)函數(shù):
01 |
function sendmsg($host,$port,$login,$passcode,$timeout,$msg,$queue) { |
02 |
$msg_connect = "CONNECTnlogin:$loginnpasscode:$passcodennx00"; |
03 |
$msg_send = "SENDndestination:$queuenreceipt:oknn$msgx00"; |
04 |
$msg_disconnect = "DISCONNECTnnx00"; |
05 |
if(!($r = fsockopen($host,$port))) return false; |
06 |
stream_set_timeout($r, $timeout); |
07 |
if(!fwrite($r, $msg_connect.$msg_send.$msg_disconnect)){ |
08 |
$md = stream_get_meta_data($r); |
09 |
if($md['timed_out']) return false; |
11 |
if(!('CONNECTED' == fread($r,9))){ |
12 |
$md = stream_get_meta_data($r); |
13 |
if($md['timed_out']) return false; |
16 |
$md = stream_get_meta_data($r); |
17 |
if($md['timed_out']) return false; |
18 |
if(!("RECEIPTnreceipt-id:ok" == fread($r,21))){ |
19 |
$md = stream_get_meta_data($r); |
20 |
if($md['timed_out']) return false; |
22 |
if (!(strstr(fgets($r,100),'access_refused'))) { |
發(fā)送端程序下載:mqphp.tar.gz
各個(gè)客戶端的Python端采用Jason R Briggs的stomp類(lèi),加上daemon類(lèi)和實(shí)際執(zhí)行的server.py和shell腳本,一共四個(gè)文件:
接收端程序下載:mq.tar.gz
用這個(gè)方法就可以遠(yuǎn)程管理機(jī)房的服務(wù)器進(jìn)程了,當(dāng)然最后別忘了為php程序加上口令密碼驗(yàn)證……
|