1. 程式人生 > >Linux.NET學習手記(3)

Linux.NET學習手記(3)

前一回合,我們對伺服器軟體Jexus作了簡單的介紹,同時我們也對Jexus的整體配置作了詳細的講解,介紹了Jexus的程序守護工具"jws.guard",相信各位讀者對於Jexus應該已經有或多或少的概念性認識。上回中說到,由於Jexus的知識點和功能比較多,因此我們打算分兩回合的討論學習,而在上回閤中,我們已經完成了對Jexus的基礎講解,因此本回合將會在上回合的基礎上,對Jexus的高階功能進行討論學習。

在本回閤中,我們將會對Jexus中一些比較常用同時也比較有用的高階功能挑選出來進行講解並演示。由於本回閤中概念性的知識講解並不多,主要以實際操作為主,為了降低各項功能之間的干擾,我會盡量的把每一個章節保持相對的獨立,各位讀者可以選擇通篇閱讀,也可以選擇挑選需要的章節進行區域性的閱讀。此外,在開始實驗之前,我還是再囉嗦一句,本回合的文章所有的操作都是基於我們搭建的環境進行的,如果有讀者對環境的搭建不太瞭解,可以參照

《Linux.NET學習手記1》這篇文章完成環境的搭建,上面已經詳細的寫有搭建方法和注意事項。

好了不墨跡了,進入本回合的主題吧,本回閤中,我們將討論學習:

  1、NOFILE功能  

  2、Jexus的URLRewrite

  3、Jexus如果做IP過濾

  4、對目錄訪問禁止

  5、Jexus如何使用反向代理功能

  6、如何使用SendFile技術

  7、Jexus的快取記憶體

  8、Jexus如何對靜態資源進行壓縮傳輸

0、新建一個網站配置

這一章節是本回合的零章節,為什麼叫零呢,是這樣的,由於從我們實驗的第一節開始,直到最後一節,它們都有一個共通點——都是基於本節的基礎上進行,換句話說,都需要本節的支援。並且,無論各位讀者是否使用Jexus的高階功能,本節的配置都是必要的,因此本節的內容並不是Jexus的高階配置,而是網站運作的必要配置,本節也是一個Jexus高階的預備節。

上回閤中,我們在講解Jexus整體配置時,各位讀者是否還記得jws.conf裡面的配置項?如果不記得,不要緊的,各位讀者可以翻開我們上一回的Linux.NET學習手記,裡面有詳細的Jexus整體配置資料。在上回介紹Jexus配置檔案jws.conf時,當中有一個必要的配置項:“SiteConfigDir”,該配置項定義了Jexus的網站配置檔案存放的目錄地址。各位讀者注意了,這裡所說的網站配置檔案不是指Web專案中的Web.Config,這裡的配置檔案指的是以某個網站專案為獨立的單元,對此單元進行有針對性的Jexus高階功能配置。不知道各位讀者是否使用過Apache,在Apache中可以有一個“

VirtualHost”節點可以用來配置虛擬主機的,同樣Jexus也可以配置虛擬主機,不過它不是像Apache中通過“VirtualHost”節點,而是通過存放在“SiteConfigDir”目錄中的檔案達到此功能,每一個檔案就相當於Apache中的一個“VirtualHost”節點。

Jexus中預設SiteConfigDir的配置為"siteconf",為此我們進入到“siteconf”目錄中,裡面已經存在了一個預設的配置檔案“default”,我們用vi開啟此檔案。

