httpd配置文件詳解(一)

httpd主要有以下特性:

高度模塊化:core + modules

DSO: Dynamic Shared Object,動態共享庫

MPM:Multipath Processing Modules,多道處理模塊

  同時支持以下功能:虛擬主機;CGI:Common Gateway Interface,通用網關接口;反向代理;負載均衡;路徑別名;豐富的用戶認證機制;basic;digest;支持第三方模塊。

配置文件參數格式特點: 

配置指令不區分字符大小寫

值可能區分大小寫

有些指令可以重複出現多次 

配置文件格式包含三部分:

全局配置

主機配置:適用於主機只提供一個站點

虛擬主機:用於提供多個站點

常用配置:

1、ServerRoot

用於指定Apache的運行目錄,服務啓動之後自動將目錄改變爲當前目錄,在後面使用到的所有相對路徑都是想對這個目錄下。

2、Listen 80

(1) IP省略時表示監聽本機上所有可用的IP地址;

(2) Listen指令可以出現多次,用於指明多個不同的監聽端口或套接字

3、LoadModule:加載特定的DSO模塊

Apache默認將已編譯的DSO模塊存放於目錄結構小節中所示的動態加載模塊目錄中。

語法:LoadModule module filename

如:LoadModule rewrite_module modules/mod_rewrite.so

如果filename使用相對路徑,則路徑是相對於ServerRoot所指示的相對路徑。

4、User,Group

設置實際提供服務的子進程的用戶。爲了使用這個指令,服務器必須以root身份啓動和初始化。如果你以非root身份啓動服務器,子進程將不能夠切換至非特權用戶,並繼續以啓動服務器的原始用戶身份運行。如果確實以root用戶啓動了服務器,那麼父進程將仍然以root身份運行。用於運行子進程的用戶必須是一個沒有特權的用戶,這樣才能保證子進程無權訪問那些不想爲外界所知的文件,同樣的,該用戶亦需沒有執行那些不應當被外界執行的程序的權限

強烈建議專門爲Apache子進程建立一個單獨的用戶和組。一些管理員使用nobody用戶,但是這並不能總是符合要求,因爲可能有其他程序也在使用這個用戶。

5、ServerAdmin

設置在所有返回給客戶端的錯誤信息中包含的管理員郵件地址。一般較少設置。

6、ServerName

設置服務器用於辨識自己的主機名和端口號。

7、DocumentRoot

設置Web文檔根目錄,如果directory-path不是絕對路徑,則被假定爲是相對於ServerRoot的路徑。指定DocumentRoot時不應包括最後的"/"。

8. <Directory>

<Directory>和</Directory>用於封裝一組指令,使之僅對某個目錄及其子目錄生效。

Directory-path可以是一個目錄的完整路徑,或是包含了Unix shell匹配語法的通配符字符串。在通配符字符串中,"?"匹配任何單個的字符,"*"匹配任何字符序列。也可以使用"[]"來確定字符範圍。在"~" 字符之後也可以使用正則表達式。

   如果有多個(非正則表達式)<Directory>配置段符合包含某文檔的目錄(或其父目錄),那麼指令將以短目錄優先的規則進行應用,幷包含.htaccess文件中的指令。正則表達式將在所有普通配置段之後予以考慮。所有的正則表達式將根據它們出現在配置文件中的順序進行應用。

<Directory>指令不可被嵌套使用,也不能出現在<Limit>或<LimitExcept>配置段中。

9. <Files>

提供基於文件名的訪問控制,類似於<Directory>和<Location>指令。

filename參數應當是一個文件名或是一個包含通配符的字符串,匹配方法如上。在此配置段中定義的指令將作用於其基本名稱(不是完整的路徑)與指定的文件名相符的對象。<Files>段將根據它們在配置文件中出現的順序被處理:在<Directory>段和.htaccess文件被處理之後,但在<Location>段之前。<Files>能嵌入到<Directory>段中以限制它們作用的文件系統範圍,也可用於.htaccess文件當中,以允許用戶在文件層面上控制對它們自己文件的訪問。

10. <IfModule>

封裝根據指定的模塊是否啓用而決定是否生效的指令。

module-file是指編譯模塊時的文件名,比如mod_rewrite.c。

