Linux.NET學習手記(2)

上一回合,我們討論學習瞭如何在Linux環境中搭建能夠供.NET運行的環境,不知道各位讀者是否已經完成了環境的搭建?不過,無論各位讀者是採用我們上回合介紹的方法還是採用網上提供的其他方法搭建Linux.NET環境,選擇哪個發行版的Linux,採用了那個版本的mono,都有一點非常重要的,就是:必須保證.NET能夠在這上面正常的運行,換句話說就是要確保搭建的環境能夠正常工作。所謂“三軍未動糧草先行”,今後所有關於Linux.NET學習實驗都是基於該環境進行的,如果連這個環境沒辦法正常的運作,那我們今後Linux.NET的學習與實驗將會變得困難重重,甚至是無法進行下去。

好了,言歸正傳,當我們做好一個網站想要發佈的時候,一般來說,我們都會把網站掛到服務器中,然後設置好服務器的公網IP、子網掩碼、數據庫的連接字串等相關參數,處於外網的用戶就可以通過在瀏覽器地址欄中輸入域名(如果有)或者直接輸入IP地址的方式訪問到我們的網站。而在這一連串發生的事件中,服務器軟件充當了一個重要的角色,如果服務器軟件無法正常的工作,處於外網的用戶基本上是無法再通過瀏覽器的方式來訪問你的網站的。

嗯,聰明的讀者一定猜到了本回合要討論學習的內容,對了,本回合我們討論學習的內容就是:服務器軟件Jexus。

由於Jexus需要討論學習的知識比較多,爲此我會把Jexus分開兩個回合來講解,分別是這個回合對於Jexus的一些概念性和基礎配置的講解,以及下一回合Jexus網站配置高級功能的演示與講解。

本回合我們一起討論學習的內容:

  (1)、對Jexus的概念性理解:什麼是Jexus

  (2)、對上回合搭建環境時所遺留的問題進行辨析:爲什麼要選擇Jexus

  (3)、Jexus的基本操作

  (4)、Jexus的整體配置

  (5)、介紹並使用Jexus的進程守護工具jws.guard


 1、什麼是Jexus

“孔子門徒三千,成名七十二”,世界上存在着各種各樣不同類型的服務器軟件,當然也包括你當時寫來玩玩沒有發佈的那款,而在這衆多的軟件中,比較著名的有:IIS、Apache、Nginx、LIgHttpd等。而Jexus作爲這衆多服務器軟件的其中一員,現在的排名應該就是這三千名中的第七十三名,也就是還沒“成名”的那一位。

的確,Jexus並沒有出身在貴族之中,它沒有像IIS一樣擁有一個有錢有勢有技術的托拉斯父親幫它修飾與推廣,也沒有像Apache服務器軟件一樣成爲“Apache基金會”的頂級項目被世界所認知,同樣也沒有像LigHttpd一樣擁有高貴的普魯士血種成爲大家的新寵。百度百科中對於Jexus的介紹也只有僅僅的那麼幾行,(至寫本文章爲止)維基百科中直接就找不到Jexus的存在,很多讀者對於Jexus還是比較陌生的,對於Jexus的認知或許也僅僅是“這東西可以在Linux中跑.NET”,甚至直接就不知道有這麼一款軟件存在。

孔子的弟子中,雖然只有七十二名的弟子被成爲賢人,但是,誰又能說第一百七十二名就不是賢人呢?第七百二十名弟子就不優秀呢?在這剩下的兩千多人中,其中也有很多弟子是很優秀的,只不過由於種種的原因而沒有被其他人稱作“賢人而已”。最近這兩天,我跟羣主(Jexus的作者)聊了不少東西,諮詢了不少關於Jexus的情況,同時也感謝作者對我的一些ASP.NET的知識進行科普和掃盲,通過對Jexus的討論,我體會到Jexus確實是一款優秀但卻沒太高名氣的服務器軟件,也就是那一位“優秀而沒有成名的弟子”。

