網路城邦

上一篇 回創作列表 下一篇   字體:
Apache伺服器係統設定與最佳化[2]
2009/03/25 17:23:28瀏覽1853|回應0|推薦0


ServerSignature On

一些情況下,例如當客戶請求的網頁並不存在時,伺服器將產生錯誤文檔,預設情況下由於開啟了 ServerSignature選項,錯誤文檔的最後一行將包含伺服器的名字、Apache的版本等資訊。有的管理員更傾向於不對外顯示這些資訊,就可以將這個參數設定為Off,或者設定為Email,最後一行將取代為對 ServerAdmin 的Email提示。

Alias /icons/ "/www/icons/"
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all

Alias 參數用於將URL與伺服器檔案系統中的真實位置進行直接對應,一般的文檔將在DocumentRoot 中進行查詢,然而使用Alias定義的路徑將直接對應到相應目錄下,而不再到DocumentRoot 下面進行查詢。因此Alias可以用來對應一些公用檔案的路徑,例如儲存了各種常用圖示的icons路徑。這樣使得除了使用符號連線之外,文檔根目錄(DocumentRoot)外的目錄也可以透過使用了Alias對應,提供給瀏覽器訪問。定義好對應的路徑之後,應該需要使用Directory陳述式設定訪問限制。


ScriptAlias /cgi-bin/ "/www/cgi-bin/"
AllowOverride None
Options None
Order allow,deny
Allow from all

ScriptAlias 也是用於URL路徑的對應,但與Alias的不同在於,ScriptAlias 是用於對應CGI程式的路徑,這個路徑下的檔案都被定義為CGI程式,透過執行它們來獲得結果,而非由伺服器直接返回其內容。預設情況下CGI程式使用 cgi-bin目錄作為虛擬路徑。

# Redirect old-URI new-URL

Redirect 參數是用來重寫URL的,當瀏覽器訪問伺服器上的一個已經不存在的資源的時候,伺服器返回給瀏覽器新的URL,告訴瀏覽器從該URL中獲取資源。這主要用於原來存在於伺服器上的文檔,改變了位置之後,而又希望能使用老URL能訪問到,以保持與以前的URL相容。

IndexOptions FancyIndexing
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*
AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core
AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^
DefaultIcon /icons/unknown.gif
#AddDescription "GZIP compressed document" .gz
#AddDescription "tar archive" .tar
#AddDescription "GZIP compressed tar archive" .tgz
ReadmeName README
HeaderName HEADER
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t

當一個HTTP請求的URL為一個目錄的時候,伺服器返回這個目錄中的索引檔案。但如果一個目錄中不存在預設的索引檔案,並且該伺服器又授權顯示目錄檔案清單的時候,就會顯示出這個目錄中的檔案清單,為了使得這個檔案清單能俱有可理解性,而不僅僅是一個簡單的清單,就需要前面的這些設定參數。如果使用了 IndexOptions FancyIndexing選項,可以讓伺服器產生的目錄清單中針對各種不同類型的文檔引用各種圖示。而哪種檔案使用哪種圖示,則使用下面的 AddIconByEncoding、AddIconByType以及AddIcon來定義,分別依據MIME 的編碼、類型以及檔案的尾碼來判斷使用何種圖示。如果不能確定文檔使用的圖示,就使用 DefaultIcon定義的預設圖示。
同樣,使用AddDescription可以為不同類型的文檔加入不同的描述。並且,伺服器還在目錄下,查詢使用ReadmeName和HeaderName定義的檔案(自動加上 .html尾碼,如果沒有發現,再使用.txt尾碼進行搜尋),如果發現了這些檔案,就在檔案清單之前首先顯示這些檔案的內容,以使得普通目錄清單俱備更大的可理解性。
IndexIgnore讓伺服器在列出檔案清單時略過相應的檔案, 這裡使用模式配置的方式定義檔案名。

AddEncoding x-compress Z
AddEncoding x-gzip gz

AddEncoding用於告訴一些使用壓縮的MIME類型,這樣可以讓瀏覽器進行解壓縮操作。

AddLanguage en .en
AddLanguage fr .fr
AddLanguage de .de
AddLanguage da .da
AddLanguage el .el
AddLanguage it .it
LanguagePriority en fr de

一個HTML文檔可以同時俱備多個語言的版本,如對於file1.html文檔可以俱備file1.html.en、file1.html.fr 等不同的版本,每個語言尾碼必須使用 AddLanguage進行定義。這樣伺服器可以針對不同國家的客戶,透過與瀏覽器進行協商,發送不同的語言版本。而LanguagePriority 定義不同語言的優先順序,以便在瀏覽器沒有特殊要求時,按照順序使用不同的語言版本回應對file1.html 的請求。這個國際化的能力實際的應用並不多。

