1. 程式人生 > >鳥哥的Linux私房菜(伺服器)- 第二十章、WWW 伺服器

鳥哥的Linux私房菜(伺服器)- 第二十章、WWW 伺服器

在開始設定 Apache 之前,你要知道由於主機名稱對於 WWW 是有意義的,所以雖然利用 IP 也能架設 WWW 伺服器, 不過建議你還是申請一個合法的主機名稱比較好。 如果是暫時測試用的主機所以沒有主機名稱時,那麼至少確定測試用主機名稱為 localhost 且在你的 /etc/hosts 內需要有一行:

[[email protected] ~]# vim /etc/hosts
127.0.0.1   localhost.localdomain localhost

這樣在啟動你的 Apache 時才不會發生找不到完整主機名稱 (FQDN) 的錯誤訊息。此外, Apache 只是個伺服器平臺而已,你還需要瞭解 HTML 以及相關的網頁設計語法, 如此才能豐富你的網站。

對於想要設計網頁的朋友來說,應用軟體或許是很好入門, 不過想要完整的瞭解網站設計的技巧,還是研究一下基礎的 HTML 或 CSS 比較妥當。

如果你真的對於一些基礎語法有興趣,並且也想要開發一些所謂的『無障礙網頁空間』的話,那麼可以造訪一下http://www.w3c.org 所列舉的標準語法,或者是行政院的無障礙網頁空間申請規範 (http://www.webguide.nat.gov.tw) 相信會有所收穫的啦!

終於要來談一談如何設定 Apache 這個 httpd.conf 設定檔了!再次強調,每個 distribution 的這個檔案內容都不很相同,所以你必需要自行找出相關的設定檔才行喔!那麼這個 httpd.conf 的設定為何呢?他的基本設定格式是這樣的:

<設定專案>
    此設定專案內的相關引數
    ...........
</設定專案>

舉例來說,如果你想要針對我們的首頁 /var/www/html/ 這個目錄提供一些額外的功能,那麼:

<Directory "/var/www/html">
    Options Indexes
    ...........
</Directory>

幾乎都是這樣的設定方式喔!特別留意的是,如果你有額外的設定時,不能隨便在 httpd.conf 裡頭找地方寫入!否則如果剛好寫在 <Directory>...</Directory> 裡面,呼呼! 那麼就會發生錯誤啦!需要前前後後的找一找喔!或者是在檔案的最後面加入也行!好啦,底下咱們先來聊一聊 Apache 伺服器的基礎設定吧!

  • 針對伺服器環境的設定專案

Apache 針對伺服器環境的設定專案方面,包括回應給使用者端的伺服器軟體版本、主機名稱、伺服器設定檔頂層目錄等。 底下咱們就來談一談:

[[email protected] ~]# vim /etc/httpd/conf/httpd.conf
ServerTokens OS
# 這個專案在僅告知使用者端我們伺服器的版本與作業系統而已,不需要更動他。
# 如果不在乎你係統的資訊被遠端的使用者查詢到,則可以將這個專案註解掉即可(不建議)

ServerRoot "/etc/httpd"
# 伺服器設定的最頂層目錄,有點類似 chroot 那種感覺。包括 logs, modules
# 等等的資料都應該要放置到此目錄底下 (若未宣告成絕對路徑時)

PidFile run/httpd.pid
# 放置 PID 的檔案,可方便 Apache 軟體的管理啦!只有相對路徑吧!
# 考慮 ServerRoot 設定值,所以檔案在 /etc/httpd/run/httpd.pid !

Timeout 60
# 不論接收或傳送,當持續連線等待超過 60 秒則該次連線就中斷。
# 一般來說,此數值在 300 秒左右即可,不需要修改這個原始值啦。

KeepAlive On    <==最好將預設的 Off 改為 On 啦!
# 是否允許持續性的連線,亦即一個 TCP 連線可以具有多個檔案資料傳送的要求。
# 舉例來說,如果你的網頁內含很多圖檔,那麼這一次連線就會將所有的資料送完,
# 而不必每個圖檔都需要進行一次 TCP 連線。預設為 Off 請改為 On 較佳。

