官术网_书友最值得收藏!

3.4 配置Apache服務器

前面已經提到,Apache通過三個配置文件完成幾乎所有的配置。這三個文件分別為:

● httpd.conf:主要的Web服務器配置;

● access.conf:訪問限制和安全;

● srm.conf:MIME與文件關聯。

圖3.2 在Mozilla下看到的Apache服務器的初始頁面

從傳統上說,Apache從三個文件中讀取服務器運行配置。而從Apache版本1.3.4開始,服務器運行配置只存儲在一個文件中(httpd.conf文件)。其他文件仍然存在,但是只包含注釋,告訴用戶該文件只是由于歷史原因而保留,應該將所有配置放入httpd.conf文件。但是,隨Red Hat Linux 6.0發售的1.3.6版本中,配置文件仍舊拆分為三個文件。本書就假設把Apache的所有配置信息默認為全部放置在httpd.conf一個文件中。

★ 注意 ★

如果愿意,仍然可以使用三個配置文件的方案。但是,這三個文件之間的設置差異經過這么多年后已經變得非常模糊。

當Apache進程啟動或者重新啟動時,該進程從配置文件中讀取數據。使用httpd reload命令可以使Apache進程重新裝載配置信息。

3.4.1 httpd.conf文件中的全局配置選項

httpd.conf文件是Apache的主配置文件,其中包含大量的Apache的配置選項,比較常用的配置選項如表3-3所示:

表3-3 httpd.conf文件中的主要配置參數

下面詳細介紹httpd.conf文件中常用的配置參數。

1.ServerType指令

ServerType指令指示服務器的類型。服務器有兩種類型:standalone和xnetd。將其設置為standalone表示服務器啟動一個服務進程時刻等待用戶HTTP請求,當用戶的請求響應后該進程并不消亡。當Server-Type設置為xinetd時,對于任何傳入的HTTP請求,產生一個新的服務器,該服務器在請求服務完成以后立即消亡。這可能在測試配置更改方面有用。因為每次產生一個新的服務器時都要重新裝載配置文件。當然該操作非常慢,因為對于每個請求都有服務器啟動的開銷。

2.ServerRoot指令

用來設置服務器目錄的絕對路徑,它通知服務器到哪個位置查找所有的資源和配置文件。在配置文件中所指定的資源,有許多是相對于ServerRoot目錄的。如果從RPM安裝則ServerRoot指令設置為/etc/httpd,如果從源代碼安裝則為/usr/local/apache。

3.Port指令

指定服務器運行在哪個端口上。默認為80,這是標準的HTTP端口號。用戶在某些特定情況下可能要讓服務器運行在另外的端口上,例如當用戶想要運行一個測試服務器而不希望其他人知道時,這時候可以指定服務器偵聽非80端口。有些版本用Listen指令完成該配置。修改httpd.conf里面關于Listen的選項,例如:

Listen 8000指令就是使Apache監聽8000端口。而如果要同時指定監聽端口和監聽地址,可以使用:

    Listen 15.2.49.1:80
    Listen 15.2.49.2:8000

這樣就使得Apache同時監聽在15.2.49.1的80端口和15.2.49.2的8000端口。

4.User和Group指令

用來設置用戶ID和組ID,服務器將使用它們來處理請求。通常保留這兩個設置的默認值:nobody和nogroup,并且分別在對應的/etc/passwd和/etc/group文件中驗證它們(由于它們是由RedHatLinux提供的,因此它們已經被定義)。如果想使用其他的UID或GID,可以對默認設置進行修改,但是要知道,服務器將以在這里定義的用戶和組的權限開始運行。這表明,假如有一個安全性的漏洞,不管是在服務器上,還是在自己的CGI程序中,這些程序都將以指定的UID運行。如果服務器以root或其他一些具有特權的用戶的身份運行,那么某些人就可以利用這些安全性的漏洞對站點做一些危險的操作。除了使用名字來指定User和Group指令外,還可以使用UID和GID編號來指定它們。如果使用編號,一定要確保所指定的編號與想要指定的用戶號和組號一致,并且要在編號前面加上符號#。

5.ServerAdmin指令

