由淺入深學習Apache httpd原理與配置

文章防盜鏈地址:http://jackcui.blog.51cto.com/


一、apache簡介

    Apache HTTPD又可以簡稱爲httpd或者Apache,它是Internet使用最廣泛的web服務器之一,使用Apache提供的web服務器是由守護進程httpd,通過http協議進行文本傳輸,默認使用80端口的明文傳輸方式,當然,後來,爲了保證數據的安全和可靠性,又添加了443的加密傳輸的方式,Apache提供的服務器又被稱爲:補丁服務器,原因很簡單,它是一款高度模塊化的軟件,想要給它添加相應的功能只需添加相應的模塊,讓其Apache主程序加載相應的模塊,不需要的模塊也可以不用加載,保證了Apache的簡潔,輕便,高效性,當出現大量訪問一個服務器是可以使用多種複用模式,保證了服務器能快速回應客戶端的請求,如MPM,端口複用技術。

二、一次完整的http請求

1. http請求和響應過程:

(1)建立連接:客戶端向服務器建立連接,發送報文,包含相應的請求資源的方法和客戶端能支持的協議,編碼等數據。

(2)服務器決定是否接受請求。

(3)如果服務器同意建立連接時便要處理請求,其中包括訪問資源,訪問資源時需要相應的映射機制,把客戶端的URL轉化爲本地目錄下相應的文件

(4)服務器訪問到相應的資源後構建響應報文

(5)發送響應報文,報文中包含相應的狀態碼,和數據報文

(6)服務器記錄日誌

(7)客戶端接收數據

附示例:

[root@177cnode1 ~]# telnet vhost2.jack.com 80
Trying 192.168.20.128...
Connected to vhost2.jack.com.
Escape character is '^]'.
GET /index.html http/1.1  ====>使用GET方法請求服務器端的主頁
host:192.168.20.128 ===>host字段不能缺少,但可以是空值,指定服務器的ip地址或域名也可以指定
端口號,請求報文以一個空行結尾,最後鍵入回車(兩次回車)一般瀏覽器發送請求時會包括能接受的
編碼方式,報文長度等
HTTP/1.1 200 OK   ===>迴應報文的狀態碼
Date: Tue, 04 Oct 2016 03:48:47 GMT   ===>迴應報文的其它字段
Server: Apache/2.4.6 (CentOS)
Last-Modified: Sun, 02 Oct 2016 08:41:47 GMT
ETag: "16-53dddcc3d4d35"
Accept-Ranges: bytes
Content-Length: 22
Content-Type: text/html; charset=UTF-8
 
this is vhost2's page    ===>網頁內容
[root@177cnode1 ~]#

2. http兩種連接方式:

(1)短連接:非保持連接

(2)長連接:保持連接。

數量限制:多少個資源

時間限制:最長可以保持長連接多長時間

附示例:

  在相應的目錄下面建立以.conf結尾的文件內容如下keepalive.conf文件

[root@177cnode1 conf.d]# pwd
/etc/httpd/conf.d
[root@177cnode1 conf.d]# cat keepalive.conf 
keepalive on
keepalivetimeout 180 
MaxKeepAliveRequests 1000

   上面配置中第一行啓用了keepalive 功能,第二行設置建立連接後多少秒後斷開連接,第三項設置了最大保持alive狀態的請求數量爲1000個

3.  多種服務器狀態碼:

  在服務器迴應客戶端時會迴應相應的狀態碼,不同的狀態碼具有不同的含義

1xx:信息類

2xx:成功類

3xx:重定向類

4xx:客戶端錯誤類

5xx:服務端錯誤類

4. 多種客戶端請求方法:

GET、HEAD、POST、PUT、DELETE、OPTION、TRACE …

附:IANA機構對socket端口分配:

1-1024:衆所周知端口,永久分配給固定的應用程序使用,屬於特權端口,只有root有權使用

1024-4195:註冊端口,要求略寬鬆,分配給某程序註冊使用

41952-65535:客戶端程序使用的隨機端口,動態端口,又叫私有端口或隨機端口

三、http的特性:

高度模塊化:core module +modules

