Apache/2 安裝與設定 Deimos Jang 提供

準備好你的地獄火!

   Apache/2 安裝與設定(Apacche/2 基礎篇)

Apache,陸地上最強悍的戰鬥直升機,以死亡之神的姿態親臨戰場,令敵人聞名
喪膽;
電腦上最強悍的 HTTP Server 軟體,以勝利王者的姿態登入網路,令所有敵手
俯首稱臣。

  OK,先別急著跳出來,我知道這在網路上享譽盛名的 HTTP 伺服器 "Apache"
不是從美國佬的戰鬥直升機 Apache 取名過來的。但是你一定也不能否認,這網路上
的 Apache 打起仗來可是一點都不含糊,簡直就是所向無敵,它的對手個個對它是頭疼
的要死(微軟的 IIS 聽過吧,搭在 NT 上的;雖然微軟力推它的 IIS + NT,優點說的
是天花亂墜,不過還是被人發現微軟的某網站上面,跑得居然是 FreeBSD + Apache)。
不過這麼強力的伺服器軟體也有個弱點--它的設定可以讓一堆人,還沒上戰場,光是
準備武器就先昏死!

一,歷史
  在我開始講解如何安裝與設定 Apache/2 之前,先來談段歷史--Apache 的由來。
1995 年之前,網際網路上最廣為運用的 HTTP Server並不是 Apache,甚至當時 Apache 
還沒出生哩!當時最流行的 HTTP Server 是伊利諾州州立大學的國家高速運算中心
(NCSA)的 Rob McCool 所研發出來的 HTTP daemon。不過,隨著 Rob McCool 在 1994 
年中離開伊利諾州州立大學,也使得 httpd 缺乏研發動力而停滯不前。此時,雖然有
許多網站站長嘗試著為 httpd 撰寫延伸程式或是除蟲,卻缺乏統合,所有的資源零零
散散的分布在網路的各個角落。沒有統合推動的能力,無法幫助 httpd 繼續進步。1995
年二月底,八個網站站長組成了最初的 Apache Group。他們以 NCSA httpd 1.3 為基礎
,整理了可用的資源,編寫出了第一正式釋出的 Apache Server - Apache 0.6.2 版。
其後,Apache Group 決定更新 Apache 的核心程式碼,歷經 0.7.x 版的翻新程式架構
以及新增延伸功能到 0.8.8 版,又加入了稱為「模組」,可以用來擴充 Apache 伺服器
提供服務的能力的一種方式,以及將原始碼公開,然後拿到各種平台上,重新編譯成
適合該平台作業的執行檔,再經過廣泛的測試後,在 1995 年 12 月 1 日,Apache 1.0
正式發表。從 Apache Group 成立後不到一年的時間,Apache 就超越了 NCSA 的 httpd
而成為了世界上使用率最高的 HTTP Server。

二,簡介
  如何,神吧?不用一年,就站上「King of the HTTP Server」的地位。你或許在
懷疑,Apache 究竟有什麼樣的魔力,不但在短短時間內達到佔有率的第一名,而且時至
今日,它的地位依然屹立不搖?因為....

      1. Apache 是一套免費的軟體(吸引力夠大吧!)。
      2. Apache 公開原始碼,所有人都可以根據作業平台或效能等需求進行更改原始
         碼,重新編譯一個可用的執行檔(如果你有自己寫一個作業系統,也可以
         量身定做一個 Apache Server 喔)。
      3. 也由於公開原始碼,因此幾乎各種平台都可以見到 Apache 的蹤跡。
      4. Apache 公開原始碼的同時,有一個組織 Apache Software Foundatio (ASF) 
         也正進行著維護的動作。所有從原始碼到應用上所發現的臭蟲(bug)或是有
         任何建議提議,也都可以傳達給 ASF 知道,他們會馬上著手除蟲,或是採用
         你的意見,修改以增進效能。
      5. Apache 可以利用外掛模組的方式,大幅增加應用上的彈性與便利,而且任何
         人都可以根據 Apache module API 來編撰符合自己需求的模組,並外掛上
         Apache 來利用。
      6. Apache 僅需少數的系統效能,就可以發揮極大的伺服器功能。

三,熱身
  好了,講了這麼多,該進入主題了。我先聲明,這篇文章不是只有想架設 Web
站台的人才可以讀;即使你是用數據機撥接,或是沒有固定 IP Address,或是自己在
家裡玩,都可以來安裝 Apache/2,了解並應用它。以下的操作情形,我將儘可能的
考慮到各種使用者的狀況。

  本篇介紹的是 Apache/2。所謂 Apache/2,意指 Apache for OS/2。先前提過,
由於 Apache 公開原始碼,因此許多人便著手將 Apache 轉移到他們愛用的作業平台上
,Apache/2 便是由 Brian Havard 在 OS/2 平台上編譯而成,供 OS/2 作業系統所使用
的 Apache HTTP Server。

  在安裝 Apache/2 之前,必須先安裝一些元件。由於 Apache/2 需要 TCP/IP 支援