應該被設置為管理服務器的Web管理人員的地址,它應該是一個有效的E-mail地址或別名,如webmaster@yourserver.com。把這一值設置為一個有效的地址十分重要,因為當服務器出現問題時,這一地址將被返回給訪問者。

6.ServerName指令

用來設置服務器將返回的主機名,它應該被設置為一個完全限定的域名。例如,將它設置為www.yourserver.com而不是簡單的www。如果服務器通過Internet訪問而不是僅僅在局域網中訪問,該設置尤為重要。實際上不需要設置該值,除非需要返回的不是該計算機的規范名字。如果不設置該值,服務器將自行判定這一名字并把它設置為服務器的規范名字。但是,用戶若想讓服務器返回比較友好、易記的地址,如www.your.domain。但是不管怎樣,ServerName應該是網絡的一個真正的域名系統(DNS)的名字。如果用戶正在管理自己的DNS,則記住需要為主機添加一個別名。

7.DocumentRoot指令

設置為文檔目錄樹的絕對路徑,該路徑是Apache提供文件的頂級目錄。在默認情況下,它被設置為/home/httpd/html;如果是用戶自己構造代碼,它設置為/usr/local/apache/htdocs。在版本1.3.4以前,該指令出現在srm.conf文件中。例如如果設置DocumentRoot為/webpage/main,那么當訪問http://localhost/index.html時實際就是訪問/webpage/main目錄下的index.html文件。

8.UserDir指令

定義和本地用戶的主目錄相對的目錄,可以將公共的HTML文檔放入該目錄中。說是相對目錄是因為每個用戶都有自己的HTML目錄。該指令默認的設置為public_html。因此,每個用戶在自己的主目錄下都能夠創建稱為public_html的目錄,在該目錄下的HTML文檔可以通過http://servername/~username訪問。這里username是特定用戶的名稱。在版本1.3.4以前,該指令出現在srm.conf文件中。

9.DirectoryIndex指令

指明作為目錄索引的文件名,例如,當請求的URL為http://www.server.com/Directory/時,指明哪個文件作為目錄的索引。通常在這里放入許多文件非常有用,這樣當index.html (默認的值)找不到時,可以使用另一個文件替換。該指令最有用的應用是在目錄中有一個CGI程序運行,作為默認的動作。在這種情況下,該指令類似于DirectoryIndexindex. htmlindex.cgi。在版本1.3.4以前,該指令出現在srm.conf文件中。

10.TimeOut指令

在httpd.conf文件里可設置網絡超時時間,其命令格式為TimeOut n。其中n為整數,單位是秒。

11.MaxSpareServers指令

設置Apache的最大空閑進程數。命令格式如下:

    MaxSpareServers 30

上述指令表明:當空閑進程超過30個的時候,Apache主進程會殺掉多余的空閑進程而保持空閑進程為30個以節省系統資源。非常繁忙的站點調節這個參數才是必要的,但是在任何時候把這個參數調到很大都不是一個好辦法。同時也可以設置類似參數MinSpareServers來限制最少空閑進程數目來加快反應速度。

12.StartServers指令

指明啟動Apache后等待接受請求的空閑子進程數量。

13.MaxKeepAliveRequests指令

設置每個連接的最大請求數。用法如下:MaxKeepAliveRequests 100這樣就能保證在一個連接中,如果同時請求數達到100就不再響應這個連接的新請求,保證了系統資源不會被某個連接大量占用。但是在實際配置中要求盡量把這個數值調高來獲得較高的系統性能。

14.KeepAlive和KeepAliveTimeout指令

設置session的持續時間,例如以下兩個設置:

    KeepAlive on
    KeepAliveTimeout 15

這樣就能限制每個session的保持時間是15秒鐘。session的使用可以使得很多請求都可以通過同一個TCP連接來發送,節約了網絡資源和系統資源。

15.HostnameLookups指令

設置Apache對客戶端進行域名驗證。該參數可以設置on、off或double。如果是使用on,那么只有進行一次反查;如果用double,那么進行反查之后還要進行一次正向解析,只有兩次的結果互相符合才行;而off就是不進行域名驗證。如果為了安全,建議使用double;為了加快訪問速度,建議使用off。

16.BindAddress指令

