httpd基礎部分,附上httpd2.2部分配置語法

一、實驗環境說明以及參考引用

linux髮型版本:CentOS 6.10 x86_64
httpd版本:yum的base倉庫的httpd2.2.15
Selinux狀態:關閉
iptables狀態:關閉
說明:重點以CentOS 6.x上演示httpd2.2爲主,會有一小部分對上次在CentOS 7.x上編譯安裝
的httpd2.2進行基本說明。

參考引用:
https://httpd.apache.org/docs/2.4/programs/httpd.html
https://en.wikipedia.org/wiki/Apache_HTTP_Server
http://blog.51cto.com/xslwahaha/1548983
https://www.linuxidc.com/Linux/2015-02/114007.htm
http://blog.sina.com.cn/s/blog_56115979010160h3.html
https://www.cnblogs.com/zhuifeng/p/4072248.html

二、httpd概述

httpd is Apache HyperText Transfer Protocol(HTTP) server program.It is designed to be run as a standalone daemon process.When used like this it will create a pool of child processes or threads to handle requests.

httpd是ASF(Apache Software Foundation,Apache軟件基金會)下的產品之一,也是比較有名的產品。httpd本身是超文本傳輸協議(HTTP)的服務端程序。httpd可以作爲獨立的守護進程運行。當用戶的請求到來時,httpd可以創建進程池或線程池來處理請求。

讓我們來回顧一下之前學習過的TCP/IP和ISO/OSI的模型。如圖所示:

ISO/OSI7層模型

TCP/IP模型與ISO/OSI模型比較

在這裏插入圖片描述

前面我們指出過,httpd是apache旗下的產品之一,然後它是http協議的應用程序實現。而我們的http協議,它在協議棧中的位置,是屬於應用層。那爲了完成http協議的報文發送,它大體是如何工作的呢?我們都知道,實現網絡報文的傳輸屬於網絡通信的功能,而網絡通信功能則是由內核來提供的,我們以TCP/IP的四層模型爲例。內核可以按照其功能劃分爲通信子網和資源子網,通信子網對應我們的TCP/IP協議棧的底三層,而資源子網對應我們的TCP/IP協議棧的第四層(從下往上)。遵循TCP/IP協議棧模型的應用程序,大多數都是C/S架構的,所以實現http協議的應用程序httpd應該也有服務端和客戶端之分,而我們現在生活中接觸最多的,就是服務端,我不知道,可能是一個比較有名的主機名,然後我們通過本地的瀏覽器的導航欄直接輸入這個主機名地址,然後就可以顯示一個頁面信息,其背後的機體是很複雜的。C/S架構,就有所謂的服務端和客戶端,服務端和客戶端是分開的主機也可以是同一單主機。其實啊,不管是同一臺主機還是不同主機,服務端和客戶端之間的通信都是基於進程間通信的概念。從協議棧的角度考慮,互聯網地址(ip地址)可以標識一臺主機,而對應端口可以標識一個進程地址。因爲在C/S模式的程序中,服務端爲了隨時響應客戶端的連接請求,它是首先向內核申請註冊使用一個端口,這個端口註冊後,應用程序啓動,服務端一直處於監聽狀態。服務端要對應到具體的服務端進程。基於TCP/IP協議棧通信,首先在應用層,會添加一個應用層首部,資源子網的任務完成後,會發送給內核,內核的通信子網,從傳輸層開始,它會給報文添加一個傳輸層首部。傳輸層會標明進程使用的端口,往下走,在網絡層,會添加一個IP首部,這層可以標識一個互聯網地址。往下鏈路層就添加一個鏈路層首部,鏈路層首部包含幀信息,最終會通過層層路由傳輸到對端。對端每一層從上往下,會依次拆解各層首部,獲取詳細信息。在網絡層,拆解首部後,會看到具體的服務器IP,在傳輸層拆解首部後,會看到端口信息,通過一個ip和端口就可以標記具體服務器的具體進程,在應用層會拆解之後給對應的應用層程序。
其實,在上面的過程中,我們還涉及一個主機名和ip地址的區別。在現代的知名站點中,沒有誰是具體提供一個ip地址給客戶端訪問,而是一個主機名。那麼它背後的機理又是如何的呢?
如果涉及到主機名,就要涉及到一個所謂的DNS服務器的概念。我們以下面的圖進行簡單講解。
在這裏插入圖片描述

現在我們要去請求www.baidu.com這個主機名的時候,默認http協議的端口是80,瀏覽器做了特殊處理,如果省略主機名後面的端口,表示使用默認的80.完整的URL(後面會講解什麼是URL),我們瀏覽器要識別這種語法。假設baidu站點的默認主頁爲index.html。那麼完成的URL應該是:
http://www.baidu.com:80/index.html
瀏覽器默認是不識別主機名的,那麼這個時候所謂的DNS就其作用了。會先去本地的hosts文件中查找主機名和ip映射條目,如果沒有找到,會通過本地配置的dns服務器去,讓它去迭代查找dns記錄,找到後會把ip地址返回給用戶,這個時候假設ip地址爲14.215.177.38.現在客戶端就開始構建請求報文。要通過 本地的內核的網絡通信功能,交由互聯網路由層層傳輸到達httpd的主機。然後根據之前講解的虛擬模型,TCP/IP,會層層拆解對應層次的首部,直到把報文交由對應的httpd進程,其中可能涉及TCP的三次握手,最終httpd進程會去想內核申請加載磁盤的index.html數據到內核的內存空間,然後再到進程的內核空間,然後經過特殊處理把響應報文交由內核去處理,然後發送給客戶端。後面的過程就不詳解了,大概就是這樣,當然,其中的很多細節不是這麼簡單的。比如,客戶端和服務端之間的報文傳輸使用http協議的什麼版本,以及傳輸數據是否壓縮處理,以及傳輸數據的格式以及爲什麼http協議使用的端口是80等等一些列規範和疑問都是有複雜的背後處理機制來完成的。

IANA分配的端口說明:
IANA,互聯網數字分配機構,我們之前在瞭解DNS之前就已經知道過,它除了負責名稱解析,而且指明協議的端口的分配都是由它來管理的。
(1) 特權端口,固定端口
0~1023這個區間段的端口屬於衆所周知的端口,是屬於固定協議的端口,也屬於特權端口。只有管理員權限用戶才能向內核發起註冊使用。比如http協議默認的80,https協議默認的443,dns協議的默認53等
(2) 半隨機端口
1024~41951,這個區間段的端口,爲半隨機端口,普通用戶也可以註冊使用。分配給程序註冊爲某應用使用。應用程序mysql的默認tcp協議端口3306。
(3) 隨機端口
41951以上,好像是小於65535,要看具體內核參數配置(/proc/sys/net/ipv4/ip_local_port_range)。這個區間段的端口屬於隨機端口或者叫動態端口,大部分的應用程序隨機註冊都是使用的這個端口範圍內的。

上面有提到主機之前的通信其實就是進程間通信(同一個主機上的進程或者不同主機上的進程)。那麼進程間通信有個套接字的概念,具體套接字可以根據不同層面進行分類:
(1) 根據傳輸層協議
SOCK_STREAM:tcp套接字;
SOCK_DGRAM:udp套接字;
SOCK_RAW:raw套接字;

(2) 根據套接字所使用的地址格式
AF_INET:ipv4
AF_INET6:ipv6
AF_UNIX:unix格式(同一主機上的不同進程間基於socket套接字通信使用的一種地址;Unix_SOCK)

上面有提到報文之間傳輸,服務端和客戶端在建立連接時,會建立虛擬電路,TCP的三次握手,端口的時候會經歷四次揮手:
引用:
https://baike.baidu.com/item/三次握手/5111559
三次握手

在這裏插入圖片描述

在三次握手和四次揮手(會有對應專題詳解三次握手和四次揮手)中,會涉及到一個TCP的狀態,我們統稱爲TCP的有限狀態機(TCP FSM)。一共有如下這些狀態:
CLOSED, LISTEN,SYN_SENT, SYN_RECV, ESTABLISHED, FIN_WAIT1, CLOSE_WAIT, FIN_WAIT2, LAST_ACK, TIMEWAIT