該預設檔案已經包含了作者為我們提供的多項配置,其中包括三行處於執行狀態(未註釋的)和多行處於關閉狀態(#號註釋的)的配置項,聰明的讀者應該又想到了:“沒有註釋的一定是基礎配置項,而加了#號註釋的就是Jexus的高階功能”。好棒!!答對了!!本回合Jexus高階功能的講解說白了就是對處於關閉狀態的功能進行介紹、實驗演示和使用此功能時需要注意的事項進行講解。而本節的內容則是對那三項必需項進行講解。

先來講解一下這三項是幹嘛用的:

port:很明顯的意思——埠,也就是Jexus監聽的埠。

  這裡注意了,Jexus不支援在同一網站配置檔案同同時設定兩個或者兩個以上的監聽埠,因此如果需要設定監聽計算機多個埠的話,需要通過設定多個配置檔案的方式來設定並監聽多個埠。

 root:該網站根目錄的位置。該配置項有兩個引數需要填寫,分別是前面的“/”,和一個空格間隔後的網站的網站目錄的實體地址。

  這裡我擴充套件一下,不知道各位讀者是否知道Linux磁碟的掛載(mount),這裡的作用跟磁碟掛載非常像,也是把某個檔案目錄掛載到Jexus中,成為一個網站目錄,因此,第一個引數未必一定要填寫代表根目錄的“/”,是可以填寫其他的,譬如“/xiaodiejinghong/”,但是這會造成一個問題,假設你網站的域名是“majianle.com”,而你“host”中的第一個引數填寫了“/xiaodiejinghong/”,這時,你直接訪問“majianle.com”是沒辦法訪問到你的網站的,需要訪問“majianle.com/xiaodiejinghong/”才能訪問到你掛載的網站。這裡還望各位讀者多加留意。

hosts:配置網站的域名,如果有的話;如果沒有則配一個“*”。當這裡配置了一個域名,譬如“majianle.com”,當用戶訪問“majianle.com”時,Jexus會自動的把訪問對映到此配置檔案中(前提你有很多網站)

下面,我就開始演示操作:

我們先新建一個目錄,在/var/www/中新建一個“xiaodiejinghong”資料夾,並設定許可權。關於許可權的設定,各位可以採用acl或者其他授權方式進行授權,這裡由於對安全性沒有太大的要求,因此採用chmod 777 的方式授權。

接著,我們從零開始,在配置檔案存放目錄中新建一個新的配置檔案,名字也是“xiaodiejinghong”,再填入必要的引數,由於我們沒有域名,所以host設定為“*”並且監聽埠設定成“8888”。

儲存退出,重啟Jexus(注意,所有的配置,在配置之後都需要重啟Jexus)。在瀏覽器中輸入網址,IP:8888/info,得到:

證明我們的配置已經生效,已經完成Jexus網站的基礎配置,可以正式的進入到高階講解的第一節。

1、Jexus的NOFile功能。

當我們把做好的網站掛上伺服器併發布,使用者就可以正常的訪問我們的網站,如果我們的使用者中規中矩的使用我們的網站,網站是不會出現什麼異常的情況的。但是,這種事情一般都不存在,使用者們很大可能會輸入一個錯誤的URL地址,此URL或許是因為使用者的輸入錯誤,或許是網站的變更造成地址失效,又或者其他各種各樣的原因。面對這種情況,我們一般都會通過定製一個錯誤頁(404或其他個性化的提示頁面),當然這都是在寫網站專案時通過.NET來完成。這裡我推出Jexus的第一項高階功能“NOFile”,它的功能跟我們自定義404頁面是一樣的,也是通過檢測使用者請求的資源是否存在,不存在則自動的跳轉到一個我們預設好的頁面去。

我先開始我們的的實驗,先定製一個“NOFile”的頁面(404頁面):

404.html
<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8">
    
        <title>404</title>
        
    </head>
    <body>
        <h1>這裡是一個自定義的404頁面</是一個自定義的404頁面h1>
    </body>
</html>

然後我們在網站配置檔案“xiaodiejinghong”中新增並設定“NOFILE”設定項:

儲存退出並重啟Jexus,我們在瀏覽器中輸入一個錯誤的URL地址,出現:

使用方法如圖所示的簡單,只要寫好NOFile頁面的檔案相對於網站根目錄的位置就可以了。

這裡值得提醒的就是此功能的使用情況,

  (1)、如果各位讀者掛載的網站專案如果是MVC專案的話,請務必要關閉此功能。原因很簡單,MVC中,URL的所請求的資源都不是真實的網站資源,而恰好“NOFile”功能就是根據URL中的請求對網站目錄的資原始檔進行遍歷匹配,這就會造成這麼一個結果,無論在瀏覽器位址列中輸入任何的URL地址,Jexus都會因為找不到這個資原始檔而重定向至一個預設的“NOFile”頁面(404頁面),使得我們的MVC網站失效。

  (2)、“NOFile”功能與“URLRewrite”不能混合使用,這至少在當前的Jexus 5.23版本中是這樣,可以說這是Jexus的一個Bug,如果各位讀者有看Jexus自帶的“readme”說明書的話,上面一定會寫到一個小技巧是關於“NOFile”與“URLRewrite”混合使用的。但是很不巧的是,這個小技巧恰恰好存在一個Bug,當同時開啟“NOFile”和“URLRewrite”功能時,Jexus會優先的選擇“NOFile”功能,這就使得URLRewrite一直處於失效的狀態,所有需要重寫的URL地址都被Jexus認為是一個不存在的地址。(此Bug已經向Jexus的作者提交,相信在5.3之後的版本會修復)

2、Jexus的URL重寫

URL重寫也叫URLRewrite,關於URLRewrite的詳細介紹各位讀者可以在百度百科中得到。簡單說,URLRewrite就是對使用者在瀏覽器中輸入的URL地址(虛假的或者是經過改造的)在Web伺服器中重新生成一個真實的URL資源路徑。

URLRewrite有以下的好處:

  (1)、提高Web網站的安全性。由於對外公佈的URL都是經過一系列的改造的,需要在伺服器中經過轉換才能得到真實的資源訪問地址,使用者一般情況下不知道伺服器中的網站真實的檔名和目錄結構,並且經過改造的URL在傳遞引數的時候也是經過一定的改造,一般情況下會隱藏引數的名字,這都有助於提高網站的安全性,增大網站攻擊的難度。

  (2)、使URL更加的美觀。很多時候,我們的網站都會通過GET方法,通過冗長的QueryString的方式來傳遞資訊,細心的讀者應該會發現,GET方法傳參的URL一般都會出現譬如:“/XXX/XX.aspx?id=XX&acc=XX&pid=XX&class=XX”,在“?”後面出現大量的XX=XX&XX=XX的資訊,這樣子使用者體驗度是不怎麼高的,使用者很多情況下希望的URL是一個簡短而明瞭的URL,相反的我們卻在提供這種又長又臭的URL,這不僅不美觀,還會造成使用者體驗度的下降。

  (3)、便於搜尋引擎的收錄。“Seo”在最近這一段時間都非常熱,各大站主們都在想方設法的讓自己的站點能夠更容易的被搜尋引擎搜錄,挺高他們網站的排名和權重。而spider(蜘蛛)在網站中爬行就是通過各種URL的連結進行的,因此URL成為了“seo”的一項非常重要的內容。通過URLRewrite,我們可以構造出各種容易被spider理解的URL,是網站更容易的被搜尋引擎所收錄,偽靜態就是基於這個原理而提出的。

在Jexus的URLRewrite使用的配置項是“rewrite”,它的重寫是基於正則表示式的匹配重寫,使用方法是“rewrite=正則匹配並替換的URL  新生成的URL”。

下面進行URL重寫的實驗:

要求:我在我們的網站目錄中放入兩個靜態的HTML檔案,第一個HTML檔案的檔名為:php.html,另外一個則為:aspx.html,現在要求當我在瀏覽器中輸入的URL是以.php為字尾時系統自動的把URL重寫並導向至php.html,同理,以.aspx為字尾時導向至aspx.html。

首先,我們先新建這兩個靜態的HTML檔案,並在裡面填充好HTML程式碼。  

php.html
<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8">
    
        <title>Php</title>
        
    </head>
    <body>
        <h1>你輸入的是以".php”為字尾的URL</h1>
    </body>
</html
aspx.html
<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8">
    
        <title>Aspx</title>
        
    </head>
    <body>
        <h1>你輸入的是以“.aspx”結尾的URL</h1>
    </body>
</html>

然後我們需要在網站配置檔案“xiaodiejinghong”中寫我們的重寫規則。

儲存退出並重啟Jexus。下面我們開啟瀏覽器,分別輸入一個以.php結尾和.aspx結尾的URL地址:

成功的為我們的URL進行了重寫,這裡有幾點需要補充和注意的:

  (1)、Jexus的URL匹配是從上至下的,因此如果某URL在網站配置檔案中恰好存在兩個或兩個以上可以正確匹配的情況,Jexus會選取最先匹配的那一項,也就是第一項。

  (2)、Jexus的URL只會替換存在且命中的那一部分,而不是整個URL的連結。這句話比較拗口,這裡解析一下:比如我想把“XX.com/xiaodiejinghong/”中所有後綴為.aspx的URL都重寫為“xx.com/aspx.html”,而我寫的匹配規則卻僅僅是:“rewrite=.*\.aspx$ /aspx.html”(匹配所有.aspx結尾的URL),這時,Jexus幫你正則替換的僅僅是“XX.aspx”的這一段而不是整段URL,“/xiaodiejinghong/”並沒有被替換和過濾掉,這就會造成新生成的URL為:“XX.com/xiaodiejinghong/aspx.html”,明顯的,新生成的URL出現了錯誤,並沒有指向到正確的資原始檔。因此,各位讀者如果要做URLRewrite,這裡建議把整個URL進行匹配和替換,而不是採用區域性替換的方式。

  (3)、關於引數問題的,如果各位讀者類似偽靜態的URL,即需要從URL中截取出相關資訊,並還原成帶引數形式的QueryStringURL的時候,可以通過使用正則的方式來獲取,要得到獲取的資訊可以通過$n的方式來獲得,這裡的n指獲取的元素的位置。例如:

  (4)、配置之後必須重啟Jexus,否則是不會生效的。

3、Jexus的IP封殺

有時候我們需要一些特殊的功能,對一些特殊的IP進行訪問的過濾,不允許它訪問我們的網站。作者非常貼心的在Jexus中也加入了ipdeny的這麼一個功能,使用方法也是很簡單的,只要在“denyfrom”配置項中配置上具體的IP或者是網段,就可以實現對IP或某個網段進行IP的封殺。

我們把本機的IP和10.10.1.*的網段新增到網站的IP禁止列表中:

儲存退出並重啟Jexus,再來訪問網站:

我們的IP就被封殺掉了。

4、禁止訪問某目錄中的內容

此功能正像標題所說的那樣,禁止對網站專案中某資料夾進行訪問,配置的關鍵字為“DenyDirs”,這裡沒有什麼需要多說的,我們直接實驗好了:

在網站的根目錄下建立一個新的資料夾“le”,並在“le”目錄中新增一個新的HTML檔案:

denydir.html
<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8">
    
        <title>Denydir</title>
        
    </head>
    <body>
        <h1>這是用於測試denyDir用的,如果你還看到此頁面,證明此目錄沒有被遮蔽</h1>
    </body>
</html>

我們在修改配置檔案之前先嚐試訪問:

之後我們修改我們的網站配置檔案:

儲存退出,重啟Jexus後再重新整理頁面:

我們達到了我們想要的效果。

5、Jexus反向代理

Jexus中的一個重磅功能,就是它的反向代理功能。關於什麼是反向代理,各位可以在百度百科維基百科或者其他地方找到相應的詳細資料。我就這麼簡單的給各位讀者簡單的講解一下什麼是反向代理吧:

在講解反向代理之前我們先講解一下什麼是代理。當我們在瀏覽器中設定好代理伺服器的地址和埠號,就可以使用代理功能了,所謂的代理,就是當我們需要訪問某個網站時,並不是由我們的來直接訪問,而是把請求發給代理伺服器,由代理伺服器替我們完成網站訪問的操作,並把該網站應答的資料反饋回來給我們的主機。舉個例子,比如我們需要訪問部落格園中小蝶驚鴻的部落格,當我們把正確的URL地址輸入到瀏覽器的位址列並敲回車,我們的訪問請求會經過代理伺服器,這時代理伺服器會把我們的請求截留在伺服器內,並在它自身啟用一個處於非監聽狀態的空閒埠幫我們訪問我們需要的網站,當代理伺服器完成整個網站的訪問的時候,它會把整個網站返回的頁面內容原封不動的發回給我們的瀏覽器,於是我們就完成了訪問小蝶驚鴻的部落格這個動作。由於網路傳輸具有透明傳輸的特點,瀏覽器根本就不知道它是怎麼得到這個請求應答的,並且它也不會管這個過程,對於瀏覽器來說,只要能夠給使用者完成需要的功能就沒問題了。因此,代理就有點像接力賽一樣,瀏覽器把請求的任務交給代理伺服器,代理伺服器完成了任務後把結果反饋回來給瀏覽器。

使用代理具有以下優勢:

  (1)、突破IP的限制;由於訪問經過代理伺服器傳送出去,因此在請求的資料包中,源IP地址是代理伺服器的IP地址而不是我們主機的IP地址,只要代理伺服器的IP具有訪問許可權,即使我們的主機Ip被封殺了也一樣可以訪問。各位讀者FQ上YouTube和facebook就是通過此原理。

  (2)、提高訪問速度,由於代理伺服器一般情況下就是一個代理緩衝伺服器,在代理伺服器內有一個巨大的緩衝區,它會對使用者訪問的網站的靜態資源有一個短暫快取,當下一個使用者訪問相同頁面的時候,代理伺服器可以直接從自身的緩衝區中取得資源併發送給使用者而不必從外網重新下載一份,這不僅可以提高網站的訪問速度,還可以節省不必要的頻寬。

  (3)、提高使用者的安全性;由於通過代理伺服器上網可以隱藏自身的真實IP,這一定程度上可以降低自身主機被直接攻擊的機率。

說完什麼是代理,我們接著說什麼是反向代理,反向代理的拓撲圖恰好與代理相反。

 

我用Excel畫了一個簡單的反向代理的草圖,當外網的使用者輸入網址並回車的時候,網站的訪問請求就會通過公網轉發到同樣處於公網反向代理伺服器中,反向代理伺服器接收到來自公網的訪問請求後它會把請求資料包的目的IP轉換成私網的某臺Web伺服器的IP,然後該資料包通過交換機流入到相應的web伺服器中,當網站的訪問請求執行完畢之後,私網的web伺服器會把應答通過交換機發回給反向代理伺服器,反向代理伺服器再把網站應答的資料包中的源IP從私網IP改回自己的公網IP並通過公網反饋給使用者,完成使用者網站的訪問。

使用反向代理最大的一個優點就是可以實現負載均衡。當網站的訪問量很高或者需要進行很複雜的計算時,單臺的Web伺服器往往是無法承載這巨大的壓力的,我們需要多臺Web伺服器來並行的運作,這時我們就可以通過反向代理的負載均衡來獲得伺服器效能的堆疊。當大量的訪問請求到達,反向代理伺服器通過輪詢,把請求分派到各臺Web伺服器處理,代理伺服器本身並不做任何的請求應答,僅僅是做資料的轉發,相對於應答處理,資料轉發對伺服器的效能消耗要小很多,我們的網站也可以獲得更大的承載。

此外,反向代理還可以是我們的網站更安全,我們可以在反向代理伺服器中設定更多的安全設定,在惡意的訪問到達Web伺服器之前先進行攔截和封殺,提高Web伺服器的安全和網站的穩定性。同時,通過反向代理我們還可以完成一些Web伺服器軟體無法直接支援的功能,比如Apache+Tomcat,靜態資源有Apache直接處理,動態資源反代給tomcat。

 在介紹完什麼是反向代理,各位讀者也對反向代理有一個基本的瞭解之後,我們接著來介紹Jexus的反向代理功能如何使用。為了做這個實驗,我需要再新增兩臺的Linux虛擬機器,由於由於這裡用的Hyper-V並不是Server版的,因此並沒有虛擬機器複製的這麼一個功能,因此我只能採取了一種非常暴力的方式,直接把CentOS的目錄重複的拷貝兩份,各位如果是安裝Vm機的讀者可以直接使用VM提供的複製功能,可以無需重複的安裝Linux,並且磁碟的使用量也不會像我這種暴力方法一樣成n的倍數增長,非常方便。

分別為複製的兩臺Linux(Servant)配上“192.168.54.13”和“192.168.54.14”(原Linux的ip為192.168.54.12);並分別在兩臺Servant虛擬機器的/var/www/defalut中新建目錄“reproxy”並放入一個HTML檔案。對於兩臺Servant,我就不建立新的網站配置檔案了,直接的使用預設的“Default”。

  

再在充當代理伺服器角色的那臺Jexus中進行“reproxy”的配置:

儲存並重啟Jexus,在瀏覽器中輸入訪問地址(192.168.54.12:8888/reproxy/reproxy.html):

Jexus已經把我們的請求輪詢到“reproxy”配置項中登記的一臺Linux中。

 這裡我簡單的講解一下Jexus的“reproxy”配置的使用方法和注意事項:

  (1)、使用方法非常簡單,主要有兩大引數需要填寫,第一項是需要進行反向代理的目錄,填入相應的目錄之後,當有需要進入該目錄的訪問Jexus的反向代理功能就會被觸發,對此訪問進行轉發;而第二項則是被代理的伺服器的IP登記列表,不同的IP之間需要以逗號分隔,如果被代理的伺服器不是開放80埠的,需要在IP後加上埠號,若被代理的伺服器的目錄不是根目錄的,同樣也只需要在IP(:埠)後再新增上目錄即可。

  (2)、充當代理伺服器的那臺Jexus,它是不允許出現被代理的內容的,否則Jexus就無法把請求輪詢到其他伺服器中,直接就在本伺服器中解決,使得反向代理失效。出現如下的這種情況:我在代理伺服器中存在“/reproxy/reproxy.html”,當我訪問“xxxx/reproxy/reproxy.html”時,Jexus沒有進行資料轉發,直接就把本機的“reproxy.html”返回給我。

 6、SendFile技術

我們做一個下載功能時,一般會採用以下這兩種做法:對於沒有下載約束、安全性要求不高的檔案,我們會直接把檔案放到網站的Public(共有的)目錄中,然後將下載地址直接指向這個檔案的實體地址即可;而對於一下存在下載條件限制的檔案(比如需要付金幣或者需要達到某種許可權),我們會通過服務端程式操作IO流的方式,配合一些驗證、付費等功能達到檔案下載的目的。對於前一種下載方式,只要提供足夠的IO和頻寬,問題一般不會太大,但是對於後一種下載方式的網站,特別是需要承擔頻繁的大檔案下載的網站,這就不是提供足夠的IO和頻寬就能夠簡單解決問題的。

我畫了一個簡易的草圖,傳統的下載方式提供檔案下載時一般都會經歷圖中的這幾項流程,檔案先被系統從磁碟中讀取到核心的緩衝區,然後再通過應用程式(這裡指網站應用程式)把核心中的檔案位元流拷貝到程式程序本身的緩衝區,最後再把儲存在應用程式程序中的檔案位元流拷貝到網絡卡的socket緩衝區,最後再把socket緩衝區中的檔案位元流推送出去,發到使用者中。可以看得出,通過傳統下載方式實現檔案的下載,使用者每下載一個檔案,在服務端該檔案實際上是通過多次拷貝才能完成的,此外,如今有很多的使用者不再使用瀏覽器提供的下載功能,而是採用一些專業的下載軟體進行檔案下載,這些專業的下載軟體為了提高檔案的下載效率,它們會開多個下載執行緒,通過多程序的下載方式來下載,這就意味著,每多開一個執行緒,服務端就要進行多一份的拷貝,特別是採用把整個一次讀取進記憶體再推送這種暴力方式提供下載的,當下載執行緒開多了或者使用者下載頻率太高了,伺服器上的記憶體資源很快就會爆滿,造成網站無法正常的運作或者直接宕機,造成不必要的麻煩。

SendFile就是針對傳統下載方式的不足所提出的一種下載技術,正如圖中所示,SendFile技術可以把檔案的位元流直接從核心的緩衝區中直接推送至網絡卡中,無需再經過網站應用程式拷貝這一過程,節省了不少的系統資源。此外,大部分的專門提供檔案下載的網站都會把Web服務和檔案服務分別部署在獨立同步的伺服器中,採用SendFile技術避開不必要的檔案拷貝不僅可以使檔案下載時對Web伺服器的衝擊大幅度降低,網站的穩定性提高;還可以減少伺服器間的不必要資訊傳輸,節省頻寬。

現在很多有名伺服器軟體都有提供SendFile功能,比如:LigHttpd、Nginx等,而Jexus同樣提供此功能,名字略有改變——“X-SendFile”,使用方法也不難,只要在Http頭中新增並設定“X-SendFile”屬性即可。

下面我們完成此實驗:

在網站根目錄中通過Linux建立一個100M大小的檔案

cd /var/www/xiaodiejinghong/

 dd if=/dev/zero of=./file.zip bs=1M count=100

然後在Windows中建立一個網站,並寫好我們的應用程式程式碼

介面非常簡單,僅僅只有一個Button,點選此按鈕的時候就開始下載

    protected void Button1_Click(object sender, EventArgs e)
    {
        Response.ContentType = "application/octet-stream";
        Response.AddHeader("Content-Disposition", "attachment;filename=file.zip");
        Response.AddHeader("X-SendFile", "/var/www/xiaodiejinghong/file.zip");
        Response.End();
    }

點選Button後,檔案就可以下載了

這裡有兩個注意事項需要注意的:

  (1)、檔案的位置採用的是系統的絕對路徑,而不是相對於網站根目錄的相對路徑。

  (2)、此外還要注意檔案存放目錄的許可權問題,檔案必須要能夠提供Jexus讀的許可權。

7、前置快取

對於訪問量大並且頁面變化週期不大的入口網站,為了提高網站訪問的速度和提升網站承載的壓力,我們會通過把網頁內容進行靜態化(檔案級)或者快取到記憶體(記憶體級)中,Jexus提供了一個性能不錯的Web平臺級別的頁面快取功能,使用方法也是非常簡單,只要加入程式碼“Response.AddHeader("PageCache-Time","XXX")”,在HTTP頭加入一個Jexus特有的屬性並且設定快取時間即可,這裡的“XXX”是快取時間,單位為秒。沒有太多的難度,這裡就不做演示了。

8、Gzip傳輸壓縮

各位讀者一定知道什麼是壓縮吧?沒錯,壓縮就是通過各種演算法處理一個檔案,使這個檔案在不影響內容的情況下對所需要佔有的磁碟空間變小。壓縮的好處同樣不用我說各位讀者也知道,說白了就是能夠把檔案變小,可以在相同大小的磁碟空間中存放更多的檔案。同樣的,我們在網路傳輸中也需要相同的技術,把檔案壓縮後,檔案會變得更小然後再傳輸,這一方面可以減少網路傳輸中所消耗的流量,另外一方面還可以讓使用者消耗更少的時間就可以把檔案下載下來,是一個一舉兩得的事情。各位讀者細心的話可以發現很多涉及到網路傳輸壓縮的事,比如你用JQuery做網站特效時,它就提供了Full版和Min版,除錯時可以用Full版,真正上線後改為Min版;又或者各位讀者手機中的瀏覽器,很多瀏覽器在設定中都有一個功能,就是使用壓縮傳輸……這一切的一切都是為了同一個目的:消耗更少的流量來傳送相同的內容。

Jexus提供了一個針對靜態檔案的壓縮功能,使用的演算法是目前比較流行的Gzip壓縮演算法。各位讀者如果需要開啟Jexus的Gzip壓縮傳輸功能,則需要在相應的網站配置檔案中開啟該功能。

開啟了該功能後,原先的靜態檔案在推送出伺服器網絡卡之前Jexus會對其進行壓縮,下面兩圖分別是Gzip開啟前和開啟後某HTML靜態檔案的傳輸大小對比。

開啟前:

開啟後:

雖然在我們的實驗中,這個HTML的傳輸大小隻是縮小了0.01KB的大小,但是各位讀者別產生這麼一個念頭:“差別不大,沒什麼作用”,因為一個網站並不是只有一個HTML檔案的,網站中有大量的頁面,而每個頁面中也會包含大量的圖片、Css檔案、JS檔案等靜態的資源,使用者每重新整理一個頁面都會伴隨著大量的HTTP請求和網路的傳輸。

比如我打開了一下我個人的新浪微博,從頁面開始載入到全部載入完畢瀏覽器就已經發起了幾百個的HTTP請求,如果這些資源都經過壓縮傳輸(當然是已經經過壓縮的了),頁面的載入速度將會提高,載入所需要的時間會減少,使用者的體驗也會更好。此外,對於像新浪這類的大網站來說,每日的訪問量都是海量的,哪怕每次使用者的頁面訪問流量減少那麼0.1KB,每天網站的頻寬流量花費也會節省非常大的一筆,畢竟流量就是錢呀。

好吧,本回合我們要討論學習的就到這裡了,不知道各位讀者是否覺得看得有點暈?暈了?不要緊的,因為本文章已經連續寫了8天,畢竟純操作的文章是比較抽象和枯燥的,為了採用最通俗的語言,每一個章節都經歷了“寫了刪,刪了再寫”,我自己也寫得暈乎乎的,各位讀者不明白的話可以多看幾遍,再對一些知識點上網查查資料,問題應該不大。同時在這裡再次感謝Jexus的作者對我不定時“騷擾”提供的幫助。此外,我希望各位讀者在收看本文之餘能夠自己親身的對Jexus的高階功能進行一次的實際操作配置,這樣可以幫助各位更容易也更清晰的瞭解到Jexus裡面的一些功能的要點和注意事項。最後,如果各位讀者對本文有什麼見解,或者有一些關於Jexus使用的技巧,也歡迎在留言板中分享一下。

下一回合,我們將會學習如何在Linux中新建我們的.NET專案,好吧,我們下回見。