1、何爲httpd
php
httpd是Apache超文本傳輸協議(HTTP)服務器的主程序。被設計爲一個獨立運行的後臺進程,它會創建一個處理請求的子進程或線程的池。html
Apache是世界使用排名第一的Web服務器軟件。它能夠運行在幾乎全部普遍使用的計算機平臺上,因爲其跨平臺和安全性被普遍使用,是最流行的Web服務器端軟件之一。它快速、可靠而且可經過簡單的API擴充,將Perl/Python等解釋器編譯到服務器中。web
2、httpd-2.2的基本功能特徵數據庫
①、高度模塊化設計,而且支持模塊的動態裝載(DSO機制),因此httpd基本上能夠理解爲cord(核心)+各類模塊組成。apache
②、支持插入式並行處理模塊,稱爲多路處理模塊(MPM)。在編譯apache時必須選擇也只能選擇一個MPM,對類UNIX系統,有幾個不一樣的MPM可供選擇,它們會影響到apache的速度和可伸縮性。vim
Prefork MPM :多進程模型,每一個進程響應一個請求。當httpd服務啓動時,啓動一個主進程,主進程不負責響應客戶請求,此主進程負責生成N個子進程。每個子進程也稱爲工做進程,每一個子進程處理一個用戶請求。即使沒有用戶請求,也會預先生成多個空閒進程,隨時等待請求到達。瀏覽器
這個多路處理模塊(MPM)實現了一個非線程型的、預派生的web服務器,它的工做方式相似於Apache 1.3。它適合於沒有線程安全庫,須要避免線程兼容性問題的系統。它是要求將每一個請求相互獨立的狀況下最好的MPM,這樣若一個請求出現問題就不會影響到其餘請求。安全
Worker MPM :多線程模型,每一個線程響應一個請求。一個主進程:生成多個子進程,每一個子進程負責生個多個線程,每一個線程響應一個請求。因爲Linux線程並不比進程輕量級多少,並且內部調度線程跟進程也是同樣的,因此,Worker MPM比起Prefork MPM性能並無多大的提高。bash
此多路處理模塊(MPM)使網絡服務器支持混合的多線程多進程。因爲使用線程來處理請求,因此能夠處理海量請求,而系統資源的開銷小於基於進程的MPM。可是,它也使用了多進程,每一個進程又有多個線程,以得到基於進程的MPM的穩定性。服務器
每一個進程能夠擁有的線程數每一個子進程能夠創建ThreadsPerChild數量的服務線程和一個監聽線程,該監聽線程監聽接入請求並將其傳遞給服務線程處理和應答。
不論是Worker模式或是Prefork 模式,Apache老是試圖保持一些備用的(spare)或者是空閒的子進程(空閒的服務線程池)用於迎接即將到來的請求。這樣客戶端就不須要在獲得服務前等候子進程的產生。
Event MPM:基於事件驅動:event-driven。複用的多進程I/O結構:一個主進程,啓動多個(m)進程,每一個進程響應n個請求。
Prefork MPM和Worker MPM在很是繁忙的服務器應用下都有些不足。儘管HTTP的Keepalive方式能減小TCP鏈接數量和網絡負載,可是 Keepalive須要和服務進程或者線程綁定,這就致使一個繁忙的服務器會耗光全部的線程。 Event MPM是解決這個問題的一種新模型,它把服務進程從鏈接中分離出來。在服務器處理速度很快,同時具備很是高的點擊率時,可用的線程數量就是關鍵的資源限 制,此時Event MPM方式是最有效的。一個以Worker MPM方式工做的繁忙服務器可以承受每秒好幾萬次的訪問量(例如在大型新聞服務站點的高峯時),而Event MPM能夠用來處理更高負載。值得注意的是,Event MPM不能在安全HTTP(HTTPS)訪問下工做。
注意事項:httpd-2.2:Event MPM爲測試使用。httpd-2.4:Event MPM可生產使用。
3、httpd-2.2的配置文件
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
服務腳本:
/etc/rc.d/init.d/httpd
配置文件:/etc/sysconfig/httpd(修改MPM)
主程序文件:
/usr/sbin/httpd(Prefork MPM)
/usr/sbin/httpd.event(Event MPM)
/usr/sbin/httpd.worker(Worker MPM)
日誌文件目錄:
/var/log/httpd
access_log: 訪問日誌
error_log:錯誤日誌
站點文檔目錄(默認,可自行修改配置文件):
/var/www/html
模塊文件路徑:
/usr/lib64/httpd/modules
配置文件的組成:
~]# grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment(全局環境)
### Section 2: 'Main' server configuration('主'服務器配置)
### Section 3: Virtual Hosts(虛擬主機)
4、httpd-2.2的經常使用配置
httpd的配置文件爲:/etc/httpd/conf/httpd.conf
①、修改監聽的IP和Port
#Listen 12.34.56.78:80 Listen 80 #監聽的IP爲可選,若是不填寫的爲本機全部IP監聽在此端口上。能夠添加多條Listen。端口默認爲80,不建議修改, #由於修改後須要添加端口才能訪問。通常內部的某個功能網站可使用其餘端口來供內部使用。修改完此項須要重啓httpd服務
②、持久鏈接或非持久鏈接的配置(持久鏈接:鏈接創建,每一個資源獲取完成後不會斷開鏈接,而是繼續等待其它的請求完成;通常配置爲最大數量限制的時候斷開或最大空閒時間斷開。持久鏈接的反作用,對併發訪問量較大的服務器,持久鏈接功能會使用有些請求得不到響應;折衷的方法使用較短的持久鏈接時間。httpd-2.4 支持毫秒級持久時間)
KeepAlive { On | Off } #設置是否容許持久鏈接,On爲容許,Off爲不容許 MaxKeepAliveRequests 100 #設置持久鏈接容許請求的最大資源數量。設置爲0,表示容許無限量。 KeepAliveTimeout 15 #持久連接超時時間,這裏單位爲秒。
這裏咱們能夠是用一下方法來測試:
telnet IP/HOST PORT(telnet 192.168.0.105 80)回車後輸入一下命令:
GET /URL HTTP/1.1(使用GET方法請求/URL的資源,使用HTTP1.1協議)
Host: HOSTNAME or IP(請求/URL資源的主機或IP)
[root@localhost ~]# telnet 192.168.0.105 80 Trying 192.168.0.105... Connected to 192.168.0.105. Escape character is '^]'. GET / HTTP/1.1 Host: 192.168.0.105 HTTP/1.1 403 Forbidden Date: Tue, 15 Sep 2015 03:06:47 GMT Server: Apache/2.2.15 (CentOS) Accept-Ranges: bytes Content-Length: 4954 Content-Type: text/html; charset=UTF-8 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <head> <title>Apache HTTP Server Test Page powered by CentOS</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> .......... </div> </div> </body> </html> Connection closed by foreign host. #這裏我開啓了持久連接,而後KeepAliveTimeout 15,能夠看到,當我請求完一個頁面後15s不作請求會給服務斷開
③、Multipath Process Module:多路處理模塊
httpd-2.2不支持同時編譯多個模塊,因此只能編譯時選定一個;rpm安裝的包提供三個二進制程序文件,分別用於實現對不一樣MPM機制的支持。確認當前使用的MPM的方法:
[root@localhost ~]# ps aux | grep httpd root 8558 5.2 0.3 184324 3868 ? Ss 10:56 0:00 /usr/sbin/httpd apache 8561 0.0 0.2 184324 2456 ? S 10:56 0:00 /usr/sbin/httpd .......... apache 8562 0.0 0.2 184324 2456 ? S 10:56 0:00 /usr/sbin/httpd #默認爲/usr/sbin/httpd, 使用的是Prefork MPM
[root@localhost ~]# httpd -l Compiled in modules: core.c prefork.c http_core.c mod_so.c #查看靜態編譯的模塊
root@localhost ~]# httpd -M Loaded Modules: core_module (static) .......... dnssd_module (shared) Syntax OK #查看靜態編譯及動態裝載的模塊
當咱們須要切換到不一樣MPM模式運行時,能夠修改/etc/sysconfig/httpd更換使用的httpd程序。
HTTPD=/usr/sbin/httpd.worker #在代碼中找到HTTPD此項目。而後更換爲對應的MPM模式便可,修改完須要重啓服務。
下面介紹httpd-2.2中參見的兩種MPM配置介紹
Prefork MPM
<IfModule prefork.c> StartServers 8 #服務啓動後默認開啓的進程數 MinSpareServers 5 #最小數量的服務器進程,保存備用 MaxSpareServers 20 #最大數量的服務器進程,保存備用 ServerLimit 256 #最大活動進程數,通常此項會大於最大併發數 MaxClients 256 #最大併發數,最大數量的工做線程 MaxRequestsPerChild 4000 #每一個子進程在生命週期內所可以服務的最大請求個數 </IfModule>
Worker MPM
<IfModule worker.c> StartServers 4 #服務啓動後默認開啓的進程數 MaxClients 300 #最大併發數,最大數量的工做線程 MinSpareThreads 25 #最小數量空閒線程,保存備用 MaxSpareThreads 75 #最大數量空閒線程,保存備用 ThreadsPerChild 25 #每一個進程可生產的線程數 MaxRequestsPerChild 0 #每一個子進程在生命週期內所可以服務的最大請求個數,0表明不限制 </IfModule> #這裏有一個奇怪的特性,就是當咱們重啓完服務後當即查看能夠看到服務啓動了4個進程數沒有錯。爲咱們配置的默認開啓進 #程數,可是,若是過了幾秒再重啓查看服務進程時,會發現只剩下3個進程數,這是由於默認ThreadsPerChild(每一個服務 #器進程生成的線程數量)爲25,而MaxSpareThreads(最大數量的工做線程)爲75,因此就只剩下3個進程。
④、配置指令實現模塊加載(DSO)
LoadModule <mod_name> <mod_path>
LoadModule version_module modules/mod_version.so #LoadModule asis_module modules/mod_asis.so #須要開啓某個模塊只須要把註釋的#號去掉而後從新加載配置文件便可。這裏咱們能夠看到,模塊路徑使用的是相對路徑, #相對於ServerRoot(/etc/httpd)指向的路徑而言。
⑤、定義'Main' server的文檔頁面路徑
DocumentRoot "/var/www/html"
文檔路徑映射:DocumentRoot指向的路徑爲URL路徑的起始位置
例如:DocumentRoot "/var/www/html"
/var/www/html/test/index.html --> http://HOST:PORT/test/index.html
⑥、站點訪問控制,可基於兩種類型的路徑指明對哪些資源進行訪問控制
文件系統路徑:
<Directory ""> </Direcotry>
<File ""> </File>
<FileMatch ""> </FileMatch>
URL路徑:
<Location ""> </Location>
...
訪問控制機制:基於來源地址,基於帳號(如下作詳細說明)
⑦、Directory中「基於來源地址」實現訪問控制
(1) Options
全部可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews:
Indexes: 索引;
FollowSymlinks:容許跟蹤符號連接文件;
AllowOverride:在 AllowOverride 設置爲 None 時, .htaccess 文件將被徹底忽略。當此指令設置爲 All 時,全部具備 「.htaccess」 做用域的指令都容許出如今 .htaccess 文件中。
<Directory /> Options FollowSymLinks AllowOverride None </Directory> #這是比較經常使用的三個Options
(2) 基於來源地址的訪問控制機制
Order:檢查次序
Order allow,deny(設置白名單)
Order deny,allow(設置黑名單)
這裏的檢查機制是這樣的,以Order allow,deny說明。先把定義的全部Allow整合爲一個,而後把全部定義的Deny整合爲一個。而後先檢查Order次序的allow有沒有匹配的,若是僅有allow匹配則直接經過,若是allow沒有,deny有則直接deny,若是allow,deny都有則以Order默認的deny掉,若是兩個都沒有匹配則以默認的deny爲準。
<Directory "/var/www/icons"> Order allow,deny Allow from all </Directory> #Allow from all:全部人能夠訪問 #Deny from 192.168.0.123:禁用一個IP訪問 #Allow from 192.168.1.0/24:容許一個網段訪問
Order Allow,Deny Allow from 192.168.1.0/24 (Deny from all) #只容許192.168.1.0/24這個網段訪問
Order Deny,Allow Deny from 192.168.1.123 #不容許192.168.1.123這個IP訪問。其它都容許
⑧、定義默認主頁面
DirectoryIndex index.html index.php
⑨、日誌設定
錯誤日誌:
ErrorLog logs/error_log
LogLevel warn
debug, info, notice, warn, error, crit, alert, emerg
訪問日誌:
CustomLog logs/access_log combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
%h:客戶端IP地址;
%l: Remote logname (from identd, if supplied). -表示爲空;
%u: Remote user, (from auth; may be bogus if return status (%s) is 401);
%t:Time the request was received (standard english format),服務器收到請求的時間;
%r:First line of request,請求報文的道行信息(method url version);
%>s: 響應狀態碼;
%b: 響應報文的大小,單位是字節,不包括響應報文首部;
%{Referer}i:請求報文當中"referer"首部的值;當前資源的訪問入口,即從哪一個頁面中的超連接跳轉而來;
%{User-Agent}i:請求報文當中"User-Agent"首部的值;即發出請求用到的應用程序;
詳細參數官方文檔:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
金步國翻譯文檔 :http://www.jinbuguo.com/apache/menu22/logs.html
⑩、路徑別名
Alias /URL/ "/PATH/TO/SOMEDIR/"
Alias /bbs/ "/forum/htdocs"
http://www.wlw.com/bbs/index.html --> /forum/htdocs/
Alias /wlw/icons/ '/var/www/icons/'
11、設定默認字符集
AddDefaultCharset UTF-8
12、基於用戶的訪問控制
認證質詢:WWW-Authenticate,響應碼爲401,拒絕客戶端請求,並說明要求客戶提供帳號和密碼;
認證:Authorization,客戶端用戶填入帳號和密碼後再次發送請求報文;認證經過,則服務器發送響應的資源;
認證類型:basic:明文。digest:消息摘要。
安全域:須要用戶認證後方能訪問的路徑;應該經過名稱對其進行標識,並用於告知用戶認證的緣由;
用戶的帳號和密碼存儲於何處?
虛擬帳號:僅用於訪問某服務時用到的認證標識;
存儲:文本文件,SQL數據庫,ldap,nis
basic認證:
(1)提供帳號和密碼存儲(文本文件)
使用htpasswd命令進行管理
htpasswd [options] passwordfile username
-c: 自動建立passwordfile,所以,僅應該在添加第一個用戶時使用;
-m: md5加密用戶密碼;
-s: sha1加密用戶密碼;
-D: 刪除指定用戶
[root@localhost admin]# htpasswd -c -m /var/www/html/.htpasswd wlw New password: Re-type new password: Adding password for user wlw [root@localhost admin]# htpasswd -m /var/www/html/.htpasswd wlw1 New password: Re-type new password: Adding password for user wlw1 #這裏咱們添加了兩個用戶供後面作測試使用,第一次由於文件不存在使用-c選項生成,後面添加用戶只須要指定-m,用md5加密便可
(2) 定義安全域
<Directory "/var/www/html/admin"> Options None AllowOverride None AuthType Basic AuthName "Admin private" AuthUserFile "/var/www/html/.htpasswd" Require user wlw </Directory> #這裏咱們AuthType認證方式爲Basic,AuthName認證名爲Admin private,AuthUserFile認證的用戶名密碼文本爲, #Require user指定容許生效的用戶,若是須要文件中的全部用戶都生效,能夠是用Require valid-user。
當咱們對某個目錄定義了安全區域後,當咱們打開頁面後能夠看到如下信息
若是咱們不輸入帳號密碼按取消的話這會,響應碼爲401,拒絕客戶端請求,並說明要求客戶提供帳號和密碼
只有當咱們輸入容許登陸的帳號密碼的時候才能查訪問到admin的文件
(3) 實現基於組進行認證
<Directory "/var/www/html/admin"> Options None AllowOverride None AuthType Basic AuthName "Admin private" AuthUserFile "/var/www/html/.htpasswd" AuthGroupFile "/etc/httpd/conf.d/.htgroup" equire group wlwadmin </Directory> #這裏須要提供:用戶帳號文件和組文件;帳號文件:使用htpasswd命令生成。組文件:使用touch生成一個文件, #而後在文件中每一行定義一個組:GRP_NAME:user1 user2 user3 ...
十3、虛擬主機
有三種實現方案:
基於ip:爲每一個虛擬主機準備至少一個ip地址;
基於port:爲每一個虛擬主機準備至少一個專用port;實踐中不多使用;
基於hostname:爲每一個虛擬主機準備至少一個專用hostname(互聯網上最爲經常使用的實現虛擬主機方法)
可混合使用上述三種方式中任意方式;
注意:通常虛擬主機不要與中心主機混用,因此,要使用虛擬主機,先禁用中心主機,禁用中心主機:註釋DocumentRoot。
每一個虛擬主機都有專用配置:
<VirtualHost "IP:PORT"> SeverName:虛擬主機的別名 DocumentRoot "":虛擬主機根目錄 ErrorLog:錯誤日誌 CustomLog:訪問日誌 <Directory "">:虛擬主機站點訪問控制 Options FollowSymLinks AllowOverride None </Directory> </VirtualHost>
示例1:基於ip
<VirtualHost 192.168.0.105:80> ServerName web1.wlw.com DocumentRoot "/vhosts/web1/htdocs" </VirtualHost> <VirtualHost 192.168.0.105:80> ServerName web2.wlw.com DocumentRoot "/vhosts/web2/htdocs" </VirtualHost>
示例2:基於port
<VirtualHost 192.168.0.105:80> ServerName web2.wlw.com DocumentRoot "/vhosts/web2/htdocs" </VirtualHost> <VirtualHost 192.168.0.105:8080> ServerName web3.wlw.com DocumentRoot "/vhosts/web3/htdocs" </VirtualHost>
示例3:基於hostname
<VirtualHost 192.168.0.105:80> ServerName web1.wlw.com DocumentRoot "/vhosts/web1/htdocs" </VirtualHost> <VirtualHost 192.168.0.105:80> ServerName web3.wlw.com DocumentRoot "/vhosts/web3/htdocs" </VirtualHost>
十4、內置的status頁面
<Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from 192.168.0.0/24 </Location> #此status頁面能看到httpd的各信息,建議只開放內網,若是須要外網鏈接建議基於帳號實現訪問控制,添加完此配置後從新 #加載配置文件。這裏咱們可使用http: //192.168.0.109/server-status?refresh=3 給頁面傳遞每三秒刷新一次的需求。
十5、MIME類型文件和指定缺省MIME類型
TypesConfig /etc/mime.types #TypeConfig用於設置保存有不一樣的MIME類型數據的文件名 [root@wlw3 wlw]vim /etc/mime.types text/plain asc txt text pm el c h cc hh cxx hxx f90 ........ application/octet-stream bin lha lzh exe class so dll img iso DefaultType text/plain #若是Web服務器不能決定一個文檔的缺省類型,這一般表示文檔使用了非標準的後綴,那麼服務器就使用 DefaultType定義的MIME類型將文檔發送給客戶瀏覽器。這裏的設置爲text/plain,若是服務器不能判斷出文檔的MIME,那麼大部分狀況下這個文檔爲一個二進制文檔,但使用 text/plain格式發送回去,瀏覽器將在內部打開它而不會提示保存。所以建議將這個設置更改成 application/octet-stream,這樣瀏覽器將提示用戶進行保存。
十6、爲特定後綴的文件指定MIME類型
AddType application/x-httpd-php3 .phtml #AddType參數能夠爲特定後綴的文件指定MIME類型,這裏的設置將覆蓋mime.types中的設置
十7、錯誤頁是否輸出服務器操做系統名稱
ServerTokens OS #在出現錯誤頁的時候是否顯示服務器操做系統的名稱,ServerTokens Prod爲不顯示