module-identifier是指模塊的標識符,比如mod_rewrite。

在<IfModule>配置段中的指令僅當測試結果爲真的時候才進行處理,否則所有其間的指令都將被忽略。

11、

<Directory />
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>

  • Options

Indexes: 當訪問的路徑下無默認主頁面文件存在,且沒有指定具體要訪問的資源時,會將此路徑下的所有資源以列表呈現給用戶;非常危險,不建議使用;

FollowSymLinks:如果某頁面文件是爲指向DocumentRoot之外路徑上的其它文件時,將直接顯示目標文件的內容;

None: none

All: 所有的都啓用;

  • AllowOverride

如果此指令被設置爲None,那麼.htaccess文件將被完全忽略。事實上,服務器根本不會讀取.htaccess文件。

當此指令設置爲All時,所有具有".htaccess"作用域的指令都允許出現在.htaccess文件中。從安全性考慮,根目錄的AllowOverride屬性一般都配置成不允許任何Override。

directive-type可以是下列各組指令之一:

AuthConfig  允許使用與認證授權相關的指令

FileInfo  允許使用控制文檔類型的指令、控制文檔元數據的指令、mod_rewrite中的指令、mod_actions中的Action指令

Indexes  允許使用控制目錄索引的指令

Limit  允許使用控制主機訪問的指令

Options[=Option,...]  允許使用控制指定目錄功能的指令(Options和XBitHack)。可以在等號後面附加一個逗號分隔的(無空格的)Options選項列表,用來控制允許Options指令

使用哪些選項。

  • 基於來源地址訪問控制

Order: 檢查次序

Order Allow Deny:只有明確Allow的來源地址,才允許訪問,其它的均爲Deny

Order Deny Allow: 

Allow from:允許訪問的來源地址

Deny from:拒絕訪問的來源地址

12、DirectoryIndex index.html index.php

當客戶端請求一個目錄時尋找的資源列表。Local-url(%已解碼的)是一個相對於被請求目錄的文檔的URL(通常是那個目錄中的一個文件)。可以指定多個URL,服務器將返回最先找到的那一個。

13、ErrorLog "logs/error_log"

指定當服務器遇到錯誤時記錄錯誤日誌的文件。如果file-path不是一個以斜槓(/)開頭的絕對路徑,那麼將被認爲是一個相對於ServerRoot的相對路徑

14、LogLevel

用於調整記錄在錯誤日誌中的信息的詳細程度。

可以選擇下列level,依照重要性降序排列:

emerg  緊急(系統無法使用)

alert  必須立即採取措施

crit  致命情況

error  錯誤情況

warn  警告情況

notice  一般重要情況

info   普通信息

debug  調試信息

當指定了某個級別時,所有級別高於它的信息也會被同時記錄。比如,指定 LogLevel info ,則所有notice和warn級別的信息也會被記錄。建議至少使用crit級別。

顯示的格式日下: 

[Mon Oct 10 15:54:29 2005] [error] [client 192.168.10.22] access to /download/ failed, reason: user admin not allowed access 

15、LogFormat

定義訪問日誌的記錄格式。

日誌的缺省格式有如下幾種: 

LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined 

LogFormat "%h %l %u %t "%r" %>s %b" common #common爲日誌格式名稱 

LogFormat "%{Referer}i -> %U" referer 

LogFormat "%{User-agent}i" agent 

CustomLog logs/access_log common 

格式中的各個參數如下: 

%h --客戶端的ip地址或主機名 

%l --The 這是由客戶端 identd 判斷的RFC 1413身份,輸出中的符號 "-" 表示此處信息無效。 

%u --由HTTP認證系統得到的訪問該網頁的客戶名。有認證時纔有效,輸出中的符號 "-" 表示此處信息無效。 

%t --服務器完成對請求的處理時的時間。 

"%r" --引號中是客戶發出的包含了許多有用信息的請求內容。 

%>s --這個是服務器返回給客戶端的狀態碼。 

%b --最後這項是返回給客戶端的不包括響應頭的字節數。 

"%{Referer}i" --此項指明瞭該請求是從被哪個網頁提交過來的。 

"%{User-Agent}i" --此項是客戶瀏覽器提供的瀏覽器識別信息。 

下面是一段訪問日誌的實例: 