MaxKeepAliveRequests 500  <==可以將原本的 100 改為 500 或更高
# 與上個設定值 KeepAlive 有關,當 KeepAlive 設定為 On 時,則這個數值可決定
# 該次連線能夠傳輸的最大傳輸數量。為了增進效能則可以改大一點!0 代表不限制。

KeepAliveTimeout 15
# 在允許 KeepAlive 的條件下,則該次連線在最後一次傳輸後等待延遲的秒數。
# 當超過上述秒數則該連線將中斷。設定 15 差不多啦!如果設定太高 (等待時間較長),
# 在較忙碌的系統上面將會有較多的 Apache 程式佔用資源,可能有效能方面的困擾。

<IfModule prefork.c>   <==底下兩個 perfork, worker 與記憶體管理有關!
StartServers       8   <==啟動 httpd 時,喚醒幾個 PID 來處理服務的意思
MinSpareServers    5   <==最小的預備使用的 PID 數量
MaxSpareServers   20   <==最大的預備使用的 PID 數量
ServerLimit      256   <==伺服器的限制
MaxClients       256   <==最多可以容許多少個使用者端同時連線到 httpd 的意思!
MaxRequestsPerChild  4000
</IfModule>
<IfModule worker.c>
StartServers         4
MaxClients         300
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>

上面的 prefork 及 worker 其實是兩個與伺服器連線資源有關的設定專案。預設的專案對於一般小型網站來說已經很夠用了, 不過如果你的網站流量比較大時,或許可以修訂一下裡面的數值呢!這兩個模組都是用在提供使用者連線的資源 (process),設定的數量越大代表系統會啟動比較多的程式來提供 Apache 的服務,反應速度就比較快。 簡單的說,這兩個模組的功能分類為:

  • 針對模組的功能分類來說:

    worker 模組佔用的記憶體較小,對於流量較大的網站來說,是一個比較好的選擇。prefork 雖然佔用較大的記憶體,不過速度與 worker 差異不大,並且 prefork 記憶體使用設計較為優秀,可以在很多無法提供 debug 的平臺上面進行自我除錯,所以,預設的模組就是 prefork 這一個呢!

  • 細部設定的內容方面:(以 Prefork 為例, worker 意義相同)

    • StartServers:代表啟動 Apache 時就啟動的 process 數量,所以 apache 會用到不止一支程式!
    • MinSpareServers, MaxSpareServers:代表最大與最小的備用程式數量。
    • MaxClients:最大的同時連線數量,也就是 process 不會超過此一數量。現在假設有 10 個人連上來,加上前面的 MinSpareServer=5, MaxSpareServers=20,則 apache 此時的程式數應有 15-30 個之意。而這個最終程式數不可超過 256 個 (依上述設定值)!
    • MaxRequestsPerChild:每個程式能夠提供的最大傳輸次數要求。 舉例來說,如果有個使用者連上伺服器後(一個 process),卻要求數百個網頁,當他的要求數量超過此一數值, 則該程式會被丟棄,另外切換一個新程式。這個設定可以有效的控管每個 process 在系統上的『存活時間』。 因為根據觀察所得,新程式的效能較佳啦!

在上面的設定中,比較有趣的是 MaxClients 這個程式模組的引數值,如同上面的說明,這個 MaxClients 設定值可以控制『同時連上 WWW 伺服器的總連線要求』數量,亦即想成最高即時線上人數啦。 不過你要注意的是,MaxClients 的數量不是越高越好,因為他會消耗實體記憶體 (與 process 有關嘛),所以如果你設定太高導致超出實體記憶體能夠容許的範圍,那麼效能反而會降低 (因為系統會使用速度較慢的 swap 啊),此外, MaxClients 也在 Apache 編譯時就指定最大值了,所以你也無法超出系統最大值, 除非...你重新編譯 Apache 啦!