才能運作,因此請照著下列步驟,檢視你的系統中,是否已經安裝好必要的元件。

  1. 你的 OS/2 硬碟的檔案系統是否為 HPFS?
       你的硬碟的檔案系統必須是 HPFS,因為 Apache/2 內含大量的長檔名檔案,
       如果你不是使用 HPFS,將會造成許多麻煩,甚至 Apache/2 可能還無法使用。

    2. 你是否已經安裝了 TCP/IP 服務程式?
       如果你已經安裝了 TCP/IP 服務程式,應該可以在「桌面」→「程式集」中,
       發現一個名為「TCP/IP」的資料夾。打開這個資料夾,確定裡面不是空的。另外
       ,請依序打開「桌面」→「OS/2 系統」→「系統設定」,裡面應該有一個圖像
       名為「TCP/IP 架構(本地)」或「TCP/IP 架構(Local)」,請確定雙擊該圖像
       可以執行 "TCP/IP 架構"。

       如果你還沒有安裝 TCP/IP 服務程式,沒關係,現在請安裝上去。

  3. 你是否已經正確的設定了 MPTS 的內容?
       無論你是否有安裝 TCP/IP 服務程式,一定都會安裝 MPTS。所謂 MPTS,就是
       「多重通訊協定傳輸服務」。在 OS/2 中,所有的網路卡以及通訊協定都由
       MPTS 來管理。請依序打開「桌面」→「OS/2 系統」→「系統設定」,找到
       名為「MPTS」的圖像,雙擊,啟動 MPTS。在 IBM 的版權宣示畫面後,進入
       主畫面。請按下【架構】,進入後,點選 "LAN 配接卡及通訊協定" 後,按下
       【架構】進入架構畫面。接下來,我將根據沒有網路卡(例如,使用數據機撥
       接連上網際網路)以及有網路卡兩種情形說明。

       沒有網路卡
           請盯著你的畫面。左下方的區域,名為【現行架構】處,是空的嗎?如果
           不是,請確定裡面是 "無網路卡" ,並且掛上 TCP/IP 通訊協定。如果是
           空的,請從左上方【網路配接卡】處,找到 "無網路卡" 後,按下【新增】
           ,一樣,為這張新加入的卡片掛上 TCP/IP 通訊協定。(如圖一)

       有網路卡
           你也是盯著你的畫面。左下方的【現行架構】的區域,請確定所呈列出來的
           ,是插在你機器內部的網路卡。這代表著你的網路卡將被正確的驅動程式
           所驅動。同樣的,為你的網路卡掛上 TCP/IP 通訊協定。(如圖二)

       都好了之後,按下【OK】,回到上一個畫面後,按下【關閉】,回到主畫面後,
       按下【跳出】。系統會提醒你,需要做一些變更,按下【確定】,然後系統會再
       提醒你,需要重新開機。OK,辛苦你了,重新開機吧,這段時機咱們先休息一下
       ,記得馬上回來。

  4. 正確的 TCP/IP 設定。
       相信你已經開機 OK,回來這裡坐好,準備進行下一個步驟了。再來,請確定你
       的 TCP/IP 通訊協定所需要的設定值(如 IP Address,host name 以及 dns 
       server 等)都已經設定正確。以下我將根據有無正式 IP Address 來分別說明
       。

       有被分配與一個合法的 IP Address
           這種情形如宿網,或是某公司內部的區域網路(LAN)中常見。你的機器被
           分與一組可以正式使用在網際網路上的 IP Address 以及 Domain Name
           (host name + domain)。請依序開啟「桌面」→「OS/2 系統」→「系統
           設定」→「TCP/IP 架構(本地)」或「TCP/IP 架構(Local)」,在設定的
           第一頁,請確定 LAN interface 0 的【啟動界面】已經打勾,然後選擇
           【手動設定】,根據你所處於的網路環境的網路管理員所給予你的資訊,
           填入你所擁有的 IP 位址,子網路遮罩(submask),以及路由(router,
           或稱 gateway)等資訊。(註:或許你的 IP Address 不是固定的,而是
           採用 DHCP 通訊協定隨機配給一個;那麼你就不能夠使用【手動設定】,
           而應該改選【自動 使用 DHCP】。)(題外話,如果你沒有固定 ip 
           address,那也真是麻煩,除非你的系統管理員有為每一組 IP Address 
           配置一組 Domain Name,否則你每次 IP Address 一變,你啟動 Apache/2 
           前就得重新更改 httpd.conf 的內容;或許你可以考慮加掛一張"無網路卡"
           ,然後配給一個保留區段的 IP Address,便不用這般麻煩;只是這樣,
           外面的人就進不來了... 但是你的 IP Address 一直變來變去的話,外面
           的人一樣進不來...。)

       沒有被分配與一個合法的 IP Address
           嗯,我想,你並沒有一組合法可用的 IP Address,那麼有幾種情形;第一
           ,你所處於的區域網路,因為 IP Address 不夠,所以採用內部使用保留的
           IP Address,然後透過 router 轉譯,跟外界連結;第二,你可能是用
           數據機撥接的使用者;或是第三,你是在自己架設區域網路,而想架一個
           Web 站台出來,並且在大家的機器開機後,馬上啟動瀏覽器,而瀏覽器
           則是指向你架設在內部的 Web 站台,以這個 Web 用來充當訊息留言板
           (假設你家裡大到用這種方式比較好交代事情的話... )。Anyway,沒有
           沒有固定 IP Address 怎麼辦呢?同上,開啟「TCP/IP 架構(本地)」或
           「TCP/IP 架構 (Local)」,確定 LAN interface 0 的【啟動界面】已
           打勾,然後選擇【手動設定】,這裡你可以填入三種 IP Address。
           IP Address 在規劃時,保留了三個區段不可以直接使用於網際網路上,
           這時候你可以將保留的區段應用在你現在的機器上。請在【IP 位址】處
           輸入 192.168.100.100,在【子網路遮罩】處輸入 255.255.255.0。
           (如圖三)

  5. 安裝 EMX
       EMX 內包含了許多從 Unix 平台轉移到 OS/2 平台的程式,所需要的 DLL,因此
       ,EMX 的存在,大幅簡化了程式由 Unix 平台轉移到 OS/2 的困難度。Apache/2
       同樣也需要 EMX 在你的系統內支援它工作。

       最新的 EMX 可以從ftp://hobbes.nmsu.edu/pub/os2/dev/emx/v0.9d/emxrt.zip
       取得。如果你是學術網路的用戶,而且對外連線又頗慢,不妨試試從我的
       Hobbes Mirror Site 下傳