用一句話介紹Jexus:Jexus是一款國產的基於.NET環境的有條件開源的免費的Web服務器軟件,目前支持的平臺有:Linux、FreeBSD和龍芯(舊版的海支持Windows),由作者(宇內流雲)一人獨力開發並長期維護,官方的論壇爲:Linux DotNet 大本營

我們在看看Jexus有那些功能特點(摘抄自Jexus說明書)

  (1)、高性能的ASP.NET處理能力。這是Jexus的核心功能。不管是穩定性、易用性還是併發承載能力、並行處理速度,Jexus對ASP.NET的支持都是非常優秀的;
  (2)、支持Fast-CGI。通Fast-CGI,Jexus能支持包括PHP在內的所有擁有Fast-CGI服務功能的WEB應用;
  (3)、具備基於正則表達式的強大的URL重寫功能;
  (4)、具有強勁的反向代理功能。支持多目標負載均衡,支持本地網站與遠程網站無縫整合;
  (5)、擁有強大的流媒體支持能力,支持FLV/F4V視頻文件拖動播放,支持微軟平滑流媒體技術;
  (6)、支持“服務器推送”技術,配備了相應的服務器端、客戶端開發接口,是開發現代WEB應用的利器;(注意,此功能在5.3版中已經除去,待到HTML5成熟並且大多數瀏覽器支持之後才重新推出)
  (7)、具備可控的“ASP.NET前置緩存”,能最大限度地提高ASP.NET網站的承載能力和響應速度;
  (8)、支持Https,具有SSL加密數據安全傳輸能力;
  (9)、具有基礎而實用的入侵檢測功能,能自動終止已被識別的非法請求;
  (10)、安裝部署非常簡便,操作使用極爲簡單。

Jexus凝聚了作者的智慧和心血,針對當前Linux.NET服務器軟件的不足實行有針對性的開發,因此是爲.NET量身定做的一款服務器軟件,再加上它所擁有的豐富的功能,確實是一款不錯的軟件。

 

2、爲什麼選擇Jexus

上回合,我們部署mono時,我們選擇了Jexus作爲服務器軟件,同時也遺留了一個值得我們討論的問題:爲什麼我們選擇Jexus作爲服務器軟件而不是其他?下面我將會 通過兩個主要方面的比較來推演出我們選擇Jexus的原因:

(1)、Windows 與 Linux 服務器軟件的對比

在上一回合的文章中,我閱讀了所有讀者給我的留言,其中有不少留言比較有趣的,當中有那麼一則留言:“.NET在Linux中跑效率和穩定性要比在Windows Server 2003 中要好”,這時我就納悶了.NET在WinServ03中還跑不過Linux?在自家做的環境中還比不上他人做的?此外,我也在Jexus的作者中得出那麼一則消息:“在相同的物理環境中,IIS 6.0 跑不過 Jexus 4.X”。

  

 

    

上面的兩幅圖片是作者提供的關於IIS6.0 與 Jexus 4.3的簡單性能測試,明顯的看出Jexus 4.3的負載能力要比IIS 6 要強。當然,對於這片面的簡單測試是遠遠不足以判定Jexus就比IIS性能強悍的,這需要通過更多更嚴格的系統性的測試,而且還要通過長期的實際使用才能對它們之間的性能對比作出判定。

同時,我這裏還要重申一點:“IIS 絕對是一款性能優異的服務器軟件”,至於爲什麼會出現IIS跑不過Jexus的這種情況(這裏的討論僅限於圖中的這兩個版本的對比,對於新版的IIS與Jexus,這裏不作討論),我想其中的原因更大是由於運作的平臺中的不同。

IIS運行在Windows中,而Jexus則運行在Linux中,他們運行在不同的平臺中,通過對比平臺的差異,或許能夠更容易的得出它們的差異。IIS6.0的性能低下(相對於Jexus4.3)很大程度上是由於Windows系統的拖累,爲什麼這麼說?各位讀者如果有興趣的話可以右鍵點擊計算機(我的電腦),然後打開它的服務列表,看看那龐大的列表中共有多少個服務,又有多少個服務是正在運行的(我剛剛自己手數了一下自己的電腦,共有178個服務,運行中的有92個,這裏是普通系統,Server版本的當然沒有這麼多)。