設置Apache只在特定的IP地址監聽,從而只響應特定IP地址的HTTP請求。

17.LimitRequestBody指令

設置HTTP請求的消息主體的大小,單位為字節。CGI腳本一般把表單里中的內容作為消息的主體提交給服務器處理,所以現在消息主體的大小在使用CGI的時候很有用。例如使用CGI來上傳文件時,如果有如下設置:LimitRequestBody 102400,那么上傳文件超過100k的時候就會報錯。

18.MaxClients指令

設置Apache的最大連接數。

3.4.2 .htaccess文件和訪問限制

任何出現在配置文件httpd.conf中的指令都可能出現在.htaccess文件中。該文件在httpd.conf文件的AccessFileName指令中指定,用于進行針對單一目錄的配置。作為系統管理員,可以指定該文件的名字和可以通過該文件內容覆蓋的服務器配置。當站點有多組內容提供者并希望控制這些用戶對他們的空間進行操作時該指令非常有用。例如,httpd.conf文件中下面部分指出了AccessFileName參數的值:

    //AccessFileName: The name of the file to look for in each directory
    //for access control information.  See also the AllowOverride directive.
    //
    AccessFileName .htaccess

要限制.htaccess文件能夠覆蓋的內容,需要使用AllowOverride指令。該指令可以進行全局設置或者單個目錄設置。要配置默認可以使用的選項,需要使用Options指令。

例如,在httpd.conf文件中,可以見到如下清單:

    #
    # Aliases: Add here as many aliases as you need(with no limit). The format
    # is Alias fakename realname
    #
    # Note that if you include a trailing / on fakename then the server will
    # require it to be present in the URL.  So "/icons" isn't aliased in this
    # example, only "/icons/".  If the fakename is slash-terminated, then the
    # realname must also be slash terminated, and if the fakename omits the
    # trailing slash, the realname must also omit it.
    #
    # We include the /icons/ alias for FancyIndexed directory listings.  If you
    # do not use FancyIndexing, you may comment this out.
    #
    Alias /icons/ "/var/www/icons/"
    <Directory "/var/www/icons">
        Options Indexes MultiViews
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>

1.Options指令

Options可以為None、All或者任何Indexes、Includes、FollowSymLinks、ExecCGI或者MultiViews的組合。MultiViews不包含在All中,必須顯式指定。這些選項解釋如下。

● None:該目錄沒有啟用任何可用的選項。

● All:該目錄啟用了所有選項,除了MultiViews。

● Indexes:當Index.html文件或者另一個DirectoryIndex文件不存在時,目錄中的文件列表將作為HTML頁產生,顯示給用戶。

● Includes:該目錄允許服務器側包含(SSI)。如果允許包含但是不允許在包含中有exec選項,則可以寫為IncludesNoExec。基于安全的原因,對于沒有完全控制權限的目錄,如UserDir目錄,該選項是一個很好的主意。

● FollowSymLinks:允許訪問符號鏈接到文檔目錄的目錄。這種方法不好,不要將整個服務器全部設置為該選項。對某個目錄可以這樣設置,但是在僅當有足夠的理由時才這樣設置。該選項是一個潛在的安全隱患,因為允許Web用戶跳出文檔目錄以外,并且可能潛在地允許用戶訪問文件系統的分區,而這些地方是不希望其他人訪問的。

● ExecCGI:即使該目錄不是ScriptAlias化的目錄,也在其中允許CGI程序。

● MultiViews:該選項是mod_negotiation模塊的一部分。當客戶請求的文檔沒有找到時,服務器試圖計算最適合客戶請求的文檔。

2.AllowOverrides指令

AllowOverrides指令指定.htaccess文件可以覆蓋的選項。可以對每個目錄進行設置。例如,可以對主要文檔root和UserDir目錄的覆蓋有不同的標準。該功能對于用戶目錄特別有用,在這些目錄中用戶沒有訪問主服務器配置文件的權限。

AllowOverrides可以設置為All或者Options.htaccess、FileInfo.htaccess、AuthConfig. htaccess以及Limit.htaccess選項的組合。這些選項含義如下。

● All:表示不讀取.htaccess文件配置內容。

● Options.htaccess:文件可以為該目錄添加沒有在Options指令中列出的選項。