ftp://ftp.ch.hwh.edu.tw/OS/OS2/hobbes.nmsu.edu/pub/os2/dev/emx/v0.9d/emxrt.zip
  
以上五個步驟,請詳細檢查;關於前四個步驟中,若是需要更詳細的操作步驟,請參照
OS/2中文使用手冊。

四,快速上手
  當我在寫這篇文章時,最新版的 Apache/2 版本為 v1.3.12(v2.0 已經進入 Beta
階段),由 Brian Havard 編譯而成。在 ASF 的網站上,也掛上了 Apache/2 的網頁
http://apache.org/~bjh/apache2/,讀者可以從該網頁取得最新的 Apache/2 以及各種
外掛模組。(圖四)

  請到 http//apache.org/~bjh/apache2/ 取得最新版的 Apache/2 壓縮檔。然後
請在磁碟機根目錄處建立一個名為 Apache 的子目錄(\Apache)(如果你想把
Apache/2 安裝到別的目錄下,不要急,稍後我會講解該怎麼做的),然後將取得的
壓縮檔內容解壓縮到 \Apache 之下。然後切換到 \Apache\htdocs 目錄下,將
index.html.en 更名為 index.html,接下來的動作很重要!!切換到 \Apache\conf
目錄下,用你最喜愛的文書編輯器,編輯位於 \Apache\conf 下的 httpd.conf 檔案
(當檔案開啟時,你可能會開始感到暈眩;天啊,一大堆說明,看不懂的指令,這?
放心,先照著我說的做,稍晚我會為你解釋這個檔案的內容的)。然後搜尋關鍵字串
"ServerName new.host.name"(不包含引號),找到後,將這一行最前面的 # 符號拿掉
,然後將 ServerName 後面的字串清除,改輸入你的 Domain Name 或是 IP Address。
接著,把變更過的檔案儲存起來。然後回到上一層目錄(\Apache),直接執行
httpd.exe,此時畫面應該如圖五,恭喜你,你的 Apache/2 已經安裝完成,並且順利
啟動了。

  如果你要將 Apache/2 安裝到 \Apache 以外的目錄呢?很簡單,我先假設你要將
Apache/2 安裝在 \Server\Apache 之下好了。將壓縮檔內容解壓縮到 \Server\Aapche
,先切換到 \Server\Apache\htdocs,將 index.html.en 更名為 index.html,再切換
到 \Server\Apache\conf,執行 "copy httpd.conf-dist-os2 httpd.conf" 這個命令
,然後用你最順手的文書編輯軟體,編輯這個新的 httpd.conf 檔。首先,你要先搜尋
"@@ServerRoot@@" 這個關鍵字串(不包含引號),然後用你安裝 Apache/2 的目錄名
(在這裡就是用 \Server\Apache)取代它,但是動手前請注意!由於 Apache/2 是從
Unix 平台轉移過來的,因此在設定檔中保留了相當多的 Unix 特性。這些特性包括了
目錄名不包含磁碟機代號,而且目錄的分隔線為 / 而非 \。因此在這裡,你用來取代
@@ServerRoot@@ 字串的目錄名字串應該寫為 /Server/Apache。特別要注意喔!修改完
之後(httpd.conf 中應該有 11 個 @@ServerRoot@@ 字串被取代),也是要搜尋
"ServerName" 這個關鍵字串(不包含引號),然後去除開頭的 # 符號,並且清除
ServerName 之後的字串,填入你的 Domain Name 或是 IP Address;儲存,離開,
回到上一層目錄(\Server\Apache),此時不可以直接啟動 httpd.exe,因為目錄
的改變,會使 httpd.exe 找不到設定組態檔(httpd.conf);你應該用這種方式
啟動:
                httpd.exe -d c:\server\apache

此時你應該會看到如圖五一樣的畫面,恭喜你,你的 Apache/2 已經安裝完成,
並且順利啟動了。

五,詳細設定
  Apache 設計上,原始平台乃是 Unix,在 Unix 上,多數設定檔都是以純文字格式
存在,因為 Unix 行之有年,乃是以文字模式起家,直到後來才有 X-Window 這種 GUI
的出現。為了種種因素考量,純文字格式是一種相當理想的方式。但隨著 GUI 的盛行
(從 Apple 的 Mac OS,到微軟的 Windows,以及 IBM 的 OS/2,甚至 NeXTStep 等的
出現),養壞了許多人的胃口;以致於有不少使用者一看到 Apache/2 這種純文字形態
的組態設定檔的內容,很快就暈了...

  當然,有許多熱心的 OS/2er,寫了不少工具,提供 GUI 界面,來設定 Apache/2
,但是你若是希望能夠真正發揮出 Apache/2 的強大能力,以及為了能夠在緊急的時候
做出快速的應變,基本工夫是非下不可的。一定要了解組態設定檔內所有指令的用法。

  Apache/2 發展到 v1.3.12,在組態設定檔方面,做了一個改進;將原先分散成
三個的檔案(access.conf,httpd.conf 以及 srm.conf),整合成一個檔案
(httpd.conf),大幅增加了設定時的便利性。

  在介紹指令前,先說明兩件事情。第一,在 httpd.conf 中常常可見 # 符號存在