除非你的網站流量特別大,否則預設值已經夠你使用的了。而如果你的記憶體不夠大的話,那麼 MaxClients 反而要調小一點,例如 150 ,否則效能不佳。那,apache 到底是使用那個模組啊?prefork 還是 worker ?事實上 CentOS 將這兩個模組分別放到不同的執行檔當中,分別是:

  • /usr/sbin/httpd:使用 prefork 模組;
  • /usr/sbin/httpd.worker:使用 worker 模組。

那如何決定你使用的是哪一支程式?你可以去查閱一下 /etc/sysconfig/httpd , 就能夠知道系統預設提供 prefork 模組,但你可以透過修改 /etc/sysconfig/httpd 來使用 worker 模組的。 如果你很有好奇心,那麼可以分別試著啟動這兩種模組啊!接下來,繼續瞧瞧其他的伺服器環境設定引數吧!

Listen 80
# 與監聽介面有關,預設開放在所有的網路介面啊!也可修改埠口,如 8080

LoadModule auth_basic_module modules/mod_auth_basic.so
....(底下省略)....
# 載入模組的設定專案。Apache 提供很多有用的模組 (就是外掛) 給我們使用了!

Include conf.d/*.conf
# 因為這一行,所以放置到 /etc/httpd/conf.d/*.conf 的設定都會被讀入!

User apache
Group apache
# 前面提到的 prework, worker 等模組所啟動的 process 之擁有者與群組設定。
# 這個設定很重要,因為未來你提供的網頁檔案能不能被瀏覽都與這個身份有關啊!

ServerAdmin [email protected]  <==改成你自己的 email 吧
# 系統管理員的 email,當網站出現問題時,錯誤訊息會顯示的聯絡信箱(錯誤回報)。

ServerName www.centos.vbird    <==自行設定好自己的主機名稱較佳!
# 設定主機名稱,這個值如果沒有指定的話,預設會以 hostname 的輸出為依據。
# 千萬記得,你填入的這個主機名稱要找的到 IP 喔!(DNS 或 /etc/hosts)

UseCanonicalName Off
# 是否使用標準主機名稱?如果你的主機有多個主機名稱,若這個設定為 On,
# 那麼 Apache 只接受上頭 servername 指定的主機名稱連線而已。請使用 Off。

在某些特殊的伺服器環境中,有時候你會想要啟動多個不同的 Apache,或者是 port 80 已經被使用掉了,導致 Apache 無法啟動在預設的埠口。那麼你可以透過 Listen 這個設定值來修改埠口喔!這也是個很重要的設定值。 此外,你也可以將自己的額外設定指定到 /etc/httpd/conf.d/*.conf 內,尤其是虛擬主機很常使用這樣的設定,在移機時會很方便的

  • 針對中文 big5 語系編碼的設定引數修改

目前的網際網路傳輸資料編碼多是以萬國碼 (UTF-8) 為主,不過在臺灣還是有相當多的網站使用的是 Big5 的繁體中文編碼啊!如果你的 Apache 預設是以 UTF-8 編碼來傳輸資料,但你 WWW 的資料卻是 big5 , 那麼使用者端將會看到『亂碼』!雖然可以透過調整瀏覽器的編碼來讓資料正確顯示,不過總是覺得很討厭。 此時,你應該可以調整一下底下的引數喔!

[[email protected] ~]# vim /etc/httpd/conf/httpd.conf
# 找到底下這一行,應該是在 747 行左右
# AddDefaultCharset UTF-8  <==請將她註解掉!

這個設定值的意義是說,讓伺服器傳輸『強制使用 UTF-8 編碼』的訊息給使用者端瀏覽器,因此不論網頁內容寫什麼, 反正在使用者端瀏覽器都會預設使用萬國馬來顯示的意思。那如果你的網頁使用的是非萬國碼的語系編碼, 此時就會在瀏覽器內出現亂碼了!非常討厭~所以這裡當然需要註解掉。 你必須要注意的是,如果你已經在使用者端上面瀏覽過許多頁面,那麼你修改過這個設定值後,仍然要將瀏覽器的快取 (cache) 清除才行!否則相同頁面仍可能會看到亂碼!網友們已經回報過很多次了, 這不是 Apache 的問題,而是使用者端瀏覽器的快取所產生的啦!記得處理處理!

語系編碼已經取消預設值,那我怎麼知道我的網頁語系在使用者端會顯示的是哪一個?其實在網頁裡面本來就有宣告了:

<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=big5" >
	....(其他省略)....

你應該要修訂的是上述的特殊字型處,而不是透過 Apache 提供預設語系才對!

  • 網頁首頁及目錄相關之許可權設定 (DocumentRoot 與 Directory)

我們不是講過 CentOS 的 WWW 預設首頁放置在 /var/www/html 這個目錄嗎?為什麼呢?因為 DocumentRoot 這個設定值的關係啦!此外,由於 Apache 允許 Internet 對我們的資料進行瀏覽, 所以你當然必須要針對可被瀏覽的目錄進行許可權的相關設定,那就是 <Directory> 這個設定值的重要特色!先讓我們來看看預設的主網頁設定吧!

[[email protected] ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/html"  <==可以改成你放置首頁的目錄!
# 這個設定值規範了 WWW 伺服器主網頁所放置的『目錄』,雖然設定值內容可以變更,
# 但是必須要特別留意這個設定目錄的許可權以及 SELinux 的相關規則與型別(type)!

<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
# 這個設定值是針對 WWW 伺服器的『預設環境』而來的,因為針對『/』的設定嘛!
# 建議保留上述的預設值 (上頭資料已經是很嚴格的限制),相關引數容後說明。

<Directory "/var/www/html">         <==針對特定目錄的限制!底下引數很重要!
    Options Indexes FollowSymLinks  <==建議拿掉 Indexes 比較妥當!
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

這個地方則是針對 /var/www/html 這個目錄來設定許可權啦!就是咱們首頁所在目錄的許可權。 主要的幾個設定專案的意義是這樣的 (這些設定值都很重要!要仔細看喔!):

  • Options (目錄引數)

    此設定值表示在這個目錄內能夠讓 Apache 進行的動作,亦即是針對 apache 的程式的許可權設定啦!主要的引數值有:

    • Indexes:如果在此目錄下找不到『首頁檔案 (預設為 index.html) 』時, 就顯示整個目錄下的檔案名稱,至於『首頁檔案檔名』則與 DirectoryIndex 設定值有關。

    • FollowSymLinks:這是 Follow Symbolic Links 的縮寫, 字面意義是讓連結檔可以生效的意思。我們知道首頁目錄在 /var/www/html,既然是 WWW 的根目錄,理論上就像被 chroot 一般! 一般來說被 chroot 的程式將無法離開其目錄,也就是說預設的情況下,你在 /var/www/html 底下的連結檔只要連結到非此目錄的其他地方,則該連結檔預設是失效的。 但使用此設定即可讓連結檔有效的離開本目錄。

    • ExecCGI:讓此目錄具有執行 CGI 程式的許可權,非常重要!舉例來說,之前熱門的 OpenWebMail 使用了很多的 perl 的程式,你要讓 OpenWebMail 可以執行,就得要在該程式所在目錄擁有 ExecCGI 的許可權才行喔!但請注意,不要讓所有目錄均可使用 ExecCGI !

    • Includes:讓一些 Server-Side Include 程式可以運作。建議可以加上去!

    • MultiViews:這玩意兒有點像是多國語言的支援,與語系資料 (LanguagePriority) 有關。最常見在錯誤訊息的回報內容,在同一部主機中,可以依據使用者端的語系而給予不同的語言顯示呢! 預設在錯誤回報訊息當中存在,你可以檢查一下 /var/www/error/ 目錄下的資料喔!

  • AllowOverride (允許的覆寫引數功能)

    表示是否允許額外設定檔 .htaccess 的某些引數覆寫?我們可以在 httpd.conf 內設定好所有的許可權,不過如此一來若使用者自己的個人網頁想要修改許可權時將會對管理員造成困擾。因此 Apache 預設可以讓使用者以目錄底下的 .htaccess 檔案內覆寫 <Directory> 內的某些功能引數。 這個專案則是在規定 .htaccess 可以覆寫的許可權型別有哪些。常見的有:

    • ALL:全部的許可權均可被覆寫;
    • AuthConfig:僅有網頁認證 (帳號密碼) 可覆寫;
    • Indexes:僅允許 Indexes 方面的覆寫;
    • Limits:允許使用者利用 Allow, Deny 與 Order 管理可瀏覽的許可權;
    • None:不可覆寫,亦即讓 .htaccess 檔案失效!

    這部份我們在進階設定時會再講到的!

  • Order, Allow, Deny (能否登入瀏覽的許可權)

    決定此目錄是否可被 apache 的 PID 所瀏覽的許可權設定啦!能否被瀏覽主要有兩種判定的方式:

    • deny,allow:以 deny 優先處理,但沒有寫入規則的則預設為 allow 喔。
    • allow,deny:以 allow 為優先處理,但沒有寫入規則的則預設為 deny 喔。

    所以在預設的環境中,因為是 allow,deny 所以預設為 deny (不可瀏覽),不過在下一行有個 Allow from all,allow 優先處理,因此全部 (all) 使用者端皆可瀏覽啦!這部份我們會在 20.3.4 進階安全設定當中再提及滴。

除了這些資料之外,跟網站資料相關性高的還有底下的幾個咚咚:

[[email protected] ~]# vim /etc/httpd/conf/httpd.conf
DirectoryIndex index.html index.html.var  <==首頁『檔案的檔名』設定!

如果使用者端在網址列只輸入到目錄,例如 http://localhost/ 時,那麼 Apache 將拿出那個檔案來顯示呢?就是拿出首頁檔案嘛! 這個檔案的檔名在 Apache 當中預設是以 index.* 為開頭的,但 Windows 則以 default.* 之類的檔名為開頭的。如果你想要讓類似 index.pl 或 index.cgi 也可以是首頁的檔名,那可以改成:

  • DirectoryIndex index.html index.htm index.cgi index.pl ...

那如果上面的檔名通通存在的話,那該怎辦?就按照順序啊!接在 DirectoryIndex 後面的檔名引數,越前面的越優先讀取。 那如果檔名通通不存在呢?就是說沒有首頁時,該如何讀取?這就與剛剛談到的 Options 裡面的 Indexes 有關喔! 這樣有沒有將兩個引數串起來?

[[email protected] ~]# vim /etc/httpd/conf/httpd.conf
# Alias  網址列延伸  實際Linux目錄
Alias /icons/ "/var/www/icons/"  <==製作一個目錄別名 (相當類似捷徑)!
<Directory "/var/www/icons">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

這個 Alias 很有趣的!是製作出類似連結檔的東西啦!當你輸入 http://localhost/icons 時,其實你的 /var/www/html 並沒有 icons 那個目錄,不過由於 Alias (別名) 的關係,會讓該網址直接連結到 /var/www/icons/ 下。 這裡面預設有很多 Apache 提供的小圖示喔!而因為設定了一個新的可瀏覽目錄,所以你瞧,多了個 <Directory> 來規定許可權了吧! ^_^

[[email protected] ~]# vim /etc/httpd/conf/httpd.conf
# ScriptAlias  網址列延伸  實際Linux目錄
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>

與上面的 icons 類似,不過這邊卻是以 ScriptAlias (可執行指令碼的別名) 為設定值! 這個設定值可以指定該目錄底下為『具有 ExecCGI 』能力的目錄所在喔!所以你可以將類似 Open webmail 的程式給他放置到 /var/www/cgi-bin 內,就不必額外設定其他的目錄來放置你的 CGI 程式喔! 這樣大概就 OK 了啦!接下來準備一下看看還有哪些額外的設定檔需要處理的呢?