192.168.10.22 - bearzhang [10/Oct/2005:16:53:06 +0800] "GET /download/ HTTP/1.1" 200 1228 

192.168.10.22 - - [10/Oct/2005:16:53:06 +0800] "GET /icons/blank.gif HTTP/1.1" 304 -

192.168.10.22 - - [10/Oct/2005:16:53:06 +0800] "GET /icons/back.gif HTTP/1.1" 304 -

16、CustomLog

設定日誌的文件名和格式。

17、ErrorDocument

定義錯誤顯示頁面,批示當遇到錯誤的時候服務器將給客戶端什麼樣的應答。

ErrorDocument 500 "The server made a boo boo."

ErrorDocument 404 /missing.html

ErrorDocument 404 "/cgi-bin/missing_handler.pl"

ErrorDocument 402 http://www.example.com/subscription_info.html  

18、Alias

路徑別名

Alias /alias/ "/path/to/somewhere/" ##前面加“/”後面也要加,否則都不加。

意味着訪問http://Server_IP/alias/時,其頁面文件來自於/path/to/somewhere這個位置。

19、#EnableMMAP off

    是否允許內存映射:如果httpd在傳送過程中需要讀取一個文件的內容,它是否可以使用內存映射。如果爲on表示如果操作系統支持的話,將使用內存映射。在一些多核處理器的系統上,這可能會降低性能,如果在掛載了NFS的DocumentRoot上,如果開啓此項功能,可能造成因爲分段而造成httpd崩潰。

20、#EnableSendfile off

    這個指令控制httpd是否可以使用操作系統內核的sendfile支持來將文件發送到客戶端。默認情況下,當處理一個請求並不需要訪問文件內部的數據時(比如發送一個靜態的文件內容),如果操作系統支持,Apache將使用sendfile將文件內容直接發送到客戶端而並不讀取文件。

21、LoadModule

LoadModule foo_module modules/mod_foo.so

    ## 如果是使用相對路徑,則爲相對於ServerRoot所定義的位置而言,如果取消裝載,直接在配置文件中把這一行取消

httpd -M   列出已經裝載的所有DSO以及非DSO模塊 

    Loaded Modules:

    core_module (static)

    mpm_prefork_module (static)

    http_module (static)

    so_module (static)

    auth_basic_module (shared)    

httpd -l   列出支持的非DSO模塊(比如已經編譯進入主程序的)

     Compiled in modules:

          core.c        # 核心模塊

          prefork.c     # 編譯時,有且只有一個模型

          http_core.c   # http核心模塊

          mod_so.c      # 實現模塊裝卸

22、CGI(不懂)

CGI腳本路徑別名 

    CGI(Common Gateway Interface): 允許網頁訪問在特定目錄下執行一些腳本,shell腳本依賴系統命令,有時需要UID和GID, 這也造成了安全隱患。

    PHP,python 等腳本語言也是用類似的協議,但是由於有自己庫,可以避免依賴系統庫。 

    控制CGI腳本路徑別名的模塊: mod_alias, mod_cgi 

    在/etc/httpd/conf/httpd.conf 配置 

## 配置文件中配置 

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

## 在/var/www/cgi-bin/ 下面創建測試腳本,如下,並給執行權限  

#!/bin/bash 

#                

cat << EOF

Content-Type: text/html

<pre>

The hostname is: `hostname`.

The time is: `date`.

</pire>

EOF

## 爲了測試方便,關閉虛擬機的iptables,用宿主機訪問192.168.233.128/cgi-bin/test.sh, 的到如下結果,說明測試成功。

wKiom1equfvQ23BGAAAm7ZXwOCk326.png

extra部分配置

httpd-default.conf

1、ServerSignature Off

取消apache的版本返回顯示簽名

2、ServerTokens

建議ServerTokens Full修改爲ServerTokens Prod

該參數設置http頭部返回的apache版本信息,可用的值和含義如下: 

Prod:僅軟件名稱,例如:apache 

Major:包括主版本號,例如:apache/2 

Minor:包括次版本號,例如:apache/2.0 

Min:僅apache的完整版本號,例如:apache/2.0.54 

OS:包括操作系統類型,例如:apache/2.0.54(Unix) 