● FileInfo.htaccess:文件包含修改文檔類型信息的指令。

● AuthConfig.htaccess:文件可能包含驗證指令。

● Limit.htaccess:文件可能包含allow、deny、order指令。

3.order指令

order只能設置為Order allow,deny或Orderdeny,allow,表明用戶是先設置允許的訪問地址還是先設置禁止訪問的地址。

4.allow指令

指明允許訪問的地址或地址序列。如allow from all指令表明允許所有IP來的訪問請求。

5.deny指令

指明禁止訪問的地址或地址序列。如deny from all指令表明禁止所有IP來的訪問請求。

★ 注意 ★

在版本1.3.4以前,對.htaccess文件的配置出現在access.conf文件中。

3.4.3 httpd.conf文件中的CGI設置

用HTML編寫的網頁只是靜態網頁,而用戶若想與Web服務器交互,則可以采用CGI的形式。CGI(Common Gateway Interface),即公用網關接口。簡單地說,就是運行在Web服務器上的程序。CGI腳本有兩種使用方法:作為一個表單的Action調用和作為一個網頁URL點擊調用。

1.表單的Action調用CGI程序

例如圖3.3所示的表單,要求用戶輸入姓名和身份證號碼。

圖3.3 一個實際的表單

圖3.3所示的表單對應的HTML語句如下:

    <form method="POST" action="/cgi-bin/login">
          姓&nbsp;&nbsp;&nbsp; 名:<input type="text" name="T1" size="20"><br>
          身份證號碼:<input type="text" name="T2" size="20"><br>
          <input type="submit" value="提 交" name="B1">
          <input type="reset" value="重 寫" name="B2"></p>
          </form>

其中,action指示該表單提交后將交給/cgi-bin/login程序處理。這里/cgi-bin/login就是一個CGI程序。

2.基于URL鏈接的CGI程序

其HTML語句如下:

    <body>
    <a href="/cgi-bin/displaytime">顯示服務器時間</a>
    </body>

同時displaytime文件的腳本如下:

    #!/bin/sh
    echo Content-type: text/plain  //告訴瀏覽器顯示文本的類型
    echo /bin/date                    //顯示Linux系統時鐘

那么單擊【顯示服務器時間】超級鏈接后,系統將顯示類似于“Tue Jul 08 16:15:57 EDT 2005”的系統時間,如圖3.4所示。

要想讓Apache服務器具有如上動態顯示內容的功能,就必須設置好服務器的CGI目錄。在httpd.conf文件中,可以看到如下語句:

    <Directory "/var/www/cgi-bin">
        AllowOverride None
        Options ExecCGI
    </Directory>

圖3.4 顯示服務器時間的超級鏈接

這就是設置CGI目錄的語句。Options參數設置為ExecCGI表示該目錄允許執行CGI程序。CGI程序可以是任意語言編寫的可執行程序,包括PHP,JSP等網頁制作語言程序,也可以是C語言源代碼編譯產生的可執行程序。當然用得最多的CGI程序還是C語言程序和Perl腳本程序。

★ 注意 ★

CGI目錄及該目錄下所有可執行程序必須是任何可執行的,否則用戶通過瀏覽器訪問網頁時不能正確執行該CGI程序。用chmod命令將文件屬性改為755即可。

3.4.4 httpd.conf文件中的URL路徑名設置

用戶在瀏覽器中輸入一個URL,例如www.server.com,該URL對應的Web服務器將返回一個頁面。這個過程如下:

(1)用戶輸入一個合法的URL;

(2)服務器根據其配置,找到一個與此URL對應的文件;

(3)服務器將該文件返回給用戶瀏覽器;

(4)用戶瀏覽器根據返回的文件解析并顯示。

這里涉及一個由URL轉換為服務器上某個文件的問題,這個問題是由Web服務器根據具體配置完成的。本節主要介紹在Apache里如何根據URL地址定位文件在文件系統中的位置。URL地址定位涉及Apache中如表3-4所示的模塊和指令:

表3-4 URL定位涉及的主要模塊和指令

1.DocumentRoot