於許多行的行首。# 符號的用意在於,告訴 Apache/2 將這一行視為“註解”,無論
這一行是否存在著有效的指令與敘述,都不要理它;存在 # 之後的內容只是一個文字
註解而已。第二,在 httpd.conf 中關於磁碟機與目錄的敘述,與我們一般使用上有所
差別。先前提過,由於 Apache 乃源於 Unix 平台,因此 httpd.conf 中保留了相當的
Unix 的「特色」。首先,在 httpd.conf 中你看不到所謂【磁碟機代號】的出現,
其次,所有目錄(包含根目錄)所使用的斜線為 /,而非 \。其次,你會看到一些諸如
conf/,log/ 這樣的寫法。這樣的目錄寫法,各位應該注意到,conf/ 前面並沒有加入
 / 符號,亦即 conf/ 這個目錄並非根目錄下的 conf/,那麼這是哪裡的目錄呢?在
httpd.conf 中,Apache/2 利用一個名為 ServerRoot 的指令來指定 Apache/2 所存放
的目錄,而 conf/ 指的就是 ServerRoot 指定的目錄之下的子目錄。如果你將 Apache/2
放在 \Apache 目錄下,那麼 conf/ 就是指 \Apache\conf 這個目錄;如果你將
Apache/2 放在 \Server\Apache 目錄下,那麼 conf/ 就是指 \Server\Apache\conf
這個目錄。以上兩件事情,請各位謹記。

  此篇並非屬於高階或應用級的文章,這篇文章定義在初學者或是接觸不深的使用者