#AddType application/x-httpd-php .phtml
#AddType application/x-httpd-php-source .phps

 AddType參數可以為特定尾碼的檔案指定MIME類型,這裡的設定將覆蓋 mime.types中的設定。

#AddHandler cgi-script .cgi

AddHandler 是用於指定非靜態的處理類型,用於定義文檔為一個非靜態的文檔類型,需要進行處理,再向瀏覽器返回處理結果。例如上面註釋中的設定是將以.cgi結尾的檔案設定為cgi-script類型,那麼伺服器將啟動這個CGI程式以進行處理。如果需要在前面AliasScript定義的路徑之外執行CGI程式,就需要使用這個參數進行設定,此後以.cgi結尾的檔案將被當作CGI程式執行。在配置檔案、這個目錄中的.htaccess以及其上級目錄的.htaccess中必須允許執行CGI程式,這需要透過Options ExecCGI參數設定。

#AddType text/html .shtml
#AddHandler server-parsed .shtml

另外一種動態進行處理的類型為server-parsed,由伺服器自身預先分析網頁內的標記,將標記變更為正確的HTML標識。由於server- parsed需要對text/html 類型的文檔進行處理,因此首先定義了對應的.shtml為text/html類型。
然而要支援SSI,還要首先要在配置檔案(或.htaccess)中使用Options Includes允許該目錄下的文檔可以為SSI類型,或使用Options IncludesNOExec讓執行普通的SSI標誌,但不執行其中引用的外部程式。
另一種指定server-parsed類型的方式為使用XBitBack設定選項,如果將 XBitHack設定為On,伺服器將檢查所有text/html類型的文檔(包括.html尾碼的文檔),如果發現檔案內容俱備執行位「x",則伺服器就認為它是伺服器分析文檔,需要伺服器進行處理。推薦使用AddHandler進行設定,而將XBitBack 設定為Off,因為使用XBitBack將對所有的HTML文檔都執行額外的檢查,降低了效率。

#AddHandler send-as-is asis
#AddHandler imap-file map
#AddHandler type-map var

上面被註釋的AddHandler用於支援Apache伺服器的asis、map和var處理能力

# Action media/type /cgi-script/location
# Action handler-name /cgi-script/location

 因為Apache內部提供的處理功能有限,因此可以使用Action為伺服器定義外部程式作為可處理的動態文檔類型,這些外部程式與標準CGI程式相同,都是對輸入的資料處理之後,再輸出不同MIME類型的結果。例如要定義一個對特殊尾碼wri都先執行wri2txt進行處理操作,再返回結果的操作,可以使用:
Action windows-writer /bin/wri2txt
AddHandler windows-writer wri
 更進一步,可以直接使用Action定義對某個MIME類型預先進行處理操作,這需要例子中第一種格式的Action 參數設定方式。這樣設定方式就不再需要額外的AddHandler用來將處理操作與檔案尾碼聯繫起來,而是使用Action直接處理MIME類型的檔案。但如果文檔尾碼沒有正式的MIME類型,還需要先定義一個MIME類型。

#MetaDir .web
#MetaSuffix .meta

 Meta 資訊是在文檔發送給客戶之前,預先發送給客戶瀏覽器一些資料,因此瀏覽器可以透過HEAD請求來訪問這些Meta資訊而不必真正透過GET來返回全部文檔資料。伺服器通常發送給瀏覽器的是一些標準的HTTP頭資訊,如果要想增加額外的資訊,就需要使用MetaDir來定義Meta資料存放的目錄,而 MetaS uffix用於指定包含Meta資料的檔案尾碼。

#ErrorDocument 500 "The server made a boo boo.
#ErrorDocument 404 /missing.html
#ErrorDocument 404 /cgi-bin/missing_handler.pl
#ErrorDocument 402
http://some.other_server.c...
如果客戶請求的網頁不存在,或者沒有訪問授權權等情況發生時,伺服器將產生一個錯誤程式碼,同時也將回應客戶瀏覽器一個標識錯誤的網頁。 ErrorDocument就用於設定當出現哪個錯誤時應該回應客戶瀏覽器那些內容,ErrorDocument的第一個參數為錯誤的序號,第二個參數為回應的資料,可以為簡單的文字,本機網頁,本機CGI程式,以及遠端主機上的網頁。

BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4.0b2;" nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch "RealPlayer 4.0" force-response-1.0
BrowserMatch "Java/1.0" force-response-1.0
BrowserMatch "JDK/1.0" force-response-1.0

 BrowserMatch指令為特定的客戶程式,設定特殊的參數,以保證對老版本瀏覽器的相容性,並支援新瀏覽器的新特性。

# SetHandler server-status
# Order deny,allow
# Deny from all
# Allow from .your_domain.com
# SetHandler server-info
# Order deny,allow
# Deny from all
# Allow from .your_domain.com
## Deny from all
# ErrorDocument 403 http://phf.apache.org/phf_...

用於設定訪問控制的設定主要是針對目錄和檔案進行設定的,然而也可以針對不同的URL進行訪問控制的設定,這樣就不必擔心ScriptAlias、 Alias是否將路徑設定到了受控制的目錄之外了。針對URL進行控制的陳述式為 Location陳述式,這樣不但能對伺服器上的檔案、CGI提供保護,此外,它還能保護不能找到對應檔案,而是由伺服器本身提供的特殊功能URL。http://servername/server-s...用於報告當前Apache伺服器的狀態,http://servername/server-i...用於報告Apache 伺服器的統計資訊。與此相關的設定還有ExtendedStatus參數,可以讓伺服器輸出更詳細的的報告。

#ProxyRequests On
# Order deny,allow
# Deny from all
# Allow from .your_domain.com
#ProxyVia On
#CacheRoot "/www/proxy"
#CacheSize 5
#CacheGcInterval 4
#CacheMaxExpire 24
#CacheLastModifiedFactor 0.1
#CacheDefaultExpire 1
#NoCache a_domain.com another_domain.edu joes.garage_sale.com

Apache 伺服器本身就俱備代理的功能,然而這要求載入入mod_proxy模組。這能使用IfModule陳述式進行判斷,如果存在mod_proxy模組,就使用 ProxyRequests開啟代理支援。此後的Directory用於設定對Proxy功能的訪問授權權設定,以及用於設定緩衝的各個參數設定。

虛擬主機
#NameVirtualHost 12.34.56.78:80
#NameVirtualHost 12.34.56.78
# ServerAdmin webmaster@host.some_domain.com
# DocumentRoot /www/docs/host.some_domain.com
# ServerName host.some_domain.com
# ErrorLog logs/host.some_domain.com-error_log
# CustomLog logs/host.some_domain.com-access_log common

預設設定檔案中的這些內容是用於設定命名基礎的虛擬主機伺服器時使用。其中NameVirtualHost 來指定虛擬主機使用的IP地址,這個IP地址將對應多個 DNS名字,如果Apache使用了Listen 參數控制了多個連接埠,那麼就可以在這裡加上連接埠號以進一步進行區分對不同連接埠的不同連線請求。此後,使用 VirtualHost 陳述式,使用NameVirtualHost指定的IP地址作參數,對每個名字都定義對應的虛擬主機設定。
虛擬主機是在一台Web伺服器上,可以為多個單獨網域名稱提供Web服務,並且每個網域名稱都完全獨立,包括俱有完全獨立的文檔目錄結構及設定,這樣網域名稱之間完全獨立,不但使用每個網域名稱訪問到的內容完全獨立,並且使用另一個網域名稱無法訪問其他網域名稱提供的網頁內容。
虛擬主機的概念非常有用,因為雖然一個組織可以將自己的網頁掛在俱備其他網域名稱的伺服器上的下級往址上,但使用獨立的網域名稱和根網址更為正式,易為眾人接受。傳統上,必須自己設立一台伺服器才能達到單獨網域名稱的目的,然而這需要維護一個單獨的伺服器,很多小單位缺乏足夠的維護能力,更為合適的方式是租用別人維護的伺服器。沒有必要為一個機構提供一個單獨的伺服器,完全可以使用虛擬主機能力,使伺服器為多個網域名稱提供Web服務,而且不同的服務互不干擾,對外就表現為多個不同的伺服器。
有兩種設定虛擬主機的方式,一種是基於HTTP 1.0標準,需要一個俱備多IP地址的伺服器,再配置DNS 伺服器,給每個IP地址以不同的網域名稱,最後才能配置Apache的配置檔案,使伺服器對不同網域名稱返回不同的Web文檔。由於這需要使用額外的IP 地址,對每個要提供服務的網域名稱都要使用單獨的IP地址,因此這種方式實現起來問題較多。可以在一個網路介面上系結多個IP地址,Linux下需要使用 ifconfig的 alias參數來進行這個配置,但此時會影響網路效能。