在這衆多的服務當中,各位讀者能夠認得多少個呢?又是否能夠清楚的說出每一個服務是幹嘛用的呢?我相信各位讀者應該沒有認得出多少個,在這衆多正在運行中的服務,很多都是爲Windows系統提供一些體驗性的功能,我們即使關閉了也對系統的影響不大,這些服務雖然可有可無,但是在我們安裝系統的時候卻會自動的給我們裝上,並且默認的開機運行,運行就意味着系統需要從CPU消耗計算能力,需要從內存中劃分出空間,這都是會浪費我們服務器的資源的。相反的,我們再看看Linux,在安裝系統的時候就可以定製軟件包,定製服務,我們可以選擇最小化安裝,也可以只安裝我們需要的服務,對於我們不需要的服務,我們可以完全的無視之。還記得一位做服務器管理的老師曾經說過:“對於運行的服務器,我們希望越輕越好,提供的服務越單一越好,開啓的服務越少越不容易出錯”。我們回過頭來看Windows,不免會覺得:“Windows,你太重了”。

此外還有一點更重要,對Windows性能影響更大的,那就是Windows的圖形界面。圖形的處理會消耗大量的系統資源,而Windows在維持它的系統界面過程中就需要浪費服務器中大量的寶貴資源。我一直有這麼一個觀點:“Linux是不應該存在圖形界面的”,同樣,Server版的操作系統也不應該存在圖形界面,正規的服務器是要被關在機房的,圖形界面做得再好,畫面再好看也不會有人去欣賞,儘管WinServ03的界面一點都不美觀,但是醜歸醜,維持這個界面還是要消耗大量的系統資源,安裝CentOS6.4時內存如果沒有1G,那圖形的安裝界面還起不了來,可見圖形界面需要消耗多少的資源。同時,如果你是通過遠程登陸到機房的服務器進行管理,網絡問題同樣會成爲圖形界面推送的一個瓶頸問題。

就這樣,過多的服務,加上萬惡的圖形界面,服務器在真正投入生產之前已經浪費了一筆珍貴的系統資源,相同物理配置的服務器,看似配置相同的環境,實際能夠提供給服務器軟件支配的系統資源卻不同,IIS 6.0跑不過 Jexus 4.3也不足爲奇了。

 (2)、同是Linux中.NET服務器軟件的比較

同時Linux中,運行環境纔是真正的相同,這個比Windows/Linux更有可比性。Linux中搭建.NEt環境除了mono+Jexus之外還有一種方式,那就是mono+XSP。XSP是一款.NET的解析容器,它能夠對.NET程序進行解析並維持高效的運行,但是它卻有一個缺點,就是對於靜態資源的處理能力相當有限,而一個網站中,大部分都是圖片、CSS、JS等靜態文件,真正動態生成的東西並不多,在這種情況下XSP就會暴露出它的軟肋,面對這種情況,XSP一般都會整合一個高效的服務器軟件進行彌補它的不足。類似於Tomcat+Apache的這種情況。這就衍生出了:網上提供的搭建Linux.NET的另外一種方式Linux+Apache(Nginx)+mono這種方式,它們在Apache(Nginx)和mono之間都會有一個插件,原理實際上就跟XSP一樣。

這裏推薦一篇文章:《爲什麼說Jexus更適合打造基於Linux/Unix系統的企業級 ASP.NET平臺》,該文章是Jexus的作者寫的,裏面有比較詳細的對比了Linux採用Jexus的好處。閱讀完這篇文章之後,相信讀者也會明白爲什麼上回合搭建環境的時候直接選擇了Jexus。

最求更穩定,性能更優秀,效率更高,這就是我們選擇Jexus的原因。

 

3、Jexus的操作

經過兩個章節關於Jexus的介紹,相信讀者對於Jexus已經有了一個概念上的認識,從這個章節開始,接下來我們會對Jexus的使用進行實操,並通過操作Jexus時產生的現象進行討論,從而進一步的瞭解並學會使用Jexus。

