httpd主要有如下特性:php
高度模塊化:core + moduleshtml
DSO: Dynamic Shared Object,動態共享庫python
MPM:Multipath Processing Modules,多道處理模塊正則表達式
同時支持如下功能:虛擬主機;CGI:Common Gateway Interface,通用網關接口;反向代理;負載均衡;路徑別名;豐富的用戶認證機制;basic;digest;支持第三方模塊。shell
配置文件參數格式特色: apache
配置指令不區分字符大小寫瀏覽器
值可能區分大小寫安全
有些指令能夠重複出現屢次 bash
配置文件格式包含三部分:服務器
全局配置
主機配置:適用於主機只提供一個站點
虛擬主機:用於提供多個站點
經常使用配置:
一、ServerRoot
用於指定Apache的運行目錄,服務啓動以後自動將目錄改變爲當前目錄,在後面使用到的全部相對路徑都是想對這個目錄下。
二、Listen 80
(1) IP省略時表示監聽本機上全部可用的IP地址;
(2) Listen指令能夠出現屢次,用於指明多個不一樣的監聽端口或套接字
三、LoadModule:加載特定的DSO模塊
Apache默認將已編譯的DSO模塊存放於目錄結構小節中所示的動態加載模塊目錄中。
語法:LoadModule module filename
如:LoadModule rewrite_module modules/mod_rewrite.so
若是filename使用相對路徑,則路徑是相對於ServerRoot所指示的相對路徑。
四、User,Group
設置實際提供服務的子進程的用戶。爲了使用這個指令,服務器必須以root身份啓動和初始化。若是你以非root身份啓動服務器,子進程將不可以切換至非特權用戶,並繼續以啓動服務器的原始用戶身份運行。若是確實以root用戶啓動了服務器,那麼父進程將仍然以root身份運行。用於運行子進程的用戶必須是一個沒有特權的用戶,這樣才能保證子進程無權訪問那些不想爲外界所知的文件,一樣的,該用戶亦需沒有執行那些不該當被外界執行的程序的權限
。強烈建議專門爲Apache子進程創建一個單獨的用戶和組。一些管理員使用nobody用戶,可是這並不能老是符合要求,由於可能有其餘程序也在使用這個用戶。
五、ServerAdmin
設置在全部返回給客戶端的錯誤信息中包含的管理員郵件地址。通常較少設置。
六、ServerName
設置服務器用於辨識本身的主機名和端口號。
七、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>配置段中的指令僅當測試結果爲真的時候才進行處理,不然全部其間的指令都將被忽略。
十一、
<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:拒絕訪問的來源地址
十二、DirectoryIndex index.html index.php
當客戶端請求一個目錄時尋找的資源列表。Local-url(%已解碼的)是一個相對於被請求目錄的文檔的URL(一般是那個目錄中的一個文件)。能夠指定多個URL,服務器將返回最早找到的那一個。
1三、ErrorLog "logs/error_log"
指定當服務器遇到錯誤時記錄錯誤日誌的文件。若是file-path不是一個以斜槓(/)開頭的絕對路徑,那麼將被認爲是一個相對於ServerRoot的相對路徑
1四、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
1五、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 -
1六、CustomLog
設定日誌的文件名和格式。
1七、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
1八、Alias
路徑別名
Alias /alias/ "/path/to/somewhere/" ##前面加「/」後面也要加,不然都不加。
意味着訪問http://Server_IP/alias/時,其頁面文件來自於/path/to/somewhere這個位置。
1九、#EnableMMAP off
是否容許內存映射:若是httpd在傳送過程當中須要讀取一個文件的內容,它是否可使用內存映射。若是爲on表示若是操做系統支持的話,將使用內存映射。在一些多核處理器的系統上,這可能會下降性能,若是在掛載了NFS的DocumentRoot上,若是開啓此項功能,可能形成由於分段而形成httpd崩潰。
20、#EnableSendfile off
這個指令控制httpd是否可使用操做系統內核的sendfile支持來將文件發送到客戶端。默認狀況下,當處理一個請求並不須要訪問文件內部的數據時(好比發送一個靜態的文件內容),若是操做系統支持,Apache將使用sendfile將文件內容直接發送到客戶端而並不讀取文件。
2一、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 # 實現模塊裝卸
2二、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, 的到以下結果,說明測試成功。
extra部分配置
httpd-default.conf
一、ServerSignature Off
取消apache的版本返回顯示簽名
二、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
三、KeepAlive On
會話保持是否保持
四、Timeout 60
會話保持時間,建議修改成 Timeout 100
五、MaxKeepAliveRequests
請求容許持久性鏈接時的最大數量,設置爲0,容許數量不限,根據實際狀況調節。
六、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設置默認字符集。