的參考文章;因此目前我介紹的指令,方向有二,第一,根據系統預設值來介紹,亦即
行首沒有 # 符號的指令行;第二,部份適合使用者馬上明瞭其意義,可以直接進行
調整的指令。在 httpd.conf 中,部份的指令(包括行首有 # 符號的指令行),由於
應用上較為複雜,以及未出現於 httpd.conf 中的其他指令,我將另外寫一篇專門介紹
的文章供各位利用。請注意到一件事情,下面介紹的指令用法,適用於 Apache v1.3,
v1.2 或是更早之前的,或許會因為語法的差異而無法通用。

*LoadModule
用法

        LoadModule	模組名		模組檔案存放目錄名/模組檔案名

  首先我們第一個遇到的指令,就是 LoadModule。LoadModule 指令用來將模組掛上
Apache/2 以供使用。例如,各位在 httpd.conf 中所見到的

        LoadModule 	mime_module	libexec/mime.dll

意即載入位於 libexec 目錄下(複習一下,剛剛說過而已; libexec/ 意即指 Apache/2
安裝目錄下的 libexec 這個子目錄)的 mime.dll 這個檔案,並且將這個模組取名為
mime_module。關於 Apache/2 中各種可用的模組以及用途,並不在這一次的討論範圍
內,我打算在下一期再來說明。

  接下來,我們將進入【總體設定區】,在這裡的所有指令的運用,將影響整個
Apache/2 的運作。

*ServerType
用法

        ServerType	選項
	可用的選項為 standalone 與 inetd 兩種。

  ServerType 指令用來指定 Apache/2 執行檔(httpd.exe)的啟動方式。stand-
alone 的啟動方式,是指 httpd.exe 單獨載入,獨立負責所有的作業模式。而 inetd
的啟動方式,則是將 httpd.exe 的啟動指揮權,交給 inetd-超級伺服器程式來控制
。inetd 控制了許多 TCP/IP 程式的啟動與管理。但在 OS/2 下,inetd 所管理的
TCP 程式被限制住了。我已經試過了手動更改 inetd 可啟動的程式列表,然後欲利用
inetd 來管理 Apache/2 的啟動。雖然使用 inetd 可以控制 httpd.exe 的啟動,但是
瀏覽器端雖然可以連上 Server 端(httpd 端),卻一直無法得到回應。所以在 OS/2 
各位只能選用 standalone 模式。


*ServerRoot
用法

        ServerRoot	/目錄名/目錄名

  ServerRoot 用來設定 Apache/2 所存在的目錄。請正確的設定你的 Apache/2 的
所在目錄(注意斜線的方向,以及目錄最末端無須再加斜線)。不正確的設定,將導致
Apache/2 無法工作。


*PidFile
用法

        PidFile         目錄/檔案名

  PidFile 指令用來記錄 httpd.exe 存在於記憶體中的執行緒號碼(Process ID)
。這裡的目錄,你當然可以指定到硬碟上的任何一個目錄。為什麼要記錄 httpd.exe 的
PID 呢?稍後我將會講到有一套指令。這套指令用來讓 httpd.exe 可以衍生出「分身」
(子執行緒)。為什麼需要「分身」?假想一個情況,餐飲店內,若是只有一個服務生
,當客人少的時候,這一個服務生還可以輕鬆的應付;當客人很多的時候,這個服務生
就忙不過來了!Apache/2 也是一樣。如果要處理的資料量很大的時候,只有一隻 
httpd.exe 就會使得伺服器效能下降(因為忙不過來!)。於是變通的方法就是,衍生
出好幾隻的 httpd.exe 來幫忙處理。但是即使是「分身」,依然擁有自己的執行緒;
那麼誰是本尊(母執行緒)?這時候就靠 PidFile 這個指令來將「本尊」的執行緒記錄
下來,必要的時候,就不會搞混了。


*ScoreBoardFile
用法

        ScoreBoardFile	目錄名/檔案名

  在某些機器上,執行 Apache/2 時,會需要建立一個檔案,用在 httpd.exe 的
「本尊」與「分身」之間的溝通。這時就是使用 ScoreBoardFile 這個指令。要如何
得知你的機器執行 Apache/2 時需要建立這種檔案?很簡單,這個指令在 httpd.conf
預設上是開啟的,預設上是建立在 log/ 下,名為 apache_runtime_status 的這麼一個
檔案。你只要直接執行 Apache/2,然後到 log/ 目錄下看看有無這個檔案出現。如果
沒有,那麼便是不需要。如果它出現了,代表你的機器在執行 Apache/2 時需要這種
檔案的存在。請注意,如果你的機器需要這種檔案的存在,那麼當你的機器執行一個
以上的 Apache/2 時,不要使用同一個檔名,以避免錯誤的發生。


*Timeout
用法

        Timeout		秒數
        僅需填入數字

  這個指令是用來決定在以下三種情形時,Apache/2 等待的時間。
     1.Apache/2 收到瀏覽器端(或稱 Client 端)所傳送過來的 GET 指令的
       要求(request)所花掉的時間。
     2.在瀏覽器端發出 POST 或 PUT 指令的要求後,Apache/2 所收到每個 TCP 封包
       之間所花掉的時間。
     3.在 Apache/2 回應瀏覽器端而傳送每個 TCP 封包之間所花掉的時間
預設值是 300 秒。請不要將 Timeout 時間設置小於 300 秒!因為這樣可能會因為
計時器來不及重置,而造成超過時限,而使傳輸中斷。


*KeepAlive
用法

        KeepAlive       選項
        可用的選項有:On 與 Off

  KeepAlive 是根據 HTTP/1.1 所規定的 HTTP 延伸功能,可以允許只用一個連結
(connection)來傳送許多要求(request)到 Server 端。利用 KeepAlive 功能,
因為 Client 端無須每傳送一個要求,便需要連結一次,因此可以有效的提升 Web 站台
的運作效率。


*MaxKeepAliveRequests
用法

        MaxKeepAliveRequests		數目
        僅需輸入數字

  MaxKeepAliveRequests 是配合 KeepAlive 指令運作,作用在於限定每一個連結
所能傳送的要求的上限值。設定一個較高的數目值,可以有效提升 Web 站台運作的
效率。若是不想做任何的設限,請將數目設成 0。

                  
*KeepAliveTimeout
用法

        KeepAliveTimeout		秒數
        僅需輸入數字

  KeepAliveTimeout 指令是用來告訴 Apache/2,從同一個 Client 端同一個連結
所傳送過來的要求,每個要求之間能夠等待的最長時間(時限)。如果超過了時限,而
依然沒有要求傳送過來,Apache/2 便會將這個連結中斷。


*MinSpareServers
*MaxSpareServers
用法

        MinSpareServer		數目
        MaxSpareServer		數目
        僅需輸入數字

  這兩個指令擺在一起是有其用意的。之前我們有提過,httpd.exe 可以在記憶體
中製造「分身」以用來減輕「本尊」的工作量而達到增加伺服器效能。而在這裡的兩個
指令,就是用在指定「分身」的數量。MinSpareServer 用來指定「分身」的最少數量
,如果記憶體中,httpd.exe 的「分身」數量小於指定數目,Apache/2 最快將以每秒
一個的速度產生出「分身」,直到達到指定的數目,或是達到 MaxSpareServer 所指定
的數目為止。而 MaxSpareServer 則是用來指定「分身」的最大數量。另外注意的是,
這兩個指令所指定的,是「閒置」的 httpd.exe 的數量,而並非指執行的 httpd.exe 
的數量。需要提醒的是,除非你的 Web 站台所需要處理的資料量十分龐大,你才需要
變更這兩個指令所指定的數目;請慢慢的增加,不要一次大幅增加數目。因為過多的
閒置「分身」,將會消耗大量的系統資源。


*StartServers
用法

        StartServers		數目
        僅需輸入數字

  這個指令用來當 Apache/2 啟動時,要同時建立幾個「分身」httpd.exe 於記憶體
中。這時候可能就有人好奇,想玩啦... 如果這裡的數目設定的比 MinSpareServer 的
數目小或是比 MaxSpareServer 的數目大,會怎樣?不會怎樣的啦,Apache/2 啟動後
,會根據 MinSpareServer 和 MaxSpareServer 所指定的值來動態的調整,它才不會被
你整到哩!


*MaxClients
用法

	MaxClients		數目
	僅需輸入數字
	
  這個指令限制了同一個時間,所有的連結所傳送過來的要求的數目。過多的要求
可能會造成伺服器硬體處理上的來不及而產生意外。所以你可以根據你的硬體或是其他
需求,調整這個值,來符合你的情況。另外,這個指令的值上限為 256,也就是同時間
只能接受 256 個要求。當傳送到 Apache/2 的要求數目超過了這個指令所指定的值時
,其他的要求將會被要求「領號碼牌,後面排隊等」,直到最前面「塞車」情形解決
了為止。


*MaxRequestsPerChild 0
用法

	MaxRequestsPerChild		數目
	僅需輸入數字
	
  這個指令限制了每一個「分身」所能處理的要求的數目。當「分身」處理了足夠
的要求後(也就是你輸入的數目),這個「分身」就會自裁,然後從記憶體中消失。
"數目"的地方如果輸入的數字為 0 的話,亦即不給予限制,每個「分身」都必須一直
待在記憶體中處理所有的要求。設限每個「分身」所處理的要求,有什麼好處?
 1.可以避免因為某些要求的影響而造成記憶體資源突然大量的被消耗。
 2.當系統負擔下降之後,也可以有效的減少記憶體中「分身」的數量。


各位,輕鬆的已經過去了。接下來,我們將進入伺服器主設定區。這裡所有的指令,將
影響 Apache/2 所表現出來的「伺服器特質」,以及對於 Client 端丟過來的要求的
處理態度(除了特別交由 <VirtualHost> 指令進行處理的要求以外)。


*Port
用法

	Port		數目
	僅需輸入數字
	
  Port 指令用來指定當 Apache/2 啟動後,應該「聆聽」哪一個 TCP 埠。在 HTTP
標準中,是以 TCP 埠 80 來作為溝通用。如果你使用瀏覽器連上一個 Web 站台,在
沒有特別指定時,所有瀏覽器傳送給 Web 站台的要求都將送往 TCP 埠 80,而 Web
站台的伺服器軟體也是「聆聽」是否有來自 TCP 埠 80 的要求。因此,如果你沒有特別
的需求,請保留這個指令後面的數目為 80。你若是想要利用其他的 TCP 埠,也可以,
但是要注意兩件事;第一,請使用大於 1023 以上的 TCP 埠;因為 1023 以下的 TCP
埠,大多數都已經被「內定」了,像是 POP3,SMTP,FTP,TELNET 等服務,所以盡量
選擇 1023 以上的 TCP 埠,才不會「踩到地雷」。其次,若是希望別人連結上你的 Web
站台,請對方在連結時,位址後面加上冒號以及埠號,如

	http://www.website.domainname:8000/

這樣的用法,才可以順利的連結你的 Web 站台。


*User nobody
*Group #-1
  這兩個指令請保留原來的值。我只所以沒有列出解釋它們的用法,是因為在 OS/2
之下這兩個指令並沒有用處。在 Unix 系統上,不同的使用者名稱(或群組)有著不
一樣的使用權限,為了必要的權限,有時候必須改變 httpd.exe 啟動後歸屬於哪一個
使用者或是哪一個群組。在 OS/2 下,並沒有這樣的設計,因此這兩個指令,在 OS/2
下並不起作用,請保留原值。


*ServerAdmin
用法

	ServerAmdin	網站管理員的電子郵件位址
	
  這個指令用來指定你的 Web 站台的管理員的電子郵件。在某些時候,連結上可能
會有錯誤,Apache/2 會秀出一個錯誤結果的網頁給使用者。而此時這個電子郵件位址
就會被包含在該網頁上,好讓使用者可以寫信給管理員,通知這個錯誤(你總不希望
自己網站出錯了都還不知道吧!把你會接信的電子信箱位址填入吧!)。


*ServerName
用法

	ServerName	伺服器的 Domain Name 或是 IP Address

  ServerName 用來指定回傳給 Client 端的瀏覽器所呈現出來的站台名稱(例如,
你的機器的 Domain Name 是 mymachine.com.tw,當使用者的瀏覽器連上後,你希望
呈現在瀏覽器的位址列是 www.mymachine.com.tw,就利用這個指令並在後面填入 www.
mymachine.com.tw 即可)。要注意的是,如果你的機器並沒有一組合法的 Domain Name
(意即正式註冊於 DNS Server 中的 Domain Name),請不要利用 ServerName 指定
名稱,這樣會造成 Apache/2 無法啟動。如果你沒有一組合法的 Domain Name,請改
輸入你的機器的 IP Address。(由於後續一些指令都需要用到 ServerName 所指定的
名稱,在這裡,我們假設 ServerName 後面指定的名稱為 www.website.domainname。
)


*DocumentRoot
用法(包含引號)

	DocumentRoot	"/目錄名/目錄名"

  DocumentRoot 用來指定你的網頁存放的實際位置。舉例說,當你把網頁檔案放置
在硬碟中的 \Ser\Web 這個目錄下,你希望當使用者輸?
Jhttp://www.web.site/index.html 時,看到的就是 \Ser\Web\index.html 這個檔案
,就利用 DocumentRoot 來指定網頁檔案存放的目錄為 "/Ser/Web"。利用這個指令,
你可以將你的網頁放置在任何一個目錄下,然後再指定過去即可。


*<Directory />
*    ...................
*</Directory>

  在這裡,我們遇到了新的指令,而且形態似乎跟之前所使用的指令有著些許的
差異。現在,我並不在這裡解釋 <Directory> 以及 </Directory> 這種形態的指令
的用法(包含稍後各位將會在遇到類似形態的 <IfModule> 以及 </IfModule> ,
<Files> 及 </Files> 等等的指令),因為這些指令的用法較為複雜。我們先跳過
這種形態的指令(包括一個長得不像的 AccessFileName 指令)然後繼續解釋那些長得
像前面的,剩下的指令。這些形式比較複雜的新指令,我放在最後再來講(
AccessFileName 之所以現在不講,是因為它要配合 <Directory> 雙指令運作)。


*UseCanonicalName
用法

	UseCanonicalName	選項
	可用的選項有︰On,Off 以及 DNS

  UseCanonicalName 指令,用來指定你的伺服器的名稱用的。還記得前面我們使用了
兩個指令,一個是 ServerName,另一個是 Port 嗎?當時我有說過,ServerName 要
指定你機器的 Domain Name 或是 IP Address(如果沒有 Domain Name 的話);而當
Client 端連上你的機器後,出現在 Client 端瀏覽器的位址列的完整 URL,就是你所
設定 ServerName 時所輸入的值(還記得嗎?我們之前說過,先假定這個值目前為
www.website.domainname)。之所以 Client 端瀏覽器會秀出這個值,是因為 Apache/2
回報給它的。而 Apache/2 之所以要回報這個值給 Client 端瀏覽器,就是因為這個
的關係。那麼後面三個選項又有什麼用途呢?

  當 UseCanonicalName 選項為 "On" 的時候,Apache/2 就會回報完整的名稱(即
ServerName 後所輸入的名稱)給 Client 端的瀏覽器。此時,若是在 LAN (或稱
Intranet)中,使用者在瀏覽器的位址列輸入 www 之後並按下 [Enter],Apache/2 會
自動將要求導向 www.website.domainname 的位置去。當 UseCanonicalName 選項為 
"Off" 的時候,,當使用者輸入 www 並按下 [Enter] 後,Apache/2 並不會將位址重新
導向,而 Client 端瀏覽器的位址列就是直接呈現 www。若設為 DNS,則 Apache/2
會根據伺服器的 IP Address 向 DNS Server 做 IP 反查,查出該組 IP Address 登記
於 DNS Server 中的 Domain Name,然後將此組 Domain Name 回傳給 Client 端的
瀏覽器。

  要注意的是,這裡的設定會牽扯到 CGI 程式的運作。每個 CGI 程式寫作時,對於
伺服器名稱的取得方式不一;對於需要設定固定一組的伺服器名稱的 CGI 程式,若是
伺服器名稱浮動,可能會產生意想不到的錯誤。


*DefaultType
用法

	DefaultType	MIME 格式
	
  所謂 MIME 格式全名為 Multipurpose Internet Mail Extensions,藉由 MIME
格式,電子郵件可以傳輸除了純文字以外的檔案格式,如圖檔,聲音檔,或是二進位檔
。MIME 的指定方式為 [檔案形式]/[檔案格式]。而 MIME 格式也應用在 HTTP 上。
當 Client 端瀏覽器在伺服器上找到一個檔案,但是卻無法判斷這個檔案的 MIME 格式
時,Client 端瀏覽器就會問伺服器說「這是啥咪東東?」為什麼瀏覽器不知道這個檔案
的 MIME 格式?因為瀏覽器端所登記的 MIME 格式有限,找不到符合的來用;而伺服器
端的 MIME 格式當然不可能無限,而伺服器端也找不到符合的來套上去。那怎麼辦呢?
所以我們就給 Apache/2 一個「制式答案」,只要有瀏覽器這麼問,Apache/2 就這麼
答。而這個「制式答案」,就是用 DefaultType 這個指令來指定。

  這個指定的「制式答案」,要根據你實際目錄中,所包含的大多數檔案的格式來
決定。例如,如果你實際目錄中,包含了多數的純文字檔,那麼 DefaultType 就應該
指定為

	DefaultType	text/plain
	
;但是如果大多數都是 html 呢?那就改為

	DefaultType	text/html
	
;如果都是 Gif 檔呢?就改成

	DefaultType	image/gif
	
。諸如此類,就是這麼用啦。


*HostnameLookups Off
用法

	HostnameLookups		選項
	可用的選項有︰On,Off 以及 Double

  HostnameLookups 最主要的目的,在於記錄連上伺服器的 Client 端時,是否要將
Client 端的 IP Address 轉換為 Domain Name。若選項為 "Off" 時,就是只在記錄檔
中記錄 IP Address 即可。若選項為 "On",就是將 Client 端的 IP Address,向 DNS
Server 進行反查,查出所屬的 Domain Name,再記錄於記錄檔中。而 "Double" 的動作
,則是在 Client 端連上伺服器後,先將 Client 端的 IP Address 向 DNS Server 
進行反查,查出所屬的 Domain Name 後,再將這組 Domain Name 向 DNS Server 查詢
所屬的 IP Address,並且與原先的 IP Address 比對,是否相同,然後再記錄於記錄
檔中。一般而言,這個選項我建議設為 "Off"。因為若是每個 Client 連上來之後,
都要向 DNS Server 進行查詢的動作,將會增加伺服器系統的負擔,而且也會佔用一
部份的網路頻寬;況且,記錄中即使只有 IP Address,我們依然可以藉由 nslookup
指令來查詢其對應的 Domain Name。


*ErrorLog
用法

	ErrorLog	目錄名/檔名

  ErrorLog 指令指定,當 Apache/2 處理上所遇到的錯誤,儲存的地點。"目錄名"
的地方,你可以使用絕對路徑(由根目錄 / 開始)或是相對路徑。


*LogLevel
用法

	LogLevel	選項=等級

  LogLevel 用來指定,當 Apache/2 處理上遇到錯誤時,記錄在 ErrorLog 指令所
指定的檔案中,錯誤訊息的種類。"選項" 的部份,就是各種不同等級的錯誤訊息,我
一一列在下面(根據訊息的重要性逐漸減少來排列):

等級        解說
            範例
emerg       最高緊急狀況 - 系統已經無法運行
            "Child cannot open lock file. Exiting" 
            
alert       紅色警戒 - 必須立刻採取某種行動
            "getpwuid: couldn't determine user name from uid" 
            
crit        危險!
            "socket: Failed to get a socket, exiting child" 
            
error       錯誤狀況
            "Premature end of script headers" 
            
warn        警告情形
            "child process 1234 did not exit, sending another SIGHUP" 
            
notice      雖屬平常但需要注意的情形
            "httpd: caught SIGBUS, attempting to dump core in ..." 
            
info        運行狀況
            "Server seems busy, (you may need to increase StartServers, or
             Min/MaxSpareServers)..." 
             