Linux軟件包有一個做得非常好的地方,那就是對於這款軟件的使用手冊、幫助文檔往往都會存在軟件本身之中,像“有問題問男人”(man命令)、“--help”等命令都能夠提供快速的使用方法查閱,同樣,關於Jexus的使用方法我們也可以通過Jexus軟件包中的“readme”查閱得到。

我們先看一下Jexus目錄中有些什麼東西:

裏面也沒有什麼東西,包括四個文件夾(藍色那種),六個腳本文件(綠色那種)和一些的其他文件(白色那種)。在這個章節裏,我們介紹的是Jexus的操作,實際上就是對於Jexus腳本的操作和介紹。

Jexus提供了六個操作腳本(針對5.3之前的版本,5.3版本已把所有jws腳步融合到jws中,使用方法爲./jws 參數),他們的名稱和功能分別是:

  jws.start: 啓動Jexus;(如果需要開機自啓動的,可以把腳本的全路徑[包括腳步本身]添加到/etc/rc.local中;5.3中已改爲:jws start)
  jws.restart: 重啓Jexus,如果命令後邊加網站名作爲參數,那麼就表示啓動或重啓指定的網站;(5.3中已改爲:jws restart)
  jws.stop: 停止Jexus,如果命令後邊加網站名作爲參數,那麼就表示停止指定的網站;(5.3中已改爲:jws stop)
  jws.regsvr: 註冊jexus所需要的全局程序集(本命令只在安裝或更新jexus後才用,而且必須用;5.3中已改爲:jws regsvr)。
  state.start: 啓動Jexus提供的ASP.NET狀態服務;(該腳本在Jesux 5.3 中已經除去,Jexus默認開啓)
  state.stop: 停止Jexus提供的ASP.NET狀態服務;(該腳本在Jesux 5.3 中已經除去,Jexus默認開啓)

  此外,5.3中還增加以下功能:

    jws status:檢查Jexus的運行狀態

    jws -V:查看Jexus的版本                

操作方法跟運行普通腳本一樣./XXX,沒有多少技術含量。這裏值得注意的是,這些腳步文件的擁有者應該保證是root用戶,並且有運行的權限。

 

4、Jexus的配置

Jexus的配置分爲兩個方面,一個是Jexus整體的配置(jws.conf),另外則是網站獨立的配置(默認所有的網站配置文件都在siteconf文件夾中)。網站的獨立配置可以調用很多Jexus的高級功能,我們把它當到下一回合再進行學習討論,本章中我們主要進行Jexus的整站配置。我們用vi打開jws.conf看看裏面有些什麼設置項:

在這裏,我解析一下每個選項的作用和注意事項:

(1)、SiteLogDir:這個設置項必須得存在並且開啓,該設置項設置Jexus的運行日誌記錄、各網站運行的日誌記錄都會存放到該文件夾中。此外,當記錄的日誌文件大小達到一定程度的時候,Jexus會自動的把日誌寫到一個新的日誌文件中,不會一直通過追加寫的方式把所有的日誌記錄都寫到同一文件中。

(2)、SiteConfigDir:這也是一個必須存在並且開啓的設置項,這個設置項設置Jexus中各網站配置的存放地點,Jexus中默認的網站配置之所以存放在siteconf就是因爲這裏默認的值就爲siteconf。此外值得注意的是,存放在該配置文件夾中的文件只能是網站的配置文件,其他任何的文件都不能存到到該目錄(包括網站配置文件本身的備份文件),因爲Linux系統所有的事物都是以文件的方式作爲存儲,因此無論你採用什麼樣的後綴,在Linux系統中都只當作普通文件來對待。

(3)、Runtime:該設置項用於配置Runtime的版本,除非有特殊需求需要改動Runtime的版本,一般情況下無需修改。

再來看一下一些高級點的設置項,這些設置項都是默認關閉的,