HTTP 1.1標準在協定中規定了對瀏覽器和伺服器通信時,伺服器能夠跟蹤瀏覽器請求的是哪個主機名字。因此可以利用這個新特性,使用更輕鬆的方式設定虛擬主機。這種方式不需要額外的IP地址,但需要新版本的瀏覽器支援。這種方式已經成為建立虛擬主機的標準方式。要建立非IP基礎的虛擬主機,多個網域名稱是不可少的配置,因為每個網域名稱就對應一個要服務的虛擬主機。因此需要變更DNS伺服器的配置,為伺服器增加多個C NAME選項,如:
linux IN A 192.168.1.64
vhost1 IN CNAME linux
vhost2 IN CNAME linux
 基本的設定選項都是為了linux主機設定的,如果要為vhost1和vhost2設定虛擬主機,就要使用VirtualHost陳述式定義不同的選項,在陳述式中可以使用配置檔案前面中的大部分選項,而可以重新定義幾乎所有的針對伺服器的設定。

NameVirtualHost 192.168.1.64
DocumentRoot /www/data
ServerName linux.example.org.cn
DocumentRoot /vhost1
ServerName vhost1.example.org.cn
DocumentRoot /vhost2
ServerName vhost2.example.org.cn

這裡需要注意的是,VirtualHost的參數地址一定要和NameVirtualHost定義的地址相一致,必須保證所有的值嚴格一致,Apache伺服器才承認這些定義是為這個IP地址定義的虛擬主機。

此外,定義過NameVirtualHost之後,那麼對這個IP地址的訪問都被區分不同的虛擬主機進行處理,而對其他IP地址的訪問,例如127.0.0.1,才應用前面定義的預設選項。

另外一些加速方法


1、 Web 頁面和 CGI 頁面採用了瀏覽器緩衝技術。俱體的方法可以參考附錄一:採用 mod_gzip 加速Apache
2、 不要讓 X Windows 執行在妳的 Web 伺服器上,用 Ctrl-Alt-Backspace 關閉 X 。
3、 在 CGI 指令檔中:
                           檔案 I/O:開啟的檔案數目越少越好。
                           Shell 指令:採用全路徑來調用 shell 指令。
                           在Web 頁面目錄中,不要讓檔案數超過 1000 個,檔案越多花費在定位上的時間也越多。
4、 在 Web 伺服器上的圖片越少越好,保證每個圖片都經由圖片壓縮器執行。
5、 應該配置儘量多的記憶體,記憶體的大小對系統效能影響非常大。
6、 可以用strace指令偵錯調用。
        當妳不確定httpd.conf裡的設定變更對處理序的影響時,strace或許能奏效,透過觀察輸出的行數,可以判斷對一個固定頁面訪問時需要的調用數。如:
#ps –ef|grep http
#strace –p http_pid
accept(18, 0xFFBEFA50, 0xFFBEFA74, 1) = 3
fcntl(24, F_SETLKW, 0x001D0E10) = 0
sigaction(SIGUSR1, 0xFFBEF908, 0xFFBEF98 = 0
getsockname(3, 0xFFBEFA60, 0xFFBEFA74, 1) = 0
setsockopt(3, 6, 1, 0xFFBEF9C4, 4, 1) = 0
read(3, " G E T / c a s e i n c".., 4096) = 590
sigaction(SIGUSR1, 0xFFBED800, 0xFFBED880) = 0
time() = 1043377552
stat("/docroot/osc-new/www/caseincident/listCase.php", 0x0022BF5 = 0
umask(077) = 0
umask(0) = 077
setitimer(ITIMER_PROF, 0xFFBEF628, 0x00000000) = 0
sigaction(SIGPROF, 0xFFBEF4F8, 0xFFBEF57 = 0
sigprocmask(SIG_UNBLOCK, 0xFFBEF618, 0x00000000) = 0
getsockopt(6, 65535, 8192, 0xFFBE67B0, 0xFFBE67AC, 0) = 0
setsockopt(6, 65535, 8192, 0xFFBE67B0, 4, 0) = 0
setitimer(ITIMER_PROF, 0xFFBEF788, 0x00000000) = 0
sigaction(SIGUSR1, 0xFFBEF908, 0xFFBEF98 = 0
read(3, 0x001E5BC0, 4096) (sleeping...)

附錄一、採用 mod_gzip 加速Apache
幫助:本附錄為全文引用。

我們知道 mod_gzip 是用來在伺服器端把客戶請求的內容壓縮後發送給用戶端的一個 Apache 模組。本站的 Zope 透過 FastCGI 來實現和 Apache 的結合,Apache 是解析 HTML 頁面的服務程式。安裝好 mod_gzip 後就即能壓縮普通靜態頁面也能壓縮 Zope 文檔。

一、安裝
http://www.hyperspacecommu...
頁面上有 mod_gzip 的二進位碼版本和源碼下載。如果妳使用前者的話,直接把檔案拷貝到 Apache Home 的 libexec 目錄下就可以了。下載 mod_gzip.c 後,如果妳的 Apache 用 DSO 模式安裝的話,用下面簡單的指令就可以安裝了:
# /www/bin/apxs -i -a -c mod_gzip.c

二、配置

安裝完畢以後把下列配置加入httpd.conf :
# mod_gzip 配置
LoadModule gzip_module libexec/mod_gzip.so
AddModule mod_gzip.c

mod_gzip_on Yes
mod_gzip_minimum_file_size 1002
mod_gzip_maximum_file_size 0
mod_gzip_maximum_inmem_size 60000
mod_gzip_item_include mime "application/x-httpd-php"
mod_gzip_item_include mime "text/*"
# 壓縮 Zope 的內容:
mod_gzip_item_include file "[^.]*$"
mod_gzip_item_include mime "httpd/unix-directory"
mod_gzip_dechunk Yes
mod_gzip_temp_dir "/tmp"
mod_gzip_keep_workfiles No
mod_gzip_item_include file ".php$"
mod_gzip_item_include file ".txt$"
mod_gzip_item_include file ".html$"
mod_gzip_item_exclude file ".css$"
mod_gzip_item_exclude file ".js$"

並新增下面的行:

LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i" mod_gzip: %{mod_gzip_compression_ratio}npct." mod_gzip

把對應虛擬主機配置中的記錄檔案參數修改為 mod_gzip

三、壓縮效果
這樣,我們得到類似以下的記錄檔案:
61.169.41.13 - - [02/Mar/2002:01:24:29 -0500] "GET /pipermail/yahoo/2002-March/000026.html HTTP/1.1" 200 72848 "http://www.yahoo.com/pipermail/yahoo/2002-March/subject.html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Q312461; NetCaptor 6.5.0)" mod_gzip: 54pct.
61.169.41.13 - - [02/Mar/2002:01:24:52 -0500] "GET /new/publish/1003233602/index_html HTTP/1.1" 200 4304 "http://www.yahoo.com/new/publish/search?subject=Zope&op=articles" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Q312461; NetCaptor 6.5.0)" mod_gzip: 65pct.
61.169.41.13 - - [02/Mar/2002:01:24:53 -0500] "GET /new/publish/global_css HTTP/1.1" 200 629 "http://www.yahoo.com/new/publish/1003233602/index_html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Q312461; NetCaptor 6.5.0)" mod_gzip: 73pct.
61.169.41.13 - - [02/Mar/2002:01:24:54 -0500] "GET /new/publish/Images/sitetitle_img HTTP/1.1" 304 0 "http://www.yahoo.com/new/publish/1003233602/index_html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Q312461; NetCaptor 6.5.0)" mod_gzip: 0pct.

61.169.41.13 - - [02/Mar/2002:01:26:21 -0500] "GET /new/publish/index_html HTTP/1.1" 200 7317 "http://www.yahoo.com/new/publish/1003233602/index_html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Q312461; NetCaptor 6.5.0)" mod_gzip: 80pct.
61.169.41.13 - - [02/Mar/2002:01:26:22 -0500] "GET /new/publish/global_css HTTP/1.1" 200 629 "http://www.yahoo.com/new/publish/index_html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Q312461; NetCaptor 6.5.0)" mod_gzip: 73pct.
61.169.41.13 - - [02/Mar/2002:01:26:24 -0500] "GET /new/publish/TopicImages/Tutorial HTTP/1.1" 304 0 "http://www.yahoo.com/new/publish/index_html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Q312461; NetCaptor 6.5.0)" mod_gzip: 0pct.
61.169.41.13 - - [02/Mar/2002:01:26:24 -0500] "GET /new/publish/LinkImages/jsp001_img HTTP/1.1" 304 0 "http://www.yahoo.com/new/publish/index_html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Q312461; NetCaptor 6.5.0)" mod_gzip: 0pct.

我們看到 mod_gzip 已經對 .html 和那些沒有點的檔案作了壓縮,壓縮率達到了 70-80%。但是,mod_gzip 對圖片檔案不作壓縮。

四、總結
結合,mod_gzip 和緩衝工俱等,我們完全可以使一台配置較低的 PC 有足夠的能力處理各種 HTML/CGI 等的請求。

( 興趣嗜好電腦3C )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=maxmas&aid=2781352