Linux服務管理之httpd-2.2經常使用配置文件

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。

當咱們對某個目錄定義了安全區域後,當咱們打開頁面後能夠看到如下信息

wKiom1X66mfyVQk7AAJ69Fn4Vww287.jpg


若是咱們不輸入帳號密碼按取消的話這會,響應碼爲401,拒絕客戶端請求,並說明要求客戶提供帳號和密碼

wKioL1X67T2CM5ghAAIzRENQAn4649.jpg


只有當咱們輸入容許登陸的帳號密碼的時候才能查訪問到admin的文件

wKiom1X660uD--92AAFthGCK340200.jpg


    (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 給頁面傳遞每三秒刷新一次的需求。

wKiom1X99o7CpPVGAAewH38OsvQ832.jpg


十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爲不顯示
相關文章
相關標籤/搜索