(4)、LLVM:是否開啓LLVM編譯器功能。開啓LLVM可以把中間語言的編譯交給LLVM編譯器,這可以加快編譯的速度,編譯出來的代碼性能或許會更優秀一些。不過值得注意的地方:並不是所有的Linux都帶有LLVM編譯器,並且mono自帶的編譯器編譯效率和編譯生成的代碼性能上也不差什麼,因此如果沒有特殊的需要,這一項可以讓他保持默認關閉。

(5)、httpd.processes:Jexus中默認的工作進程爲1個,單個進程最大的併發數固定爲1萬個,通過開啓多個工作進程可以提高Jexus處理併發的能力,開啓多個進程的方式非常簡單,只要修改httpd.processes的值並重啓Jexus即可。不過這裏有幾點需要注意的地方:[1]Jexus最大支持的工作進程爲4個,因此這裏最大隻能填寫4;[2]如果開啓了多個Jexus的工作進程,請注意網站的Session的保存方式,請通過修改網站config文件來修改Session的保存方式,避免採用進程的方式保存Session,否則將會造成Session的不同步,給網站的運作造成不必要的麻煩,Session的保存可以藉助第三方的方式來保存(比如數據庫,或者Jexus提供的強大的ASP.NET服務狀態保存);[3]Jexus工作進程的設置跟服務器的CPU內核數和內存數有關,如果你的Cpu只有一個核,而你配置開啓了兩個進程,也只能達到一個容錯的效果,能夠承載的併發數是不會上去的。詳細可以參考文章《讓Jexus支持高併發請求的優化技巧》

(6)、httpd.user:不知道各位讀者用過Apache沒有,在Apache中的httpd.conf有這麼一項設置user=XXX:可以把Apache以某個用戶的方式啓動,相應的該用戶的所擁有的操作權限都會賦給Apache進程。同樣,httpd.user的作用也是跟Apache中的user是一樣的,只要把一個已有的用戶的用戶名填寫到httpd.user中,Jexus就會擁有該用戶的操作權限。有什麼用?嗯,舉個例子吧,如果網站的運行會產生一些新文件的(比如做頁面靜態化),各位讀者會採用什麼辦法解決呢?chmod 777?這可以解決,但是把目錄的權限設置爲777會存在安全性的問題,如果可以有一種解決方案:進程和某些用戶可以對該目錄進行讀寫操作,而其他用戶不能,那就可以解決安全性問題了。嗯,對的,這個時候httpd.user就派上了用場,我們只要創建一個僅能供某個用戶讀寫的目錄,並把此用戶的用戶名填寫到httpd.user中,就可以實現我們想要的功能了。

(7)、php-fcgi.set:此功能是用於讓Jexus支持PHP,由於這裏與.NET關係不大,這裏就不做過多的介紹了,需要了解的讀者可以參照這篇文章:《讓Jexus V5.1支持PHP的操作步驟》

(8)、CertificateFile 與 CertificateKeyFile:這個是讓Jexus支持SSL的配置項,是用方法可以參照文章:《Linux+Apache安裝生成配置SSL證書》《如何讓jexus 支持ssl》

在這八大Jexus的網站配置中,有一個終極的注意事項:每次配置後記得重啓Jexus,否則剛纔的配置是不會生效的!!!

 

5、Jexus進程守護工具jws.guard

一個運行中的進程,難免會因爲各種各樣的原因無緣無故的宕掉(比如網站瞬間的負載過高、內存不足等),而Jexus宕掉的後果往往只有一個:對外提供服務的網站無法訪問了。因此,我們需要最大限度的保障我們的網站能夠提供7*24小時的不間斷訪問,而一個網站或者一個進程宕掉的過程是瞬間的,也許前一秒還訪問得好好的,下一秒就突然間報個404的錯誤,而從網站或進程掛掉到我們人工的發現並重啓服務的過程是漫長的,除非該網站有應對單點故障的解決方案,否則在這漫長的時間之中,網站都處於一個無法訪問的黑色時期。如果這個宕掉的網站是一個企業網站,這會造成企業信譽度的下降;如果是一個商城網站,這會造成經濟和人氣的損失;因此,我們需要讓系統能夠自動的檢測出網站的運行狀態,當出現進程服務死機的時候能夠自動重啓。