debug       除錯資訊
            "Opening config file ..." 
            
  指定等級時具有「回朔性」;例如,你如果指定記錄等級為 info,則 info 以上
(也就是重要性比 info 高的)所有等級,包括 notice,warn,error 等的訊息,
通通都會被記錄起來;換言之,如果記錄等級指定為 alert,那麼除了 alert 以及
emerg 兩個等級以外的其他所有訊息都會被忽略。為了安全性的考量,建議等級設定時
,最高不要高於 crit,才有足夠的資訊可以在發生錯誤時,用來判斷情形。


*LogFormat
用法(包含引號)

	LogFormat	"記錄內容格式" 暱稱(暱稱可忽略)

  LogFormat 事實上,是一個搭配用的指令。LogFormat 用來指定訊息記錄在記錄檔
中的格式,可以利用的格式相當多。而 "暱稱" 的作用,在於將前面所記錄的格式儲存
在 "暱稱" 當中,然後後續若有其他屬於記錄格式的指令,若是可以指定記錄時的內容
格式,此時 "暱稱" 就派上用場了,我們馬上來利用一個例子解說。下面這個例子中所
使用的指令 CustomLog 是下一個解說的指令,這邊先看看 CustomLog 與 "暱稱" 的
搭配

	LogFormat "%h %l %u %t \"%r\" %>s %b" common
	CustomLog logs/access_log common