Full:包括apache支持的模塊及模塊版本號,例如:Apache/2.0.54 (Unix) mod_ssl/2.0.54 OpenSSL/0.9.7g 

3、KeepAlive On

會話保持是否保持

4、Timeout 60

會話保持時間,建議修改爲 Timeout 100

5、MaxKeepAliveRequests

請求允許持久性連接時的最大數量,設置爲0,允許數量不限,根據實際情況調節。

6、HostnameLookups Off

當打開此項功能時,在記錄日誌的時候同時記錄主機名,這需要服務器來反向解析域名,增加了服務器的負載,通常不建議開啓。


httpd-mpm.conf

apache2主要的優勢就是對多處理器的支持更好,在編譯時同過使用--with-mpm選項來決定apache2的工作模式。如果知道當前的apache2使用什麼工作機制,可以通過httpd -l命令列出apache的所有模塊,就可以知道其工作方式: 

  • prefork:如果httpd -l列出prefork.c,則需要對下面的段進行配置: 

<IfModule prefork.c> 

StartServers 5 #啓動apache時啓動的httpd進程個數。 

MinSpareServers 5 #服務器保持的最小空閒進程數。 

MaxSpareServers 10 #服務器保持的最大空閒進程數。 

MaxClients 150 #最大併發連接數。 

MaxRequestsPerChild 1000 #每個子進程被請求服務多少次後被kill掉。0表示不限制,推薦設置爲1000。 

</IfModule> 

在 該工作模式下,服務器啓動後起動5個httpd進程(加父進程共6個,通過ps -ax|grep httpd命令可以看到)。當有用戶連接時,apache會使用一個空閒進程爲該連接服務,同時父進程會fork一個子進程。直到內存中的空閒進程達到 MaxSpareServers。該模式是爲了兼容一些舊版本的程序。我缺省編譯時的選項。 

  • worker:如果httpd -l列出worker.c,則需要對下面的段進行配置: 

<IfModule worker.c> 

StartServers 2 #啓動apache時啓動的httpd進程個數。 

MaxClients 150 #最大併發連接數。 

MinSpareThreads 25 #服務器保持的最小空閒線程數。 

MaxSpareThreads 75 #服務器保持的最大空閒線程數。 

ThreadsPerChild 25 #每個子進程的產生的線程數。 

MaxRequestsPerChild 0 #每個子進程被請求服務多少次後被kill掉。0表示不限制,推薦設置爲1000。 

</IfModule> 

該 模式是由線程來監聽客戶的連接。當有新客戶連接時,由其中的一個空閒線程接受連接。服務器在啓動時啓動兩個進程,每個進程產生的線程數是固定的 (ThreadsPerChild決定),因此啓動時有50個線程。當50個線程不夠用時,服務器自動fork一個進程,再產生25個線程。 

  • perchild:如果httpd -l列出perchild.c,則需要對下面的段進行配置: 

<IfModule perchild.c> 

NumServers 5 #服務器啓動時啓動的子進程數 

StartThreads 5 #每個子進程啓動時啓動的線程數 

MinSpareThreads 5 #內存中的最小空閒線程數 

MaxSpareThreads 10 #最大空閒線程數 

MaxThreadsPerChild 2000 #每個線程最多被請求多少次後退出。0不受限制。 

MaxRequestsPerChild 10000 #每個子進程服務多少次後被重新fork。0表示不受限制。 

</IfModule> 

該模式下,子進程的數量是固定的,線程數不受限制。當客戶端連接到服務器時,又空閒的線程提供服務。 如果空閒線程數不夠,子進程自動產生線程來爲新的連接服務。該模式用於多站點服務器。

httpd-userdir.conf(未用過)

如果期望讓每個用戶都可以創建個人站點:http://Server_IP/~Username/,可以啓用此部分配置

userdir disablied: 禁止

userdir public_html

public_html是用戶家目錄下的目錄名稱,所有位於此目錄中的文件均可通過前述的訪問路徑進行訪問用戶的家目錄得賦予運行httpd進程的用戶擁有(進入)執行權限;

httpd-languages.conf

字符集配置,,默認爲UTF-8(?),字符集和網頁不匹配,訪問時爲亂碼,可在httpd.conf中增加AddDefaultCharset UTF-8設置默認字符集。














發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章