jws.guard的是一個python的腳本,工作原理也比較簡單:根據設置好的預設值,每隔十秒鐘訪問一次訪問一次指定的端口與文件,當三十秒內出現無法網站時就執行jws.restart進行重啓網站。這裏的三十秒指的是累計連續三次無法訪問,防止因爲檢測時因爲Jexus正忙而誤判斷重啓,對網站進行誤傷。

jws.guard的使用方法也比較簡單,只要把 “tools/jws_guard” 目錄中的 “guard.py” 和 “jws.guard” 兩個腳本文件拷貝到Jexus的工作目錄(跟jws.start同一目錄),然後配置一下jws.guard 中的預設值即可。

我們首先把這兩個文件拷貝出去

cd /usr/local/jexus/tools/jws_guard/

cp jws.guard guard.py /usr/local/jexus/

cd /usr/local/jexus/

我們已經把這兩個腳本拷貝到工作目錄中。

 

用vi打開並編輯jws.guard

把host、port、path改爲我們需要的配置即可,它們分別代表主機地址,端口,檢查的路徑。一般情況下,如果Jexus採用80端口,這裏可以不作修改直接使用,而如果Jexus採用的不是80端口,也只需要修改port,改爲正確的端口並保存退出就可以了。host和path一般是不需要修改的,同時也不建議非必要的修改,因爲修改jws.guard必須確保修改後修改的配置項是正確的,否則jws.guard就會因爲無法訪問配置後的網站而反覆的重啓Jexus,造成不必要的麻煩。

修改好了之後只需要執行./jws.guard即可啓動這款Jexus的進程守護工具。

 我們嘗試性的把Jexus關掉。

……30秒之後……

Jexus又起來了。

通過jws.guard守護守護工具,我們可以很方便的讓系統自動的發現Jexus進程宕機並快速的重啓進程。同時我們只需要查閱Jexus的運行日誌即可發現問題所在。

這裏有三點需要提醒的:

  (1)、如果需要關閉Jexus服務30秒以上的,請在關閉Jexus之前先執行./jws.guard stopg關閉jws.guard守護工具,以免守護工具自動的把Jexus又啓動了起來。

  (2)、jws.guard是使用python語言編寫的腳本,需要運行該工具時請確保系統中已經安裝了python,檢查方式可以執行 python -V ,如果沒有出現python的版本信息則說明系統中沒有安裝python,這是,各位讀者可以通過yum或者其他方式安裝上python之後再運行jws.guard。

  (3)、再囉嗦一次,配置jws.guard時請確保配置的值是正確的。

新版的Jexus的穩定性已經非常強,加上jws.guard可以起到加固作用。

好的,至此Jexus的守護工具jws.guard就已經介紹完畢了。

這裏補充一點,高版本的Jexus已經把此工具從版本包中剔除,相信是因爲高版本的Jexus中抗壓能力有了更大的提高,因此作者也放心的將jws.guard移除。如果各位讀者想保留功能的,可以下載一個之前版本的Jexus(可以在第一篇的學習手記中找到下載地址),然後在裏面把此腳本提取出來使用。【補充於:2014/03/29】


至此爲止,本回合對於Jexus的基礎討論已經全部講解完畢了。希望各位讀者在閱讀完本回合的文章之後能夠對Jexus有一個基礎性的瞭解,同時,如果各位讀者有發現本回閤中任何知識點的錯漏、對本文章有任何的意見或者建議、對Linux.NEt的發展有任何的見解,都歡迎留言指教。

下一回合,我們將會對Jexus的高級功能:訪問IP過濾、服務器的高速緩存、URL重寫等功能進行深入的講解並逐一的演示,同時,也希望沒有搭建好Linux.NET的讀者能夠把環境搭建好,因爲下回合所有的演示都是基於這個環境來進行實操。好吧,我們下回再見吧。



轉自:http://www.cnblogs.com/xiaodiejinghong/archive/2013/04/05/3000404.html

發佈了23 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章