相信各位首先在 LogFormat 已經看到了,在兩個引號之間指定了訊息記錄的格式後,
將這種格式名一個暱稱為 common;在下一個指令 CustomLog 中,指定了在 log/ 目錄
下,依照 common 所指定的格式,將存取動作記錄在 access_log 中。這麼一來大家
應該就了解 "暱稱" 的用法囉。好的,再來,我來解釋所有 LogFormat 所能指定的格式
,以及代表的符號

%...a:          Client 端的 IP Address
%...A:          本地端的 IP Address
%...B:          送出的 Byte 數(不包含 HTTP 檔頭資訊)
%...b:          依 CLF 格式記錄送出的 Byte 數(不包含 HTTP 檔頭資訊)
                舉例,如果沒有送出任何 Byte,則記錄為 "-" 而不是 0。
%...f:          Client 端所讀取(或存入)的檔案名
%...h:          Client 端的 Host Name
%...H           Client 端與伺服器連結所使用的通訊協定
%...l:          Client 端所使用的記錄檔名(利用 identd 來擷取資訊,但並非所有
                完全支援)。
%...m           Client 端傳來的要求的種類
%...p:          Client 端與伺服器之 Apache/2 溝通的 TCP 埠數目
%...P:          在伺服器中,是哪一個「分身」提供個這個連結服務的(在此記錄的
                是該「分身」的執行緒號碼)。