1. 多路處理模塊MPM:multipath processing modules

MPM模塊在httpd-2.4中是動態共享模塊的,沒有編譯如主程序當中,httpd-2. 2中是靜態編譯入主程序當中的。在這些模型中,默認使用第一個prefork模型,第二個模型因爲出錯不以排查,因此使用較少,在第三個模型當中因爲是比較新的功能,只有在httpd-2.4之後的版本纔有的功能,所以使用較少,因爲在企業使用時穩定纔是王道,絕非功能越新越好


prefork:多進程模型,也是默認類型,採用預派生子進程方式,用單獨的子進程來處理不同的請求,進程之間彼此獨立。兩級架構,主進程一個子進程若干個。


幾個常用選項(指令後面的#代表相應數量的數字):

這些選項直接在主配置文件中修改(httpd-2.2,包含2.2之前),在httpd-2.4之後的版本中mpm的配置文件(/etc/httpd/conf.modules/00-mpm.conf)中編寫即可

ServerLimit # 服務器允許配置的進程數上限,在其它兩種模型中因爲是多級架構,所以和線程子進程的乘積等有關係

StartServers #  httpd服務在啓動時要啓動的子進程數量

MinspareServers # 在服務器啓動StartsServer指定的子進程書量後每隔一秒創建一定數量的進程(是指數型的增加,第一次1個,第二次兩個,第三次4個,一直增加到32個每秒後穩定增加),直到增加到MinSpareServer指定的數量

MaxSpareServers # 這個值是設置系統最大空閒進程數量,每當大於這個數量的值時,系統會kill掉一部分子進程,但是當這個值設置的小於MinSpareServer的值時,系統會自動將該值設置爲最小空閒進程數量加一

MaxConnectionsPerchild # 這個值代表每個子進程最大能處理多少個連接之後將被系統kill掉(因爲進程在使用過程當中可能有數據錯誤或無法以外的內存泄露等)如果設置爲0則代表永不kill,這個值從httpd-2.4之後纔開始叫這個名字

MaxRequestWorkers #最大處理併發請求數量的限制2.4之後的版本纔有的指令,意義等同於MaxClient

MaxClient # MaxClients設定的是 Apache可以併發處理的請求,是對Apache性能影響最大的參數。其缺省值150是遠遠不夠的,如果請求總數已達到這個值(可通過ps -ef|grep http|wc -l來確認),那麼後面的請求就要排隊,直到某個已處理請求完畢。這就是系統資源還剩下很多而HTTP訪問卻很慢的主要原因。雖然理論上這個值越大,可以處理的請求就越多,但Apache默認的限制不能大於256。ServerLimit指令無須重編譯Apache就可以加大MaxClients。這個指令是httpd-2.2的


worker:多線程模型,爲每個請求分配一個線程,三級架構,一個主進程,若干子進程,每個子進程管理若干個線程

ServerLimit

StartServers

MinSpareThreads

MaxSpareThreads

MaxRequestWorkers 應該設置爲0,因爲此時它已經不在相應用戶請求,0表示不加限制,不kill

        ThreadsPerChild

event:事件驅動模型,每個進程處理多個請求有多個進程

ThreadsPerChild

MaxRequestWorkers

        AsyncRequestWorkerFactor

3. httpd的功能特性:

虛擬主機

反向代理

負載均衡

CGIcommon Gateway Interface

4. httpd的版本:

httpd-1.3

httpd-2.0

httpd-2.2

httpd-2.4

centos6.8中系統版本爲httpd-2.2centos7.0之後的版本自帶的httpd版本爲httpd-2.4

四、程序環境:

1. 主程序:/usr/sbin/httpd

2. 通過正則表達式將註釋行和空行去掉,下面是httpd-2.4版本配置文件示例:

[root@7cnode2 ~]# grep -v -E -e"^[[:space:]]*#" -e "^[[:space:]]*$" httpd.conf

在此需要注意的是該配置文件中每一配置分爲兩部分,配置指令和值兩部分,配置指令不分區大小寫,值部分除了路徑名是要區分大小寫,其它部分也是不區分大小寫的!

ServerRoot "/etc/httpd"  配置httpd使用哪個位置中使用相對路徑查找配置文件,如指定錯誤日誌時寫到的就是一個相對路徑,相對與此處的目錄查找錯誤日誌文件存放目錄

Listen 80  監聽端口,可以同時監聽多個端口不過要注意設置selinux和防火牆,可以重複定義多次,監聽多個端口

Include conf.modules.d/*.conf 加載其它配置文件,類似於C語言的頭文件的加載,此處可以使用相對路徑也可以使用絕對路徑,相對路徑是相對於ServerRoot的路徑,可以使用glob通配符,此處的配置文件是用來加載DSOdynamic shared object)模塊

User apache

Group apache 程序運行時的用戶名和組名,在安裝Apache時已經創建了系統賬號和組賬號,程序啓動時是以root身份啓動,執行完root特權的所有操作後(例如啓動監聽80端口,低於1024的端口的監聽需要root纔有權力執行)會以非特權用戶執行程序

ServerAdmin root@localhost 管理員的郵箱地址,當httpd出問題時,聯繫該郵箱地址可以聯繫到管理員

ServerName www.jackcui.node2.com:80   ServerName給定了主機名和端口號,主要用於服務器辨識自己是什麼名字,如果此處沒有配置的話服務器會進行查詢/etc/hosts文件,最後查詢自己的DNS服務器直到將IP地址反解至主機名如果沒有DNS服務器,此處也可以直接寫自己的ip地址和端口號,強烈建議此處的配置不要省略,否者重啓httpd服務時會很慢,因爲會進行DNS反解析,這一個配置的作用主要是用來定義重定向時,服務器區分訪問的域名是自己還是別的主機

<Directory />  關於目錄的一些配置,有關目錄的訪問權限等都是在這裏定義,可以使用基於URL定義訪問權限,但要使用

<Location “”> …<Location>來定義

    AllowOverride none   AllowOverride參數就是指明Apache服務器是否去找.htacess文件作爲配置文件,如果設置爲none,那麼服務器將忽略.htacess文件,如果設置爲All,那麼所有在.htaccess文件裏有的指令都將被重寫。對於AllowOverride,還可以對它指定如下一些能被重寫的指令類型.

    Require all denied 對目錄的授權此處爲拒絕所有訪問

</Directory>

DocumentRoot"/var/www/html"  定義目錄的根位置類似於配置文件的根,不過此處是網頁存放的根,在定義Directory目錄時,那裏的目錄同樣可以是絕對路徑,也可以是相對於此處的路徑

<Directory"/var/www">

    AllowOverride None

    Require all granted

</Directory>

<Directory"/var/www/html">

    Options Indexes FollowSymLinks

    AllowOverride None

    Require all granted

</Directory>

<IfModule dir_module>  此處爲僅在加載了模塊dir_module 後才執行,DirectoryIndex配置指令後面的值可以跟多個,先後順序很關鍵,值的含義爲URL訪問時進入目錄是應該尋找哪一個文件,多個時按順序尋找,找不到第一個然後尋找第二個值

    DirectoryIndex index.html

</IfModule>

<Files ".ht*">  對所有安全相關的敏感文件設置爲禁止,如目錄下的.htaccess.htpasswd

    Require all denied

</Files>

ErrorLog"logs/error_log"  設置錯誤日誌的存放路徑,這裏是一個軟鏈接,指向/var/log/httpd/的符號鏈接

LogLevel warn  設置日誌級別,僅達到該級別才記錄日誌

<IfModulelog_config_module> 

下面定義了多種日誌的記錄格式,可以人爲的修改自己想要定義的格式,LogFormat後面的雙引號具體定義了日誌的格式,後面有一個名字,在使用該定義好的格式可以使用後面的別名代替,當然也可以在使用時直接用雙引號加相應的格式,訪問日誌也可以在虛擬主機中單獨定義

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

    LogFormat "%h %l %u %t\"%r\" %>s %b" common

    <IfModule logio_module>

      LogFormat "%h %l %u %t\"%r\" %>s %b \"%{Referer}i\"\"%{User-Agent}i\" %I %O" combinedio

    </IfModule>

下面定義問日誌,和使用相應的格式爲combined

    CustomLog "logs/access_log"combined

</IfModule>

<IfModule alias_module>

ScriptAliasAlias類似都是在此定義,兩者的區別是ScriptAlias是作爲服務器的運行文件,而不是發送到客戶端的文件

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

</IfModule>

<Directory"/var/www/cgi-bin">

    AllowOverride None

    Options None

    Require all granted

</Directory>

<IfModule mime_module>

mime多媒體英特網郵件擴展,這個模塊是用來指定內容元數據,選擇HTTP響應的映射模式中的URI或文件的元數據值的內容。如mime-type中的類型有語言,字符集,編碼方式

    TypesConfig /etc/mime.types

    AddType application/x-compress .Z

    AddType application/x-gzip .gz .tgz

    AddType text/html .shtml

    AddOutputFilter INCLUDES .shtml

</IfModule>

下面的設置向text/plaintext/html 資源的content-type報頭中添加charset部分。

AddDefaultCharset UTF-8

<IfModulemime_magic_module>

    MIMEMagicFile conf/magic

</IfModule>

EnableSendfile on

IncludeOptionalconf.d/*.conf



3. httpd-2.2版本與httpd-2.4的差別:

    絕大部分基本是相同的,只不過後者更加趨向於模塊化,將主配置文件分割,便於配置和管理下面將說一下具體的差別

(1)ServerTokens指令設置服務器HTTP響應頭字段的值。在2.2的版本中有,爲了保護服務器免收***的***,應把服務器迴應的消息顯示的最不詳細爲好。

(2)下面是ServerTokens的一些可能的賦值:
ServerTokens Prod 顯示“Server: Apache”
ServerTokens Major 顯示 “Server: Apache/2″
ServerTokens Minor 顯示“Server: Apache/2.2″
ServerTokens Min 顯示“Server: Apache/2.2.17″
ServerTokens OS 顯示 “Server: Apache/2.2.17 (Unix)”
ServerTokens Full 顯示 “Server: Apache/2.2.17 (Unix) PHP/5.3.5″

(3)PidFilerun/httpd.pid 保存httpd運行時的進程id,同樣是在2.2版本中有

(4)Keepalive定義,2.2版本放在了主配置文件當中,2.4版本主配置文件沒有定義,管理員可以自己定義一個單獨配置文件

(5)prefork的模塊定義,在2.2版本中可以直接編輯主配置文件定義prefork模塊的相關參數,2.4版本的在專門的模塊配置文件當中定義

 

4. 其它 配置文件:

  下面的三個文件分別是主配置文件和輔助配置文件,以及模塊配置文件,對主配置文件進行分割方便管理,在重啓服務或者重新加載配置文件時會一併加載

/etc/httpd/conf/httpd.conf 

/etc/httpd/conf.d/*.conf

/etc/httpd/conf.modules.d/*.conf

模塊的加載格式爲:

LoadModule  模塊名  模塊存放路徑

UnitFile:/usr/lib/systemd/system/httpd.service   //Unit文件是rhel7之後的版本系統服務腳本啓動文件

 模塊文件目錄:

/usr/lib64/httpd/modules/ 

5. 站點主服務器根目錄默認:/var/www/html

6. 日誌文件:/var/log/httpd/

error_log 錯誤日誌

access_log 訪問日誌

7. 判斷服務正常與否:

ss -tnlp | grep “:80\>”

systemctl status httpd.service

五、三種虛擬主機的配置

1. 基於IP地址的虛擬主機:

   在同一臺服務器上,有多個IP地址,每一個IP地址負責一臺虛擬主機的綁定,每個主機的主機名不一樣如www.vhost1.com  www.vhost2.com,使用較少,因爲IP地址較爲寶貴,而這種虛擬主機需要大量IP地址。

配置示例:

(1)  添加多個供虛擬主機使用的IP地址

[root@cnode6_8conf.d]# ip a |grep 192  //此時eth2有一個IP地址
    inet 192.168.66.142/24 scope global eth2

#使用ip命令添加三個臨時IP地址

[root@cnode6_8conf.d]# ip addr add 192.168.66.143/24 dev eth2
[root@cnode6_8conf.d]# ip addr add 192.168.66.144/24 dev eth2
[root@cnode6_8conf.d]# ip addr add 192.168.66.145/24 dev eth2
[root@cnode6_8conf.d]# ip a | grep 192  //通過查看多了3個IP地址
    inet 192.168.66.142/24 scope global eth2
    inet 192.168.66.143/24 scope globalsecondary eth2
    inet 192.168.66.144/24 scope globalsecondary eth2

(2)添加虛擬主機的配置文件

[root@cnode6_8conf.d]# pwd
/etc/httpd/conf.d
[root@cnode6_8conf.d]# vim virtual.conf
<VirtualHost 192.168.66.143:80> 
    ServerName www.vhost1.com
    DocumentRoot "/testdir/vhost1"
    <Directory"/testdir/vhost1">
             AllowOverride none
             Allow from all
             Order Allow,deny   
    </Directory>   
</VirtualHost>
 
<VirtualHost 192.168.66.144:80>
    ServerName www.vhost2.com
    DocumentRoot "/testdir/vhost2"
    <Directory"/testdir/vhost2">
             AllowOverride none
             Allow from all
             Order Allow,deny   
    </Directory>   
</VirtualHost>

 

(3)修改/etc/hosts文件(此處不是必須的,因爲這裏沒有DNS服務器解析域名,只好修改hosts文件以供測試!)

[root@cnode6_8conf.d]# grep "^192" /etc/hosts
168.66.143  www.vhost1.com
168.66.144  www.vhost2.com
168.66.145 www.vhost3.com

(4)添加相應的目錄和文件重啓服務測試,添加的目錄和文件都因該是配置文件定義的。這裏省略這些步驟,測試結果應該爲訪問相應的域名,會被解析爲相應的IP能訪問到響應的網頁

 

2. 基於域名的虛擬主機:

  在同一臺服務器上面,僅有一個IP地址,使用不同的主機名訪問不同的網頁內容,在虛擬主機塊定義上面需要使用NameVirtualHost聲明監聽的IP地址,使用較多。需要注意在httpd-2.4的版本中不需要使用NameVirtualHost關鍵字指定監聽IP地址和端口號,其餘部分沒有變化

(1)修改配置文件

root@cnode6_8conf.d]# pwd
/etc/httpd/conf.d
[root@cnode6_8conf.d]# vim virtual.conf
NameVirtualHost 192.168.66.142:80 //如果要監聽主機所有IP可以使用通配符 *
<VirtualHost192.168.66.142:80>
    ServerNamewww.vhost1.com
    DocumentRoot "/testdir/vhost1"
    <Directory"/testdir/vhost1">
             AllowOverride none
             Allow from all
             Order Allow,deny   
    </Directory>   
</VirtualHost>
 
<VirtualHost192.168.66.142:80>
    ServerNamewww.vhost2.com
    DocumentRoot "/testdir/vhost2"
    <Directory"/testdir/vhost2">
          AllowOverride none
          Allow from all
          Order Allow,deny   
    </Directory>   
</VirtualHost>


(2)修改/etc/hosts文件

[root@cnode6_8 conf.d]# grep 192 /etc/hosts
168.66.143 www.vhost1.com
168.66.143 www.vhost2.com

(3)測試

 測試時訪問不同的域名,雖然是被解析爲相同的IP地址,但是能訪問到不同的主頁

3. 基於不同端口的虛擬主機:

  在同一IP,同一主機名下,使用監聽不同端口,訪問時需要加訪問的端口。使用不多,一般用來做內網測試使用

(1)修改配置文件

[root@cnode6_8conf.d]# cat virtual.conf
Listen 8080   //添加監聽的端口
<VirtualHost 192.168.66.142:8080>
    ServerName www.vhost1.com
    DocumentRoot "/testdir/vhost1"
    <Directory"/testdir/vhost1">
          AllowOverride none
          Allow from all
          Order Allow,deny   
    </Directory>   
</VirtualHost>
 
<VirtualHost 192.168.66.142:80>
    ServerName www.vhost1.com
    DocumentRoot "/testdir/vhost2"
    <Directory"/testdir/vhost2">
             AllowOverride none
             Allow from all
             Order Allow,deny   
    </Directory>   
</VirtualHost>

(2)修改/etc/hosts文件

[root@cnode6_8 conf.d]# grep 192 /etc/hosts
168.66.142 www.vhost1.com

  測試要注意默認的端口可以不加,但是非80的端口訪問時要手動添加,在訪問相同的域名,不同的端口的地址時,同樣可以得到不同的網頁


六、目錄選項指令和站點其他頁面定義


1.目錄中常用的指令:

(1)   options:用於定義資源的展示方式;後跟以空白字符分割的“選項”列表

(2)   AllowOverRide:httpd允許在網頁文檔的各目錄下使用隱藏文件.htaccess來自個子的訪問控制;此指令定義哪些指令可以再.htaccess中定義

(3)   Require:定義訪問控制的用戶、組或者IP等的訪問

2.站點主頁面文件設置(主配置文件中):

DirectoryIndex  filename1 filename2 ...

在DirectoryIndex後面跟多個文件,在訪問時每一個目錄時默認的頁面文件名字,當第一個文件沒有找到時,去找第二個文件,文件順序很重要!

3.路徑別名定義(主配置文件的別名定義模塊中定義)

Alias  /URL/ "/PATH/TO/SOME_DIR/"

給一個Url定義一個路徑別名通過URL可以映射到本地文件系統的目錄

4.status頁面

用於顯示當前主機運行狀態,子進程或線程運行快照

<Location /status>

       SetHandler server-status

       Require all granted

</Location>

ExtendedStatus{On|Off} 擴展狀態設置,建議關閉,否則影響服務器性能,默認關閉的,沒有這一行設置也行,這一行設置是全局設置,不能在虛擬主機中設置。

七、用戶認證和組認證

   http協議的認證由http協議的實現,對自身進行認證。http的認證可以是明文形式或者是摘要算法形式。在認證時,服務器響應嗎爲401,拒絕客戶端請求,並需要客戶端填入賬號和密碼後進行認證。服務器做認證的賬號是虛擬賬號,不是服務器系統的賬號,可以存放在特定的文件系統中,或者數據庫中,連接數據庫需要相應的數據庫模塊爲httpd提供接口等支持。表單認證由服務器的應用程序進行認證

1.http協議的用戶認證

<VirtualHost 192.168.66.142:80>
ServerName www.vhost.com
DocumentRoot"/vhosts/www1"
    <Directory "/vhosts/www1">
       Options None
       AllowOverride None
       Require all granted
    </DIrectory>
    <Directory"/vhosts/www1/admin">
       OptionsNone
       AllowOverrideNone
       AuthTypebasic
       AuthName"Admin Area, Enter your name/password"
       AuthUserFile"/etc/httpd/conf/.htpasswd"
       Requirevalid-user
    </Directory>
</VirtualHost>


使用命令生成文件:

認證文件:.htpasswd

htpasswd[OPTIONS]  /PATH/TO/HTPASSWD_FILEUSERNAME [PASSWORD]

 -c:創建文件,沒有密碼文件時需要加-c,再次添加時不需要

 -m:使用md5

 -s:Force SHA encryption of the password(insecure)

如需創建jackcui的認證密碼:

[root@cnode6_8 conf.d]# htpasswd -c -s/var/www/html/.htpasswd jackcui
New password:   //輸入該用於的密碼
Re-type new password:   //再次確認密碼
Adding password for user jackcui  //提示添加密碼成功

2.http協議的組認證

<Directory"/vhosts/www1/admin">
    Options None
    AllowOverride None
    AuthType basic
    AuthName "Admin Area, Enter yourname/password"
    AuthUserFile"/etc/httpd/conf/.htpasswd"
    AuthGroupFIle"/etc/httpd/conf/.htgroup"
    Require group 
</Directory>


組賬號文件格式:每行一個組定義:

group_name: user1 user2 ...


八、httpd的訪問日誌和錯誤日誌:

   httpd的日誌可以定義在主配置文件當中,也可以單獨定義在每個虛擬主機中,作用域爲定義的虛擬主機的塊定義範圍之內。主配置文件指向的logs目錄是/var/logs/httpd的軟鏈接, 可以自己指定單獨的磁盤,提高系統性能。配置要注意文件目錄的訪問權限

[root@7cnode2 conf.d]# cat virtualhost.conf 
<VirtualHost 192.168.20.129:80>
    ServerName vhost.jack.com
    DocumentRoot /vhost/vhost1
<Directory "/vhost/vhost1">
    options none
    AllowOverride none
    require all granted
</Directory>
    ErrorLog "/testdir/vhostlog/error.log"
    CustomLog "/testdir/vhostlog/custom.log"  common
</VirtualHost>

重啓服務在相應的目錄生成文件,訪問之後便可以記錄在文件當中

[root@7cnode2 conf.d]# systemctl restart httpd
[root@7cnode2 conf.d]# curl vhost.jack.com
this is vhost1's test page
[root@7cnode2 conf.d]# tail /testdir/vhostlog/custom.log 
192.168.20.129 - - [06/Oct/2016:17:36:12 +0800] "GET / HTTP/1.1" 200 27

其中日誌格式也可以自己定義

<VirtualHost 192.168.20.129:80>
        ServerName vhost.jack.com
        DocumentRoot /vhost/vhost1
<Directory "/vhost/vhost1">
        options none
        AllowOverride none
        require host 127.0.0.1   //改爲僅本機允許訪問,可以測試是否能產生錯誤日誌
</Directory>
        LogFormat "%h %l \"%{User-Agent}i\"" myformat  //自己定義的錯誤日誌的格式
        ErrorLog "/testdir/vhostlog/error.log"
        CustomLog "/testdir/vhostlog/custom.log"  myformat  //定義路徑和使用的格式
</VirtualHost>
[root@7cnode2 conf.d]# systemctl restart httpd
[root@7cnode2 conf.d]# cat /testdir/vhostlog/error.log
[Thu Oct 06 17:51:23.474098 2016] [authz_host:error] [pid 37261] [client 192.168.20.1:65376] AH01753: access check of '127.0.0.1' to /noindex/css/fonts/Light/OpenSans-Light.ttf failed, reason: unable to get the remote host name, referer: http://192.168.20.129/noindex/css/open-sans.css
[Thu Oct 06 17:51:23.474185 2016] [authz_core:error] [pid 37261] [client 192.168.20.1:65376] AH01630: client denied by server configuration: /vhost/vhost1/noindex, referer: http://192.168.20.129/noindex/css/open-sans.css
[root@7cnode2 conf.d]# cat /testdir/vhostlog/custom.log 
192.168.20.129 - - [06/Oct/2016:17:36:12 +0800] "GET / HTTP/1.1" 200 27
192.168.20.129 - "curl/7.29.0"
192.168.20.1 - "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0"
192.168.20.1 - "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0"
[root@7cnode2 conf.d]#

附:訪問日誌的格式:

LogFormat:用來定義日誌格式

CustomLog:定義訪問日誌的位置與日誌格式。


常見的格式:

%h 遠程主機的主機名,默認記錄的是IP,HostnameLookups是默認off的,如果改爲on則服務器要將客戶端的ip反解爲域名,然後在正解看是否是對應的IP

%l 用與支持服務器支持驗證時,記錄遠程登錄的名字

%u http協議在建立http請求時協議認證質詢實現

%t 收到請求的時間,格式爲[18/Sep/2011:19:18:28 -0400]

%r 首次請求

%b 包括http報頭在內的請求大小

%s status,對於內部重定向的請求這是原始的請求狀態,使用%>s 記錄最終的狀態

%{VARNAME}i 記錄以VARNAME變量爲首部的字符串的值。如%{Referer}i

更多格式的值參閱:

http://httpd.apache.org/docs/2.4/mod/mod_log_config.html#formats


文章防盜鏈地址:http://jackcui.blog.51cto.com/


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