Apache根據請求定位文件的默認操作是,取出URL路徑(即URL中的主機名和端口部分)附加到由DocumentRoot指定的文件系統路徑后面,組成在網上所看見的文件樹結構。

如果服務器由多個虛擬主機,則Apache會用各虛擬主機自己的DocumentRoot來組成文件系統路徑;還可能根據由mod_vhost_alias提供的指令動態地針對所請求的地址或端口定位文件。

2.DocumentRoot以外的文件

實際應用中,經常有必要允許網絡對DocumentRoot以外的文件進行訪問。對此,Apache提供了多種方法。在Linux系統中,可以在文件系統的DocumentRoot目錄下安置符號鏈接(也稱為軟鏈接)以訪問其外部文件,考慮到安全問題,這種方法僅在相應目錄的Options中設置了FollowSymLinks或SymLinksIfOwnerMatch時才有效。

另一種方法是,使用Alias指令可以映射文件系統的任何部分到網絡空間中。例如下面的命令

    Alias /docs /var/web

可以把URLhttp://www.example.com/docs/dir/file.html映射為/var/web/dir/file.html。ScriptAlias指令功能相似,而且使所有目標路徑下的所有文件被視為CGI腳本。

AliasMatch和ScriptAliasMatch指令可以實現基于正則表達式的匹配和替換,以提供更大的靈活性。例如:

    ScriptAliasMatch ^/~([a-zA-Z0-9]*)/cgi-bin/(.*)/home/$1/cgi-bin/$2

上述命令可以映射http://example.com/~user/cgi-bin/script.cgi為/home/user/cgi-bin/script. cgi,并視之為CGI腳本。

3.用戶目錄

在Linux系統中,一個特定用戶user的主目錄通常是~user/。模塊mod_userdir在網絡上沿用了這個概念,允許使用URL訪問位于各用戶主目錄下的文件,例如:

    http://www.example.com/~user/file.html

出于安全原因,不應該給予網絡用戶直接操作主目錄的權限,而應該在用戶主目錄下建一個新目錄,把網絡文件放在新目錄中,并用UserDir指令告訴服務器。默認的用戶目錄設置是Userdir public_html,因此,上述例子中的URL會映射到/home/user/public_html/file.html,其中/home/user/是/etc/passwd指定的用戶主目錄。當/etc/passwd沒有指定主目錄,那就要用到Userdir指令的另幾種形式。

有些用戶覺得符號“~”(時常會被編碼為%7e)很別扭,希望用其他形式來表達用戶目錄。雖然模塊mod_userdir并不支持,但是,如果合理規劃服務器上的用戶目錄,則還是有可能用AliasMatch指令來達到這個目的。例如,如果希望http://www.example.com/upages/user/file.html映射到/home/user/public_html/file.html,可以這樣使用AliasMatch指令:

    AliasMatch ^/upages/([a-zA-Z0-9]*)/?(.*)/home/$1/public_html/$2

4.URL的重定向

上述指令都指示Apache返回給客戶文件系統的某個特定內容,但是有時候,需要通知客戶其請求的內容位于其他URL,并使客戶產生新的對其他URL的請求,這種機制稱為“重定向(redirection)”,可以用Redirect指令實現。例如:如果DocumentRoot的目錄/foo/被轉移到了/bar/,則可以這樣引導客戶訪問新的位置:

    Redirect permanent/foo/http://www.example.com/bar/

這個命令重定向任何以/foo/開頭的URL路徑到位于同一個服務器www.example.com的/bar/。當然,可以重定向到任何服務器,而不僅僅是原來的那個服務器。

Apache還提供了RedirectMatch指令來解決復雜的重定向問題。例如,要重定向對站點主頁的請求到其他站點,而保留其他所有請求,可以這樣配置:

    RedirectMatch permanent ^/$ http://www.example.com/startpage.html

另一種方法是,暫時地重定向站點的所有頁面到一個特定頁面,如:

    RedirectMatch temp .* http://www.example.com/startpage.html

5.反向代理

Apache還允許將遠程文檔納入到本地服務器的網絡空間,由于Web服務器從遠程服務器取得文檔并返回給客戶,在其中扮演了一個代理服務器的角色,所以這種機制被稱為反向代理(reverse proxying),不同于標準代理的是:在客戶看來,他請求的文檔似乎原本就位于這個反向代理服務器上。