TCP的協議特性:(記住就行)
建立連接:三次握手;
將數據打包成段:校驗和(CRC32)
確認、重傳及超時;
排序:邏輯序號;
流量控制:滑動窗口算法;
擁塞控制:慢啓動和擁塞避免算法;

http的協議版本:
(1) http/0.9
http的原型版本。功能很簡單。
(2) http/1.0
引入簡單cache(緩存)。
引入對MIME(Multipurpose Internet Mail Extensions,多用途互聯網郵件擴展)的支持。
支持的方法:
GET, POST, HEAD,PUT, DELETE,TRACE, OPTIONS
(3) http/1.1
基於http/1.0的增強版,主要是增強來對cache的支持。不過還是會效率很低,等等其他問題。
谷歌在http/1.1是主流的時候,自己開發了基於TCP應用層協議SPDY。
(4) httpd/2.0
有望成爲將來的主流,現在已經陸陸續續引入使用了,有充分參考spdy的設計。

三、httpd的工作模式

httpd接收請求的模型(併發訪問相應模型):
(1)單進程I/O模型
啓動一個進程處理用戶請求;這意味着,一次只能處理一個請求,多個請求被串行響應;
(2)多進程I/O模型
由父進程並行啓動多個子進程,每個子進程響應一個請求;
(3) 複用的I/O模型
一個進程響應N個請求;實現方式有下面兩種:
a) 多線程模式
一個進程生成n個線程,一個線程處理一個請求;
b)事件驅動(event-driven)
一個進程直接處理n個請求;
(4) 複用的多進程I/O結構
啓動多個(m)個進程,每個進程生成(n)個線程;響應的請求的數量:m*n

在httpd的衆多特性中,MPM算是非常重要的一個。MPM(Multipath processing Modules)爲多路處理模塊。三種比較應用廣泛的MPM類型:prefork,worker,event
(1) prefork
多進程模型,每個進程響應一個請求;
一個主進程,負責生成子進程及回收子進程;負責創建套接字;負責接收請求,並將其派發給某子進程進行處理;會有N個子進程,每個子進程處理一個請求。
工作模型:會預先生成幾個空閒進程,隨時等待用於響應用戶請求;管理進程生成和銷燬進程要符合預設最大空閒和最小空閒進程數量;對應上面的多進程I/O模型。

(2) worker
多進程多線程模型,每線程處理一個用戶請求;
一個主進程,負責生成子進程;負責創建套接字;負責接收請求,並將其派發給某子進程進行處理;多個子進程,每個子進程負責生成多個線程;每個線程:負責響應用戶請求;
假設子進程數量爲m,每個子進程所能創建的最大縣城數量爲n,那麼併發響應數量:m*n
對應上面的複用I/O模型的多線程模型。

(3) event
事件驅動模型,多進程模型,每個進程響應多個請求;
一個主進程 ,負責生成子進程;負責創建套接字;負責接收請求,並將其派發給某子進程進行處理;子進程,基於事件驅動機制直接響應多個請求;對應上面的複用I/O模型的事件驅動模型。

說明:在httpd2.2中,event模型屬於測試階段,功能完整性得不到保障,所以如果使用的是httpd2,2,建議生成環境,使用prefork或worker(其實單進程多線程的工作方式並不是非常理想,在httpd2.2,大部分人還是選擇使用prefork)。而且在httpd2.2,prefork和worker的支持是靜態編譯進來的功能, 所以如果要使用二者,要提前都編譯好,切換的時候只用對應的應用程序文件啓動即可。而在了httpd2.4,不僅對prefork,worker以及event的完全支持,而且它們可以以模塊的方式動態裝卸切換,非常方便。而且建議在httpd2.4使用event模型。

四、httpd的事務概述

http協議是超文本傳輸協議( HyperText Transfer Protocol),是一種應用程序的文本協議。使用http協議打開的網站現實的頁面對應的資源是通過html(hypertext mark language,超文本標記語言)語言來編寫的,在特定的客戶端程序(比如瀏覽器)會顯示出特定的格式。html格式語言類似於如此:

<html>
	<head>
		<title>TITLE</title>
	</head>
	<body>
		<h1></h1>
			<p> blabla... <a href="http://www.baidu.com/index.html"> bla... </a> </p>
		<h2> </h2>
	</body>
</html>

可以讓html配合js以及css設計出更加豐富的頁面排版等,當然,詳細的這些活屬於前段工程師要做的。上面有提到了資源的概念,web服務器上資源分類:
(1) 靜態資源
無須服務端做出額外處理,直接加載硬盤存儲數據(有些要經過編碼等特殊處理後發送)。比如常見以以下後綴結尾的都是靜態資源: .jpg, .png, .gif, .html, txt, .js, .css, .mp3, .avi等。
(2) 動態資源
服務端需要通過執行程序做出處理,發送給客戶端的是程序的運行結果。比如以以下後綴結尾的:.php,.jsp等。

請求加載的一個頁面可能有多個資源,是通過URL來表示的,URL又叫統一資源標識符(Uniform Resource Locator),用於標識服務器特定資源的位置。我們在客戶端瀏覽器鍵入就是URL。一個完整的URL格式如下:
Scheme://Server[:Port][/PATH/TO/SOME_RESOURCE]
其中scheme表示協議方案,比如可以爲ftp,http,https,svn等;
server表示應用程序的主機名地址或ip地址;
port表示請求對應主機名上對應程序進程註冊使用的端口號,如果是用默認協議的默認端口號,這個可以省略不寫,到時候瀏覽器會自動加上;
/xxx:表示請求的資源目錄,這個根(/)是相對於站點定義的文檔路徑的。比如/test/index.html,站點定義的文檔路徑爲/var/www/html,那麼這個請求服務器上的資源路徑爲:/var/www/html/test/index.html

一次完整的http請求處理過程:
(1) 建立或處理連接:接收請求或拒絕請求;
(2) 接收請求:接收來自於網絡上的主機請求報文中對某特定資源的一次請求的過程;
(3) 處理請求:對請求報文進行解析,獲取客戶端請求的資源及請求方法等相關信息;
(4) 訪問資源:獲取請求報文中請求的資源;
(5) 構建響應報文
(6) 發送響應報文
(7) 記錄日誌

客戶端向服務器發起請求,其請求的報文叫"請求報文(http request)";
服務器接受到客戶端的請求後,向客戶端響應的報文叫"響應報文(http response)";
而一次http事務則是由"請求報文"和"響應報文組成"。

請求報文和響應報文格式:
(1) 請求報文
起始行:<請求方法><請求的URL><請求使用的http協議版本>
請求報文頭部:<請求報文頭部>
空行:
請求報文主體部分:<請求報文主體>

<method><request-URL><version>
<headers>
<blank line>
<entity-body>

(2) 響應報文
起始行:<響應使用的http協議版本><響應狀態碼><狀態碼的解釋說明,原因短語>
響應報文頭部:<響應報文頭部>
空行:
響應報文主體部分:<響應報文主體>

<version><status><reason-phrase>
<headers>
<blank line>
<entity-body>

1、方法(method)
請求方法,標明客戶端希望服務器對資源執行的動作。例如,方法有:

GET,HEAD,POST,PUT(DAV)

2、請求的URL
要直接與服務器進行對話,只要請求URL是資源的絕對路徑就可以了,服務器可以假定自己是URL的主機/端口。

3、httpd協議版本

HTTP/<major>.<minor>
例如:
HTTP/1.1

4、狀態碼(status)
三位數字,如200,301,302,404,502。後面會列出詳細的狀態碼的含義。

5、原因短語(reason-phrase)
狀態碼所標記的狀態的簡要描述。