%...q           質詢串(如果存在,就以 ? 字元表示;如果不存在,就會在記錄中
                留下一個空白)。
%...r:          Client 端傳送過來的要求的第一行訊息
%...s:          此次服務的狀態代碼。關於狀態代碼所代表的意義,請查詢 HTTP
                規格書。這裡所記錄的狀態代碼是一開始的狀態代碼,如果希望記錄
                的是最後的狀態代碼,請改為 %...>s。
%...t:          Apache/2 提供服務的時間
%...T:          此次服務所花費的時間(秒數)
%...u:          Client 端使用者名稱(如果 %s 指令得到的是錯誤 401 狀態的話,
                這裡記錄到的使用者名稱就可能是錯誤的)
%...U:          Client 端所輸入的 URL 位址
%...v:          當 Apache/2 回應這個要求並為這個要求服務時,所顯示出來的
                伺服器名稱
%...V:          根據 UseCanonicalName 的設定會得到不同的「伺服器名稱」(詳情
                請回顧 UseCanonicalName 這個指令的用法),這裡記錄的是根據
                UseCanonicalName 不同的設定而得到的伺服器名稱。
                
  指定格式時,`...' 的部份可以省略掉。


*CustomLog
用法

	CustomLog	目錄名/檔名	暱稱(或記錄格式)

  剛剛介紹 LogFormat 的時候,有用到 CustomLog;現在就來解釋它的作用。
CustomLog 用來記錄所有「客人」(Custom),也就是 Client 端連上來之後,對
伺服器所作的所有的動作。當然,除了指定記錄檔存放的目錄以及檔名之外,也可以
指定記錄時的格式;格式的表示法與 LogFormat 的格式表示法相同,甚至我們可以先
利用 LogFormat 表示好格式,並且指定一個 "暱稱" 給這個格式後,在使用 CustomLog
這個指令時,我們就只需要告訴 CustomLog 我們要使用哪一個 "暱稱" 所代表的格式;
CustomLog 指令可以同時下達好幾個,將不同格式的記錄儲存在不同的檔案中。


*ServerSignature On
用法

	ServerSignature	選項
	可用的選項有︰On,Off 以及 Email

  ServerSignature 指令用來選擇,當 Apache/2 遇到如錯誤訊息等情形而產生一份
告知使用者目前情形的網頁時,是否要附加上一些提示使用者的資訊。如果設定為 
"Off",就是除了內定告知使用者的資訊以外,不再附加其他資訊。如果設定為 "On",
則表示在該網頁加上 ServerName 指令所指定的伺服器名稱;如果設定為 "Email",
則在該告知網頁上,附加上 ServerAdmin 指令所指定的電子郵件位址。


後記
  Apache 能成為世界上佔有率最高的 HTTP Server,原因是因為穩定,高效率,
富彈性等優勢。其中關於設定與應用方面,絕非三言兩語所能道盡。到目前為止,各位
已經稍微了解到 Apache/2 的設定了。但這只是九牛一毛罷了。我將盡我所能,完成
另一篇詳細介紹所有指令用法的文章,以提供各位更詳細的參考。

小恐龍工作坊 提供