下例演示了當客戶請求位于/foo/目錄下的文檔時,服務器從internal.example.com的/bar/目錄下取回文檔并返回給客戶,似乎文檔原本就在本地服務器上

    ProxyPass /foo/ http://internal.example.com/bar/
    ProxyPassReverse /foo/ http://internal.example.com/bar/

ProxyPass指令使服務器正確地取回文檔,同時,ProxyPassReverse指令改變了起始于internal.examle.com的請求,使之指向本地服務器上的目錄。需要注意的是,被取回文檔中的連接是不會被改寫的,因此,文檔中的所有絕對路徑連接會突破代理機制而直接從internal.example.com取得。

6.URL的重寫引擎

模塊mod_rewrite提供了更強大的URL重寫引擎,可以根據請求中諸如瀏覽器類型、源IP地址等特征來決定最終提交給客戶的內容,還可以使用外部數據庫或程序來決定如何處理一個請求,并可以執行上述的所有三種映射:內部重定向、外部重定向和代理。

7.“文件未找到”錯誤

URL到文件系統的匹配失敗是不可避免的,其產生原因有多種。有時是文檔被轉移了,對此最好是用URL的重定向來引導用戶訪問新的位置。另外,雖然資源已經轉移到新的位置,但是原來的書簽和連接仍然有效。

另一種常見的原因是在瀏覽器或者HTML連接中URL的無意的輸入錯誤,Apache提供了模塊mod_speling(sic)以幫助解決這個問題。如果激活了這個模塊,它會接管“文件沒找到”的錯誤并查找相似文件,如果找到了唯一的一個,mod_speling會重定向到這個文件,如果不止一個,則會列出一張表反饋給用戶。

mod_speling的一個很有用的特性是,它可以忽略大小寫查找文件,對不注意URL大小寫的用戶和Linux文件系統尤為實用。但是,使用mod_speling來糾正偶然的URL錯誤會給服務器帶來額外的負擔,因為每次“不正確”的請求都會引發URL重定向和來自客戶的新請求。

如果所有的努力都失敗了,Apache會返回一個出錯信息頁面,其狀態碼為404(文件沒找到),其頁面內容取決于ErrorDocument指令,并可以靈活地自定義其形式,詳見自定義出錯響應(Custom error responses)和國際服務器出錯響應(International Server Error Responses)。

3.4.5 httpd.conf文件中的MIME類型

瀏覽器支持多種格式文件的顯示,常見的文件格式有plain、html等。在Linux下一般用/usr/local/apache/etc/mime.types文件保存文件的MIME類型。用下列命令可以將不同的MIME類型數據保存到文件/usr/local/apache/etc/mime.types:

    TypesConfig /usr/local/apache/etc/mime.types

在Apache的配置文件中可以通過下面指令指示瀏覽器的默認MIME類型:

    DefaultType text/plain

上述命令表明:如果文檔使用了非標準的后綴,Web服務器不能決定一個文檔的默認類型,那么服務器就使用DefaultType指令定義的MIME類型將文檔發送給客戶瀏覽器。上述指令設置為text/plain。這樣設置的問題是,如果服務器不能判斷出文檔的MIME,那么很多情況下該文檔為一個二進制文檔,但使用text/plain格式發送回去,瀏覽器將在內部打開它而不會提示保存。因此建議將這個設置更改為:

    application/octet-stream

這樣瀏覽器將提示用戶進行保存。

主站蜘蛛池模板: 盐城市| 达日县| 三亚市| 乌鲁木齐县| 扎赉特旗| 黑水县| 凤城市| 肇庆市| 彭水| 呼和浩特市| 金堂县| 郁南县| 镇安县| 怀来县| 桐柏县| 玉门市| 额尔古纳市| 当雄县| 武清区| 新昌县| 马尔康县| 五大连池市| 六枝特区| 竹北市| 本溪| 黄骅市| 嵩明县| 耒阳市| 大足县| 剑河县| 河源市| 章丘市| 鹿泉市| 灵台县| 会同县| 昭苏县| 遵义县| 金乡县| 长乐市| 兴化市| 嘉义县|