6、頭部
每個請求或響應報文可包含任意個首部;每個首部都有首部的名稱。可以有零個或多個頭部,每個首部都包含一個名字,後面跟着一個冒號(😃,然後是一個可選的空格,接着是一個值,最後是一個CRLF首部是由一個空行(CRLF)結束的,表示了頭部列表的結束和實體主體部分的開始。

7、實體的主體部分(entity-body)
體的主體部分包含一個由任意數據組成的數據塊,並不是所有的報文都包含實體的主體部分,有時,報文只是以一個CRLF結束。

摘抄於:https://www.cnblogs.com/zhuifeng/p/4072248.html
頭部和狀態碼介紹:

頭部分爲"通用頭部","請求頭部","響應頭部"以及"實體首部"
通用頭部:既可以出現在請求報文中,也可以出現在響應報文中,它提供了與報文相關的最基本的信息
Connection:允許客戶端和服務器指定與請求/響應連接有關的選項
Date:提供日期和時間標誌,說明報文是什麼時間創建的
MIME-Version:給出了發送端使用的MIME版本
Trailer:如果報文采用了分塊傳輸編碼方式,就可以用這個首部列出位於報文拖掛部分的首部集合
Transfer-Encoding:告知接收端爲了保證報文的可靠傳輸,對報文采用了什麼編碼方式
Update:給出了發送端可能想要“升級”使用的新版本或協議
Via:顯示了報文經過的中間節點(代理、網關)
Cache-Control:用於隨報文傳送緩存指示

請求頭部:請求頭部是隻在請求報文中有意義的頭部。用於說明是誰或什麼在發送請求、請求源自何處,或者客戶端的喜好及能力
Client-IP:提供了運行客戶端的機器的IP地址
From:提供了客戶端用戶的E-mail地址
Host:給出了接收請求的服務器的主機名和端口號
Referer:提供了包含當前請求URI的文檔的URL
UA-Color:提供了與客戶端顯示器的顯示顏色有關的信息
UA-CPU:給出了客戶端CPU的類型或製造商
UA-OS:給出了運行在客戶端機器上的操作系統名稱及版本
UA-Pixels:提供了客戶端顯示器的像素信息
User-Agent:將發起請求的應用程序名稱告知服務器       
Accept:告訴服務器能夠發送哪些媒體類型
Accept-Charset:告訴服務器能夠發送哪些字符集
Accept-Encoding:告訴服務器能夠發送哪些編碼方式
Accept-Language:告訴服務器能夠發送哪些語言
TE:告訴服務器可以使用那些擴展傳輸編碼
Expect:允許客戶端列出某請求所要求的服務器行爲
Range:如果服務器支持範圍請求,就請求資源的指定範圍
If-Match:如果實體標記與文檔當前的實體標記相匹配,就獲取這份文檔
If-Modified-Sinec:除非在某個指定的日期之後資源被修改過,否則就限制這個請求
If-None-Match:如果提供的實體標記與當前文檔的實體標記不相符,就獲取文檔
If-Range:允許對文檔的某個範圍進行條件請求
If-Unmodified-Since:除非在某個指定日期之後資源沒有被修改過,否則就限制這個請求
Authorization:包含了客戶端提供給服務器,以便對其自身進行認證的數據
Cookie:客戶端用它向服務器傳送數據
Cookie2:用來說明請求端支持的cookie版本
Max-Forward:在通往源端服務器的路徑上,將請求轉發給其他代理或網關的最大次數
Proxy-Authorization:這個首部在與代理進行認證時使用的
Proxy-Connection:這個首部是在與代理建立連接時使用的

響應頭部:響應頭部爲客戶端提供了一些額外信息,比如誰在發送響應、響應者的功能,甚至與響應相關的一些特殊指令
Age:(從最初創建開始)響應持續時間
Public:服務器爲其資源支持的請求方法列表
Retry-After:如果資源不可用的話,在此日期或時間重試
Server:服務器應用程序軟件的名稱和版本
Title:對HTML文檔來說,就是HTML文檔的源端給出的標題
Warning:比原因短語更詳細一些的警告報文
Accept-Ranges:對此資源來說,服務器可接受的範圍類型
Vary:服務器會根據這些首部的內容挑選出最適合的資源版本發送給客戶端
Proxy-Authenticate:來自代理的對客戶端的質詢列表
Set-Cookie:在客戶端設置數據,以便服務器對客戶端進行標識
Set-Cookie2:與Set-Cookie類似
WWW-Authenticate:來自服務器的對客戶端的質詢列表

實體首部:描述主體的長度和內容,或者資源自身
Allow:列出了可以對此實體執行的請求方法
Location:告知客戶端實體實際上位於何處,用於將接收端定向到資源的位置(URL)上去
Content-Base:解析主體中的相對URL時使用的基礎URL
Content-Encoding:對主體執行的任意編碼方式
Content-Language:理解主體時最適宜使用的自然語言
Content-Length:主體的長度
Content-Location:資源實際所處的位置
Content-MD5:主體的MD5校驗和
Content-Range:在整個資源中此實體表示的字節範圍
Content-Type:這個主體的對象類型
ETag:與此實體相關的實體標記
Expires:實體不再有效,要從原始的源端再次獲取實體的日期和時間
Last-Modified:這個實體最後一次被修改的日期和時間

狀態碼:
摘抄於:https://baike.baidu.com/item/http/243074?fromtitle=超文本傳輸協議&fromid=8535513

1xx:100-101,信息提示
100 Continue:服務器僅接收到部分請求,但是一旦服務器並沒有拒絕該請求,客戶端應該繼續發送其餘的請求。
101 Switching Protocols:服務器轉換協議:服務器將遵從客戶的請求轉換到另外一種協議。

2xx:200-206,成功
200 OK:請求成功(其後是對GET和POST請求的應答文檔。)
201 Created:請求被創建完成,同時新的資源被創建。
202 Accepted:供處理的請求已被接受,但是處理未完成。
203 Non-authoritative Information:文檔已經正常地返回,但一些應答頭可能不正確,因爲使用的是文檔的拷貝。
204 No Content:沒有新文檔。瀏覽器應該繼續顯示原來的文檔。如果用戶定期地刷新頁面,而Servlet可以確定用戶文檔足夠新,這個狀態代碼是很有用的
205 Reset Content:沒有新文檔。但瀏覽器應該重置它所顯示的內容。用來強制瀏覽器清除表單輸入內容。
206 Partial Content:客戶發送了一個帶有Range頭的GET請求,服務器完成了它。

3xx:300-307,重定向
300 Multiple Choices:多重選擇。鏈接列表。用戶可以選擇某鏈接到達目的地。最多允許五個地址。
301 Moved Permanently:所請求的頁面已經轉移至新的url。
302 Found:所請求的頁面已經臨時轉移至新的url。
303 See Other:所請求的頁面可在別的url下被找到。
304 Not Modified:未按預期修改文檔。客戶端有緩衝的文檔併發出了一個條件性的請求(一般是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。服務器告訴客戶,原來緩衝的文檔還可以繼續使用。
305 Use Proxy:客戶請求的文檔應該通過Location頭所指明的代理服務器提取。
306 Unused:此代碼被用於前一版本。目前已不再使用,但是代碼依然被保留。
307 Temporary Redirect:被請求的頁面已經臨時移至新的url。


4xx:400-423,錯誤類信息,客戶端錯誤
400 Bad Request:服務器未能理解請求。
401 Unauthorized:被請求的頁面需要用戶名和密碼。
	401.1:登錄失敗。
	401.2:服務器配置導致登錄失敗。
	401.3:由於 ACL 對資源的限制而未獲得授權。
	401.4:篩選器授權失敗。
	401.5:ISAPI/CGI 應用程序授權失敗。
	401.7:訪問被 Web 服務器上的 URL 授權策略拒絕。這個錯誤代碼爲 IIS 6.0 所專用。
	
402 Payment Required:此代碼尚無法使用。
403 Forbidden:對被請求頁面的訪問被禁止。
	403.1:執行訪問被禁止。
	403.2:讀訪問被禁止。
	403.3:寫訪問被禁止。
	403.4:要求 SSL。
	403.5:要求 SSL 128。
	403.6:IP 地址被拒絕。
	403.7:要求客戶端證書。
	403.8:站點訪問被拒絕。
	403.9:用戶數過多。
	403.10:配置無效。
	403.11:密碼更改。
	403.12:拒絕訪問映射表。
	403.13:客戶端證書被吊銷。
	403.14:拒絕目錄列表。
	403.15:超出客戶端訪問許可。
	403.16:客戶端證書不受信任或無效。
	403.17:客戶端證書已過期或尚未生效。
	403.18:在當前的應用程序池中不能執行所請求的 URL。這個錯誤代碼爲 IIS 6.0 所專用。
	403.19:不能爲這個應用程序池中的客戶端執行 CGI。這個錯誤代碼爲 IIS 6.0 所專用。
	403.20:Passport 登錄失敗。這個錯誤代碼爲 IIS 6.0 所專用

404 Not Found:服務器無法找到被請求的頁面。
	404.0:(無)–沒有找到文件或目錄。
	404.1:無法在所請求的端口上訪問 Web 站點。
	404.2:Web 服務擴展鎖定策略阻止本請求。
	404.3:MIME 映射策略阻止本請求。
405 Method Not Allowed:請求中指定的方法不被允許。
406 Not Acceptable:服務器生成的響應無法被客戶端所接受。
407 Proxy Authentication Required:用戶必須首先使用代理服務器進行驗證,這樣請求才會被處理。
408 Request Timeout:請求超出了服務器的等待時間。
409 Conflict:由於衝突,請求無法被完成。
410 Gone:被請求的頁面不可用。
411 Length Required:"Content-Length" 未被定義。如果無此內容,服務器不會接受請求。
412 Precondition Failed:請求中的前提條件被服務器評估爲失敗。
413 Request Entity Too Large:由於所請求的實體的太大,服務器不會接受請求。
414 Request-url Too Long:由於url太長,服務器不會接受請求。當post請求被轉換爲帶有很長的查詢信息的get請求時,就會發生這種情況。
415 Unsupported Media Type:由於媒介類型不被支持,服務器不會接受請求。
416 Requested Range Not Satisfiable:服務器不能滿足客戶在請求中指定的Range頭。
417 Expectation Failed:執行失敗。
423:鎖定的錯誤。


5xx:500-505,錯誤類信息,服務端錯誤
500 Internal Server Error:求未完成。服務器遇到不可預知的情況。
	500.12:應用程序正忙於在 Web 服務器上重新啓動。
	500.13:Web 服務器太忙。
	500.15:不允許直接請求 Global.asa。
	500.16:UNC 授權憑據不正確。這個錯誤代碼爲 IIS 6.0 所專用。
	500.18:URL 授權存儲不能打開。這個錯誤代碼爲 IIS 6.0 所專用。
	500.100:內部 ASP 錯誤。
501 Not Implemented:請求未完成。服務器不支持所請求的功能。
502 Bad Gateway:請求未完成。服務器從上游服務器收到一個無效的響應。
	502.1:CGI 應用程序超時。
	502.2:	CGI 應用程序出錯。
	
503 Service Unavailable:請求未完成。服務器臨時過載或當機。
504 Gateway Timeout:網關超時。	
505 HTTP Version Not Supported:服務器不支持請求中指明的HTTP協議版本。

五、CentOS 6簡單安裝httpd2.2和配置

5.1、安裝和主要安裝文件說明

(1) 直接使用yum的base倉庫的httpd2.2
yum install httpd
安裝過程省略。
(2) 安裝主要文件列表說明
	配置文件:
		/etc/httpd/conf/httpd.conf
		/etc/httpd/conf.d/*.conf
	服務腳本:
		/etc/rc.d/init.d/httpd
		腳本的配置文件:/etc/sysconfig/httpd
	主程序文件:
		/usr/sbin/httpd
		/usr/sbin/httpd.event
		/usr/sbin/httpd.worker
	日誌文件:
		/var/log/httpd:
			access_log:訪問日誌
			error_log:錯誤日誌
	站點文檔:
		/var/www/html
	模塊文件路徑:
		/usr/lib64/httpd/modules
		
	服務控制和啓動:
		chkconfig  httpd  on|off
		service  {start|stop|restart|status|configtest|reload}  httpd

5.2、默認配置文件格式說明以及配置指令格式說明

(1) 默認主配置文件語法
[root@yanhui_httpd ~]# grep '^###' /etc/httpd/conf/httpd.conf 
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts
第一部分是:全局環境設定
第二部分是:主要服務端的配置
第三部分是:虛擬主機配置
(2) 配置指令格式
指令(directive) 值(value)
說明:其中指令不區分字符大小寫;當值爲路徑時候,具體是否區分字符大小寫取決於文件系統,比如linux的
文件路系統路徑就區分字符大小寫,windows的文件系統路徑就不區分。

5.3、修改監聽的地址和端口

[root@yanhui_httpd ~]# grep -i -B 10 '^listen' /etc/httpd/conf/httpd.conf

#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, in addition to the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to 
# prevent Apache from glomming onto all bound IP addresses (0.0.0.0)
#
#Listen 12.34.56.78:80
Listen 80

Description:	IP addresses and ports that the server listens to
Syntax:	Listen [IP-address:]portnumber [protocol]
Context:	server config
Status:	MPM
Module:	beos, mpm_netware, mpm_winnt, mpmt_os2, prefork, worker, event
Compatibility:	Required directive since Apache 2.0
The protocol argument was added in 2.1.5

說明:
(1) 省略IP-address表示監聽到通用網卡,及0.0.0.0;
(2) Listen指令可以重複出現多次,監聽多個端口就可以使用這種機制;
(3) 修改監聽的socket要重啓才能生效;
(4) http協議配合ssl工作,這裏的protocol部分要設置爲https
例如:
Listen 192.168.56.90:443 https
Listen 192.168.56.90:1443 https

例如我啓動我本地的http,配置支持http和https,並且http監聽到80,8080端口,https監聽到443和1443端口
[root@yanhui_httpd ~]# ss -nltu
Netid  State      Recv-Q Send-Q                                                 Local Address:Port                                                   Peer Address:Port 
tcp    LISTEN     0      128                                                               :::443                                                              :::*     
tcp    LISTEN     0      128                                                               :::1443                                                             :::*     
tcp    LISTEN     0      128                                                               :::8080                                                             :::*     
tcp    LISTEN     0      128                                                               :::80                                                               :::*     
tcp    LISTEN     0      128                                                               :::22                                                               :::*     
tcp    LISTEN     0      128                                                                *:22                                                                *:*     
tcp    LISTEN     0      100                                                              ::1:25                                                               :::*     
tcp    LISTEN     0      100                                                        127.0.0.1:25                                                                *:*     
[root@yanhui_httpd ~]# grep '^Listen' /etc/httpd/conf/httpd.conf
Listen 80
Listen 8080
Listen 443
Listen 1443

5.4、持久連接,長連接設置

持久連接又叫保持連接或長連接。所謂持久連接,就是tcp連續建立後,每個資源獲取完成後不全斷開連接,而是繼續等待其它資源請求的進行。特定業務場景,打開持久連接是可以節省每次建立連接帶來的資源開銷的。什麼情況下會端口:
(1) 數量達到限制
(2) 時間達到會話時間限制
默認情況,httpd2.2的配置沒有啓用持久連接,持久連接帶來的副作用:
對併發訪問量較大的服務器,長連接機制會使得後續某些請求無法得到正常響應;實際生產中,使用較短的持久連接時長,以及較少的請求數量。

[root@yanhui_httpd ~]# grep -A 13 '^KeepAlive[[:blank:]]\+' /etc/httpd/conf/httpd.conf
KeepAlive Off

#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100

#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 15

指令配置語法官方鏈接:
http://httpd.apache.org/docs/2.2/en/mod/core.html#keepalive
http://httpd.apache.org/docs/2.2/en/mod/core.html#maxkeepaliverequests
http://httpd.apache.org/docs/2.2/en/mod/core.html#keepalivetimeout

KeepAlive Off #設置爲On表示啓用持久連接
MaxKeepAliveRequests 100 #處於持久連接模式下最大的允許請求的連接數量,爲了性能,要適當設置這個值,設置爲0表示無限制。
KeepAliveTimeout 15 #持久連接模式下,同一個連接會話,兩次連接請求的等待的時間秒數。httpd2.2只支持到秒級別,httpd2.4支持到毫秒級別。

5.5、不同MPM配置和說明

httpd-2.2不支持同時編譯多個MPM模塊,所以只能編譯選定要使用的那個;CentOS 6的rpm包爲此專門提供了三個應用程序文件,httpd(prefork), httpd.worker, httpd.event,分別用於實現對不同的MPM機制的支持;確認現在使用的是哪下程序文件的方法:

ps aux|grep 'httpd'
[root@yanhui_httpd ~]# ps aux|grep 'httpd'
root      17630  0.0  0.7 177524  3840 ?        Ss   21:10   0:00 /usr/sbin/httpd
apache    17632  0.0  0.5 177524  2496 ?        S    21:10   0:00 /usr/sbin/httpd
apache    17633  0.0  0.5 177524  2476 ?        S    21:10   0:00 /usr/sbin/httpd
apache    17634  0.0  0.5 177524  2476 ?        S    21:10   0:00 /usr/sbin/httpd
apache    17635  0.0  0.5 177524  2476 ?        S    21:10   0:00 /usr/sbin/httpd
apache    17636  0.0  0.5 177524  2476 ?        S    21:10   0:00 /usr/sbin/httpd
apache    17637  0.0  0.5 177524  2476 ?        S    21:10   0:00 /usr/sbin/httpd
apache    17638  0.0  0.5 177524  2476 ?        S    21:10   0:00 /usr/sbin/httpd
apache    17639  0.0  0.5 177524  2476 ?        S    21:10   0:00 /usr/sbin/httpd
root      17666  0.0  0.1 103320   888 pts/1    S+   21:23   0:00 grep httpd
[root@yanhui_httpd ~]#
#我這裏使用的默認值,默認值是prefork模型。 如果要切換成worker(event因爲是測試階段,所以我們不演示了。),只需要把/etc/sysconfig/httpd中關於HTTPD的註釋啓用即可,因爲服務器腳本/etc/init.d/httpd默認的httpd變量如果HTTPD不爲空,就設置爲HTTPD的值,如果HTTPD爲空,就設置爲HTTPD的值。
[root@yanhui_httpd ~]# grep '^#.*httpd.worker' /etc/sysconfig/httpd
#HTTPD=/usr/sbin/httpd.worker
[root@yanhui_httpd ~]# grep -E '^httpd|\. /etc/sysconfig/httpd' /etc/init.d/httpd 
        . /etc/sysconfig/httpd
httpd=${HTTPD-/usr/sbin/httpd}

示例演示切換爲worker:
[root@yanhui_httpd ~]# sed -i '/^#HTTPD=\/usr\/sbin\/httpd.worker/s/^#//' /etc/sysconfig/httpd 
[root@yanhui_httpd ~]# grep '^.*httpd.worker' /etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.worker
[root@yanhui_httpd ~]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd: httpd.worker: apr_sockaddr_info_get() failed for yanhui_httpd
httpd.worker: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [  OK  ]
[root@yanhui_httpd ~]# 
[root@yanhui_httpd ~]# ps aux|grep httpd
root      17726  0.0  0.8 177732  4028 ?        Ss   21:32   0:00 /usr/sbin/httpd.worker
apache    17728  0.0  0.6 521992  3312 ?        Sl   21:32   0:00 /usr/sbin/httpd.worker
apache    17729  0.0  0.6 521992  3304 ?        Sl   21:32   0:00 /usr/sbin/httpd.worker
apache    17731  0.0  0.6 521992  3312 ?        Sl   21:32   0:00 /usr/sbin/httpd.worker
root      17841  0.0  0.1 103320   884 pts/1    S+   21:32   0:00 grep httpd

PS:上面有個小問題,就是提示,無法檢測可信賴的FQDN,使用127.0.0.1作爲ServerName的值。
只要加一條主機名和ip地址的映射關係到/etc/hosts文件,然後把ServerName後邊的值設置爲主機名即可。
[root@yanhui_httpd ~]# hostname
yanhui_httpd
[root@yanhui_httpd ~]# grep 'yanhui_httpd' /etc/hosts
192.168.56.90 yanhui_httpd
[root@yanhui_httpd ~]# grep '^ServerName' /etc/httpd/conf/httpd.conf
ServerName yanhui_httpd
[root@yanhui_httpd ~]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

這裏關於MPM的默認配置如下:
# prefork MPM
# StartServers: number of server processes to start(初始啓動時管理進程產生的工作進程的數量,默認8個)
# MinSpareServers: minimum number of server processes which are kept spare
空閒時,最少存在的工作進程的數量。默認值5個。
# MaxSpareServers: maximum number of server processes which are kept spare
空閒時,最大存在的工作進程的數量,默認值爲20個。
# ServerLimit: maximum value for MaxClients for the lifetime of the server
最大活動進程數。默認值爲256。其值一般要大於等於MaxClients的值,如果比MaxClients的值小,那麼MaxClients大於ServerLimit部分的數值無效。以ServerLimit爲準。
# MaxClients: maximum number of server processes allowed to start
最大併發連接數,最多允許發起的連接請求的個數。默認值爲256。
# MaxRequestsPerChild: maximum number of requests a server process serves
一個工作進程服務最多的請求數量(默認是4000個,超過這個值會工作進程會被銷燬掉)

說明:prefork模式下,默認的最大併發爲256。

<IfModule prefork.c>  #如果prefork.c存在(可以使用httpd -l查看),則這個容器內的參數設置有效。
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000
</IfModule>

# worker MPM
# StartServers: initial number of server processes to start
初始啓動的工作進程數量。默認值爲4
# MaxClients: maximum number of simultaneous client connections
最大併發連接數,最多允許發起的連接請求的個數。默認值爲300
# MinSpareThreads: minimum number of worker threads which are kept spare
最少空閒線程數。默認值爲25
# MaxSpareThreads: maximum number of worker threads which are kept spare
最大空閒線程數。默認值爲75
# ThreadsPerChild: constant number of worker threads in each server process
每個子進程生成的線程數量。默認是25,默認啓動進程數量爲4,那麼一共有4*25=100個線程。
# MaxRequestsPerChild: maximum number of requests a server process serves
每個子進程在聲明週期內最大允許服務的最多請求個數。默認值爲0表示不限定。

ps:這裏默認是啓動4個工作進程,然後每個工作進程會啓動25個線程。所以默認情況,啓動線程池有100個線程,而設置的最大空閒線程數位75,所以默認啓動會處理掉25個線程,即設置運營於worker模式。則只會看到3個工作進程,有一個工作進程被殺掉了。這個默認配置很奇葩。


<IfModule worker.c> #如果worker.c存在,則這個容器內的參數設置有效。
StartServers         4
MaxClients         300
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>
在worker模式下,也支持使用ServerLimit 指令,其值要大於等於:
ServerLimit >= (MaxClients)/(ThreadsPerChild )=12。表示在worker模式下,最大活動進程數要大於等於12。如果設置爲12,表示最大活動線程數量爲12*25=300,剛好處理最大的併發連接數300.

修改ServerLimi和ThreadLimit的值,要先stop掉所有的工作進程,然後再次啓動。

5.6、動態共享對象(DSO)機制說明

[root@yanhui_httpd ~]# grep -A14 '^#.*(DSO.*' /etc/httpd/conf/httpd.conf
# Dynamic Shared Object (DSO) Support
#
# To be able to use the functionality of a module which was built as a DSO you
# have to place corresponding `LoadModule' lines at this location so the
# directives contained in it are actually available _before_ they are used.
# Statically compiled modules (those listed by `httpd -l') do not need
# to be loaded here.
#
# Example:
# LoadModule foo_module modules/mod_foo.so
#
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_alias_module modules/mod_authn_alias.so

#加載指定的模塊語法爲:
LoadModule  <mod_name>  <mod_path>
mod_name表示要加載的模塊名稱。mod_path表示要加載的模塊路徑,如果mod_path的路徑是一個相對路徑,
它表示相對於ServerRoot的路徑,而ServerRoot默認的路徑爲/etc/httpd
root@yanhui_httpd ~]# grep '^ServerRoot' /etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd"
[root@yanhui_httpd ~]# ls -l /etc/httpd/modules
lrwxrwxrwx 1 root root 29 Dec  9 18:46 /etc/httpd/modules -> ../../usr/lib64/httpd/modules

[root@yanhui_httpd ~]# ls -l /etc/httpd/modules/|head -4
total 1524
-rwxr-xr-x 1 root root 10416 Jun 19 23:45 mod_actions.so
-rwxr-xr-x 1 root root 14608 Jun 19 23:45 mod_alias.so
-rwxr-xr-x 1 root root 10416 Jun 19 23:45 mod_asis.so

5.7、定義主站點的文檔頁面路徑

ServerName 
	語法格式: ServerName [scheme://]fully-qualified-domain-name[:port]	
DocumentRoot  ""

文檔路徑映射:
	DoucmentRoot指向的路徑爲URL路徑的起始位置
		其相當於站點URL的根路徑;
		
	URL PATH與FileSystem PATH不是等同的,而是存在一種映射關係;
		URL /  --> FileSystem /var/www/html/
			/images/logo.jpg --> /var/www/html/images/logo.jpg

[root@yanhui_httpd ~]# grep '^ServerName' /etc/httpd/conf/httpd.conf
ServerName yanhui_httpd
[root@yanhui_httpd ~]# grep '^DocumentRoot' /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/html"

5.8、站點訪問控制常見的機制

可基於兩種機制指明對哪些資源進行何種訪問控制:
1、基於文件系統路徑

<Directory  "">
...
</Directory>

<File  "">
...
</File>

<FileMatch  "PATTERN">
...
</FileMatch>

2、基於URL路徑

<Location  "">
...
</Location>

<LocationMatch "PATTERN">
...
</LocationMatch>

關於中“基於源地址”實現訪問控制:

<Direcotry "/path/to/somewhere">
  Options 
  AllowOverride 
    AllowOverride None 不禁用下面(Order,Allow,Deny等指令的設置)
    AllowOverride AuthConfig 使用用戶的認證,而不再完全基於IP做認證
  order 次序,寫在後面的爲默認
   allow,deny: 沒有允許的都拒絕
   deny,allow:沒有拒絕的都允許
  Allow from
  Deny from
 </Direcotry>
如果都匹配或都不匹配時以默認爲準
否則則以匹配到的爲準

order和allow、deny
	order:定義生效次序;寫在後面的表示默認法則;
	Allow from, Deny from
		來源地址:
			IP
			NetAddr:
				172.16
				172.16.0.0
				172.16.0.0/16
				172.16.0.0/255.255.0.0

控制頁面資源允許所有來源的主機可訪問:
	httpd-2.2
		<Directory "">
			...
			Order allow,deny
			Allow from all 
		</Directory>
				
控制頁面資源拒絕所有來源的主機可訪問:

		<Directory "">
			...
			Order allow,deny
			Deny from all 
		</Directory>
		
Options:Configures what features are available in a particular directory
	後跟1個或多個以空白字符分隔的“選項”列表;
		Indexes:指明的URL路徑下不存在與定義的主頁面資源相符的資源文件時,返回索引列表給用戶;
				非下載站點,不建議使用這個選項,因爲文件系統資源列表列出是比較危險的。
		FollowSymLinks:允許跟蹤符號鏈接文件所指向的源文件;
		None:所有都不啓用;
		All:所有的都啓用;
		ExecCGI:允許使用mod_cgi模塊執行CGI腳本;
		Includes:允許使用mod_include模塊實現服務器端包含(SSI);
		IncludesNOEXEC:允許包含但不允許執行腳本;
		MultiViews:允許使用mod_negotiation實現內容協商;
		SymLinksIfOwnerMatch:在鏈接文件屬主屬組與原始文件的屬主屬組相同時,允許跟隨符號連接所指向的原始文件;

5.9、定義站點主頁面

[root@yanhui_httpd ~]# grep '^DirectoryIndex' /etc/httpd/conf/httpd.conf
DirectoryIndex index.html index.html.var

4.8和4.9的示例:
(1) 定義一個靜態文件,訪問測試

[root@yanhui_httpd html]# ls -l /var/www/html/yanhui_test.html 
-rw-r--r-- 1 root root 31 Dec  9 22:28 /var/www/html/yanhui_test.html
[root@yanhui_httpd html]# cat /var/www/html/yanhui_test.html
<h1>This is a test pages.</h1>

在這裏插入圖片描述

(2) 自己配置一個目錄,然後控制上述常用屬性

[root@yanhui_httpd ~]# grep -A5 '/var/www/yanhui' /etc/httpd/conf/httpd.conf
<Directory "/var/www/yanhui">
    Options Indexes FollowSymLinks
    Order allow,deny
    Allow from all
</Directory>

[root@yanhui_httpd ~]# grep '^DocumentRoot' /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www"  #修改來默認文檔路徑爲/var/www,原先爲/var/www/html

[root@yanhui_httpd ~]# service httpd configtest
Syntax OK
[root@yanhui_httpd ~]# service httpd reload
Reloading httpd: 
[root@yanhui_httpd ~]# mkdir -p /var/www/yanhui
[root@yanhui_httpd ~]# cp /etc/fstab /etc/inittab /var/www/yanhui/
[root@yanhui_httpd ~]# cp /var/www/icons/patch.png /var/www/yanhui/
[root@yanhui_httpd ~]# ls -l /var/www/yanhui/
total 12
-rw-r--r-- 1 root root 805 Dec  9 22:34 fstab
-rw-r--r-- 1 root root 884 Dec  9 22:34 inittab
-rw-r--r-- 1 root root 310 Dec  9 22:35 patch.png

在這裏插入圖片描述

[root@yanhui_httpd ~]# ln -sf /var/www/yanhui/fstab /var/www/yanhui/fstab.html
[root@yanhui_httpd ~]# ls -l /var/www/yanhui/
total 12
-rw-r--r-- 1 root root 805 Dec  9 22:34 fstab
lrwxrwxrwx 1 root root  21 Dec  9 22:40 fstab.html -> /var/www/yanhui/fstab
-rw-r--r-- 1 root root 884 Dec  9 22:34 inittab
-rw-r--r-- 1 root root 310 Dec  9 22:35 patch.png

在這裏插入圖片描述

去掉Options中的FollowsymLinks後的效果:
在這裏插入圖片描述

把Options的選項改爲None的效果:
在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

實際效果爲,所有的特性不啓動,不過對應訪問已經存在的資源(不是符號鏈接),還是會響應的。

演示Options選項的SymLinksIfOwnerMatch:
a> 符號鏈接文件和原始文件屬主和屬組一樣

[root@yanhui_httpd ~]# vim /etc/httpd/conf/httpd.conf
[root@yanhui_httpd ~]# ls -l /var/www/yanhui/fstab*
-rw-r--r-- 1 root root 805 Dec  9 22:34 /var/www/yanhui/fstab
lrwxrwxrwx 1 root root  21 Dec  9 22:40 /var/www/yanhui/fstab.html -> /var/www/yanhui/fstab

在這裏插入圖片描述

b> 符號鏈接文件和原始文件屬主和屬組不一樣

[root@yanhui_httpd ~]# useradd centos
[root@yanhui_httpd ~]# chown centos:centos /var/www/yanhui/fstab
[root@yanhui_httpd ~]# ls -l /var/www/yanhui/fstab*
-rw-r--r-- 1 centos centos 805 Dec  9 22:34 /var/www/yanhui/fstab
lrwxrwxrwx 1 root   root    21 Dec  9 22:40 /var/www/yanhui/fstab.html -> /var/www/yanhui/fstab

在這裏插入圖片描述

[root@yanhui_httpd ~]# chown root /var/www/yanhui/fstab
[root@yanhui_httpd ~]# ls -l /var/www/yanhui/
total 12
-rw-r--r-- 1 root centos 805 Dec  9 22:34 fstab
lrwxrwxrwx 1 root root    21 Dec  9 22:40 fstab.html -> /var/www/yanhui/fstab
-rw-r--r-- 1 root root   884 Dec  9 22:34 inittab
-rw-r--r-- 1 root root   310 Dec  9 22:35 patch.png

在這裏插入圖片描述
ps:要屬主和屬組都不相同,才禁止訪問。否則,都可以訪問。建議生產配置Options,非特殊業務,配置成None即可。

5.10、定義路徑別名

Alias /alias/ "/path/to/somewhere"
意味着訪問http://Server_IP/alias時,其頁面文件來自於/path/to/somewhere中
[root@yanhui_httpd ~]# grep '^Alias' /etc/httpd/conf/httpd.conf
Alias /icons/ "/var/www/icons/"
Alias /error/ "/var/www/error/"

示例:
(1) 簡單查看

[root@yanhui_httpd imgs]# grep -A5 '/var/www/yanhui' /etc/httpd/conf/httpd.conf
<Directory "/var/www/yanhui">
    Options SymLinksIfOwnerMatch
    Order allow,deny
    Allow from all
</Directory>

[root@yanhui_httpd imgs]# ls -l /var/www/yanhui/
total 16
-rw-r--r-- 1 root centos  805 Dec  9 22:34 fstab
lrwxrwxrwx 1 root root     21 Dec  9 22:40 fstab.html -> /var/www/yanhui/fstab
drwxr-xr-x 2 root root   4096 Dec  9 22:55 images
-rw-r--r-- 1 root root    884 Dec  9 22:34 inittab
-rw-r--r-- 1 root root    310 Dec  9 22:35 patch.png
[root@yanhui_httpd imgs]# ls -l /var/www/yanhui/images/
total 172
-rw-r--r-- 1 root root 175056 Sep 19 22:58 linux2.png

在這裏插入圖片描述

(2) 配置別名後演示

[root@yanhui_httpd imgs]# grep  -A4 -B1 '/var/www/yanhui' /etc/httpd/conf/httpd.conf
Alias /yanhui/images/ "/data/imgs/"
<Directory "/var/www/yanhui">
    Options SymLinksIfOwnerMatch
    Order allow,deny
    Allow from all
</Directory>
[root@yanhui_httpd imgs]# ls -l /data/imgs/
total 332
-rw-r--r-- 1 root root 339657 Sep 19 22:58 linux1.png

在這裏插入圖片描述

5.11、設置默認字符集

[root@yanhui_httpd imgs]# grep '^AddDefaultCharset' /etc/httpd/conf/httpd.conf
AddDefaultCharset UTF-8

中文字符集:GBK, GB2312, GB18030

5.12、日誌設置

日誌類型:訪問日誌 和 錯誤日誌

錯誤日誌:
	ErrorLog  logs/error_log
	LogLevel  warn
		Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
		
訪問日誌:
	LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
	CustomLog  logs/access_log  combined
	
	LogFormat format strings:
		http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
	
		%h:客戶端IP地址;
		%l:Remote User, 通常爲一個減號(“-”);
		%u:Remote user (from auth; may be bogus if return status (%s) is 401);非爲登錄訪問時,其爲一個減號;
		%t:服務器收到請求時的時間;
		%r:First line of request,即表示請求報文的首行;記錄了此次請求的“方法”,“URL”以及協議版本;
		%>s:響應狀態碼;
		%b:響應報文的大小,單位是字節;不包括響應報文的http首部;
		%{Referer}i:請求報文中首部“referer”的值;即從哪個頁面中的超鏈接跳轉至當前頁面的;
		%{User-Agent}i:請求報文中首部“User-Agent”的值;即發出請求的應用程序;

PS:具體日誌應用到時候會寫一個關於生產實現apache日誌切割的時候舉例。用到的時候速查上面的常用
選項即可,或者去官網通讀日誌設置文檔。

5.13、基於用戶的訪問認證

認證質詢:
	WWW-Authenticate:響應碼爲401,拒絕客戶端請求,並說明要求客戶端提供賬號和密碼;

認證:
	Authorization:客戶端用戶填入賬號和密碼後再次發送請求報文;認證通過時,則服務器發送響應的資源;
	
	認證方式有兩種:
		basic:明文 
		digest:消息摘要認證

安全域:需要用戶認證後方能訪問的路徑;應該通過名稱對其進行標識,以便於告知用戶認證的原因;

用戶的賬號和密碼存放於何處?
	虛擬賬號:僅用於訪問某服務時用到的認證標識
	
	存儲:
		文本文件;
		SQL數據庫;
		ldap目錄存儲;

定義模板和用戶設置:

basic認證配置示例:
	(1) 定義安全域
		<Directory "">
			Options None
			AllowOverride None
			AuthType Basic
			AuthName "String“
			AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"
			Require  user  username1  username2 ...
		</Directory>
		
		允許賬號文件中的所有用戶登錄訪問:
			Require  valid-user
		
	(2) 提供賬號和密碼存儲(文本文件)
		使用專用命令完成此類文件的創建及用戶管理
			htpasswd  [options]   /PATH/TO/HTTPD_PASSWD_FILE  username 
				-c:自動創建此處指定的文件,因此,僅應該在此文件不存在時使用;
				-m:md5格式加密
				-s: sha格式加密
				-D:刪除指定用戶
				-b:批模式添加用戶 
					htpasswd -b  [options]   /PATH/TO/HTTPD_PASSWD_FILE  username password
				
	另外:基於組賬號進行認證;
		(1) 定義安全域
			<Directory "">
				Options None
				AllowOverride None
				AuthType Basic
				AuthName "String“
				AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"
				AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
				Require  group  grpname1  grpname2 ...
			</Directory>
			
		(2) 創建用戶賬號和組賬號文件;
			
			組文件:每一行定義一個組
				GRP_NAME: username1  username2  ...

示例:

(1) 添加用戶tom和jerry
[root@yanhui_httpd ~]# htpasswd -c /var/www/.yanhui_user tom
New password: 
Re-type new password: 
Adding password for user tom
上面是交互式模式輸入用戶密碼。第一次創建可以是交互式或非交互式。如果要新增用戶,只能使用-b非交互式
批處理創建用戶,用戶名和密碼都顯示在命令行了。在添加一個用戶jerry:
[root@yanhui_httpd ~]# htpasswd -b  /var/www/.yanhui_user jerry jerry123
Adding password for user jerry

我的站點配置信息:
[root@yanhui_httpd ~]# grep -A9 '/var/www/yanhui' /etc/httpd/conf/httpd.conf
<Directory "/var/www/yanhui">
    Options None	#表示沒有特殊選項,不支持索引目錄展開,不支持符號鏈接文件訪問
    AllowOverride None #表示下面的Order,Allow等基於IP的訪問控制指令無效的。
    Order allow,deny
    Allow from all
    AuthType Basic   #認證類型,基本認證
    AuthName "Pleas input Username And Passwd"  #提示字符串
    AuthUserFile "/var/www/.yanhui_user"   #用戶名和密碼驗證的存儲文件
    Require valid-user    #表示允許所有上面用戶和密碼文件中的用戶登錄。
</Directory>

站點目錄資源:
[root@yanhui_httpd ~]# ls -l /var/www/yanhui/
total 16
-rw-r--r-- 1 root centos  805 Dec  9 22:34 fstab
lrwxrwxrwx 1 root root     21 Dec  9 22:40 fstab.html -> /var/www/yanhui/fstab
drwxr-xr-x 2 root root   4096 Dec  9 22:55 images
-rw-r--r-- 1 root root    884 Dec  9 22:34 inittab
-rw-r--r-- 1 root root    310 Dec  9 22:35 patch.png

在這裏插入圖片描述

如果不輸入用戶,就會顯示如下:
在這裏插入圖片描述

輸入tom用戶名和密碼後:
在這裏插入圖片描述

直接在URL中鍵入用戶名和密碼:
格式(schema://username:password@URL)
在這裏插入圖片描述
確認後結果:
在這裏插入圖片描述

PS:基於組的用戶認證,我這裏就不演示了,上面有介紹配置語法模板。

5.14、配置虛擬主機

站點標識: socket
	IP相同,但端口不同;
	IP不同,但端口均爲默認端口;
	FQDN不同;
		請求報文中首部
		Host: www.yanhui.com 
		
有三種實現方案:
	基於ip:
		爲每個虛擬主機準備至少一個ip地址;
	基於port:
		爲每個虛擬主機使用至少一個獨立的port;
	基於FQDN:
		爲每個虛擬主機使用至少一個FQDN;

注意(專用於httpd-2.2):一般虛擬機不要與中心主機混用;因此,要使用虛擬主機,得先禁用'main'主機;
	禁用方法:註釋中心主機的DocumentRoot指令即可;
	
虛擬主機的配置方法:
	<VirtualHost  IP:PORT>
		ServerName FQDN
		DocumentRoot  ""
	</VirtualHost>
	
	其它可用指令:
		ServerAlias:虛擬主機的別名;可多次使用;
		ErrorLog:
		CustomLog:
		<Directory "">
		...
		</Directory>
		Alias
		...

示例:
(1) 基於多個IP的,相同端口的虛擬記住

先配置多個ip地址,這裏我的兩個ip地址爲192.168.56.90和192.168.56.98
[root@yanhui_httpd ~]# ifconfig eth0:0 192.168.56.98/24
[root@yanhui_httpd ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:5A:90:10  
          inet addr:192.168.56.90  Bcast:192.168.56.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe5a:9010/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:16902 errors:0 dropped:0 overruns:0 frame:0
          TX packets:14177 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:3264323 (3.1 MiB)  TX bytes:2406634 (2.2 MiB)

eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:5A:90:10  
          inet addr:192.168.56.98  Bcast:192.168.56.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:150 errors:0 dropped:0 overruns:0 frame:0
          TX packets:150 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:14380 (14.0 KiB)  TX bytes:14380 (14.0 KiB)

我配置的虛擬主機爲:
<VirtualHost 192.168.56.90:80>
    ServerName www.a.com
    DocumentRoot "/data/web/a.com/htdocs"
</VirtualHost>

<VirtualHost 192.168.56.98:80>
    ServerName www.b.com
    DocumentRoot "/data/web/b.com/htdocs"
</VirtualHost>
創建目錄和主頁文件:
[root@yanhui_httpd ~]# httpd -t
Warning: DocumentRoot [/data/web/a.com/htdocs] does not exist
Warning: DocumentRoot [/data/web/b.com/htdocs] does not exist
Syntax OK
[root@yanhui_httpd ~]# mkdir -pv /data/web/{a,b}.com/htdocs
mkdir: created directory `/data/web'
mkdir: created directory `/data/web/a.com'
mkdir: created directory `/data/web/a.com/htdocs'
mkdir: created directory `/data/web/b.com'
mkdir: created directory `/data/web/b.com/htdocs'

[root@yanhui_httpd ~]# echo '<h1>www.a.org</h1>' >/data/web/a.com/htdocs/index.html
[root@yanhui_httpd ~]# echo '<h1>www.b.org</h1>' >/data/web/b.com/htdocs/index.html
[root@yanhui_httpd ~]# cat /data/web/a.com/htdocs/index.html
<h1>www.a.org</h1>
[root@yanhui_httpd ~]# cat /data/web/b.com/htdocs/index.html
<h1>www.b.org</h1>

[root@yanhui_httpd ~]# httpd -t
Syntax OK
[root@yanhui_httpd ~]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

在這裏插入圖片描述

在這裏插入圖片描述

(2) 基於相同IP,不同端口的虛擬主機

<VirtualHost 192.168.56.90:80>
    ServerName www.a.com
    DocumentRoot "/data/web/a.com/htdocs"
</VirtualHost>

<VirtualHost 192.168.56.90:8080>
    ServerName www.b.com
    DocumentRoot "/data/web/b.com/htdocs"
</VirtualHost>
[root@yanhui_httpd ~]# httpd -t
Syntax OK
[root@yanhui_httpd ~]# service httpd reload
Reloading httpd: 

在這裏插入圖片描述

在這裏插入圖片描述

(3) 基於不同的FQDN的虛擬主機
爲了演示,我這裏採用hosts文件映射的方式。
特殊說明:基於FQDN的虛擬主機,在httpd2.2中要啓用以下選項:

啓用前:
[root@yanhui_httpd ~]# grep '^#NameVirtualHost' /etc/httpd/conf/httpd.conf
#NameVirtualHost *:80
[root@yanhui_httpd ~]# vim /etc/httpd/conf/httpd.conf
[root@yanhui_httpd ~]# grep '^#NameVirtualHost' /etc/httpd/conf/httpd.conf
啓用後:
[root@yanhui_httpd ~]# grep '^NameVirtualHost' /etc/httpd/conf/httpd.conf
NameVirtualHost *:80

而且要求,後邊定義的虛擬主機,監聽訪問要與這個配置指令一樣,這裏配置的是*:80,那麼虛擬主機那邊
也要這樣配置。我配置後的虛擬主機如下:
<VirtualHost *:80>
    ServerName www.a.com
    DocumentRoot "/data/web/a.com/htdocs"
</VirtualHost>

<VirtualHost *:80>
    ServerName www.b.com
    DocumentRoot "/data/web/b.com/htdocs"
</VirtualHost>

如果把linux作爲客戶端,可以去配置客戶端的hosts文件,如果是windows瀏覽器,可以配置windows的hosts文件。

windows的hosts文件如下:
在這裏插入圖片描述

windows瀏覽器訪問測試:
在這裏插入圖片描述

在這裏插入圖片描述

linux訪問測試:

[root@yanhui_httpd ~]# tail -n2 /etc/hosts
192.168.56.90 www.a.com
192.168.56.90 www.b.com

[root@yanhui_httpd ~]# elinks -dump www.b.com
                                   www.b.org
[root@yanhui_httpd ~]# elinks -dump www.a.com
                                   www.a.org
elinks可能需要yum安裝一下。

5.15、配置狀態頁面

先要保證模塊有載入。
LoadModule  status_module  modules/mod_status.so

然後按照下面的配置模板配置:
	<Location /server-status>
		SetHandler server-status
		Order allow,deny
		Allow from 192.168
	</Location>
因爲狀態頁面比較重要,建議配合IP的訪問認證或者用戶的訪問認證。只能特殊網段或者特殊的用戶驗證後
才能訪問,這樣做比較安全。我們這裏測試,所以我是基於IP,最終的配置爲:
<Location /server-status>
    SetHandler server-status
    Order allow,deny
    Allow from 192.168
</Location>

在這裏插入圖片描述

5.16、隱藏apache的版本號設置

默認訪問,頁面沒有隱藏版本信息。
在這裏插入圖片描述

加入以下兩行配置:
ServerTokens Prod
ServerSignature Off 
默認值:
[root@yanhui_httpd ~]# grep -E '^ServerTokens|^ServerSignature' /etc/httpd/conf/httpd.conf
ServerTokens OS
ServerSignature On
修改後:
[root@yanhui_httpd ~]# grep -E '^ServerTokens|^ServerSignature' /etc/httpd/conf/httpd.conf
ServerTokens Prod
ServerSignature Off
[root@yanhui_httpd ~]# httpd -t
Syntax OK
[root@yanhui_httpd ~]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

在這裏插入圖片描述

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