Linux運維學習筆記之十二:http協議和www服務

第二十一章 http協議和www服務

一、http協議和www服務基礎

1、HTTP協議簡介

HTTP協議,全稱爲HyperText Transfer Protocol,中文名爲超文本傳輸協議,是互聯網中最常用的一種網絡協議。 HTTP的重要應用之一是WWW服務。設計HTTP協議最初的目的就是提供一種發佈和接收HTML(一種頁面標記語言)頁面的方法。HTTP協議是互聯網上常用的通信協議之一。它有很多的應用,但最流行的就是用於Web瀏覽器和Web服務器之間的通信,即WWW應用或稱Web應用。

2、WWW服務簡介

www服務全稱爲World Wide Web,常稱爲Web,中文譯爲“萬維網”。它是目前互聯網上最受用戶歡迎的信息服務形式。HTTP協議的WWW服務應用的默認端口爲80,另外一個加密的WWW服務應用https的默認端口爲443,主要用於網銀、支付等和錢相關的業務。當今,HTTP服務、WWW服務、Web服務三者的概念已經混淆了,在本文中也視爲相同,都是指當下最常見的網站服務應用。

3、用戶訪問網站流程
(1)第一步:

客戶端用戶在瀏覽器中輸入www.baidu.com網站地址回車後,系統首先會查找系統本地的DNS緩存及hosts文件信息,確認是否存在www.baidu.com對應的域名ip解析記錄如果有就直接獲取IP地址,然後去訪問這個IP地址對應域名www.baidu.com的服務器。一般第一次請求時,DNS緩存是沒有解析記錄的,而hosts文件多在內部臨時測試使用。

(2)第二步:

如果客戶端本地DNS緩存及hosts文件沒有www.baidu.com域名對應的解析記錄,那麼,系統會把瀏覽器的解析請求發送給客戶端本地設置的DNS服務器地址(通常稱此DNS爲LDNS,即local DNS)解析,如果LDNS服務器的本地緩存有對應的解析記錄就會直接返回IP地址給客戶端,如果沒有,則LDNS會負責繼續請求其他的DNS服務器。

(3)第三步:

LDNS從DNS系統的(.)根開始請求對www.baidu.com域名的解析,並針對各個層級的DNS服務器系統進行一系列的查找,最終會查找到baidu.com域名對應的授權DNS服務器,而這個授權DNS服務器正是企業購買域名時用於管理域名解析的服務器,這個授權服務器會有www.baidu.com對應的IP解析記錄。如果此時沒有,就表示企業的域名管理人員沒有爲www.baidu.com域名做解析設置,即網站還沒有架設好。

(4)第四步:

baidu.com域名的授權DNS服務器會把www.baidu.com最終IP解析記錄(例如1.1.1.1)發給LDNS

(5)第五步:

LDNS把來之授權DNS服務器www.baidu.com對應的IP解析記錄發給客戶端瀏覽器,並且他會把該域名和IP對應的解析緩存起來,以便下一次更快的返回相同的解析請求的記錄。這些緩存在指定的時間(DNS TTL 值控制)內不會過期。

(6)第六步:

客戶端瀏覽器獲取了www.baidu.com的對應IP地址,接下來,瀏覽器會請求IP地址對應的網站服務器,網站服務器收到客戶的請求並響應處理(此處的處理可能是數百臺集羣的服務器系統,也可能是一臺雲主機)將客戶請求的內容返回給客戶端瀏覽器。至此,一次訪問瀏覽器的完整過程就完成了。

(7)提示:

上述僅僅是客戶端用戶第一次訪問網站的基本過程,連續訪問後,系統本地和LDNS層級都會有緩存記錄,再訪問時流程就會有些變化,會直接取本地緩存記錄,這樣訪問過程就很快了。

4、HTTP協議請求的工作流程

(1)終端客戶在Web瀏覽器地址欄輸入訪問地址http://www.etiantian.org/index.html。

(2)Web瀏覽器請求DNS服務器把域名www.etiantian.org轉換成Web服務器的IP地址,此處的解析過程就是DNS解析的原理流程,前面已經講過了,此處不再贅述。

(3)Web瀏覽器將端口號(默認是80)從訪問地址(URL)中解析出來。

(4)Web瀏覽器通過解析後的IP地址及端口號與Web服務器之間建立一條TCP連接。

(5)建立TCP連接後,Web瀏覽器向Web服務器發送一條HTTP請求報文。請求報文

(6)Web服務器讀取並響應瀏覽器的請求信息,然後返回一條HTTP響應報文。響應報文除了有html頁面外,還包括對象、對象類型、對象長度等header信息

(7)Web服務器關閉HTTP連接,關閉TCP連接,Web瀏覽器顯示訪問的網站內容到屏幕上。

5、HTTP客戶端

最常見的是Web瀏覽器:IE、Firefox、Chrome等

6、HTTP報文格式
(1)HTTP 請求報文

HTTP 請求報文由請求行、請求頭部、空行 和 請求包體 4 個部分組成,如下圖所示:

a、請求行

請求行由方法字段、URL 字段 和HTTP 協議版本字段 3 個部分組成,他們之間使用空格隔開。常用的 HTTP 請求方法有 GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT;

(i)GET

當客戶端要從服務器中讀取某個資源時,使用GET 方法。GET 方法要求服務器將URL 定位的資源放在響應報文的數據部分,回送給客戶端,即向服務器請求某個資源。使用GET方法時,請求參數和對應的值附加在URL 後面,利用一個問號(“?”)代表URL 的結尾與請求參數的開始,傳遞參數長度受限制。例如,/index.jsp?id=100&op=bind。

(ii)POST

當客戶端給服務器提供信息較多時可以使用POST 方法,POST 方法向服務器提交數據,比如完成表單數據的提交,將數據提交給服務器處理。GET 一般用於獲取/查詢資源信息,POST 會附帶用戶數據,一般用於更新資源信息。POST 方法

b、請求頭部Header(HTTP request header )

將請求參數封裝在HTTP 請求數據中,以名稱/值的形式出現,可以傳輸大量數據;

請求頭部由關鍵字/值對組成,每行一對,關鍵字和值用英文冒號“:”分隔。請求頭部通知服務器有關於客戶端請求的信息,典型的請求頭Header(HTTP request header ) 有:

  User-Agent:產生請求的瀏覽器類型;

  Accept:客戶端可接受的響應內容類型列表;星號 “ * ” 用於按範圍將類型分組,用“ */* ”指示可接受全部類型,用“ type/* ”指示可接受 type 類型的所有子類型;

  Accept-Language:客戶端可接受的自然語言;如gzip,deflate 

  Accept-Encoding:客戶端可接受的編碼壓縮格式;

  Accept-Charset:可接受的應答的字符集;

  Host:請求的主機名,允許多個域名同處一個IP 地址,即虛擬主機;

  connection:連接方式(close 或 keepalive);

   Cookie:存儲於客戶端擴展字段,向同一域名的服務端發送屬於該域的cookie;

c、空行

最後一個請求頭之後是一個空行,發送回車符和換行符,通知服務器以下不再有請求頭;

d、請求包體

請求包體不在 GET 方法中使用,而是在POST 方法中使用。POST 方法適用於需要客戶填寫表單的場合。與請求包體相關的最常使用的是包體類型Content-Type 和包體長度Content-Length;

(2)HTTP 響應報文

HTTP 響應報文由狀態行、響應頭部、空行 和 響應包體 4 個部分組成,如下圖所示:

 

a、狀態行:

狀態行由 HTTP 協議版本字段、狀態碼和狀態碼的描述文本 3 個部分組成,他們之間使用空格隔開;

(i)狀態碼

 狀態碼由三位數字組成,第一位數字表示響應的類型,常用的狀態碼有五大類如下所示:

  1xx:表示服務器已接收了客戶端請求,客戶端可繼續發送請求;

  2xx:表示服務器已成功接收到請求並進行處理;

  3xx:表示服務器要求客戶端重定向;

  4xx:表示客戶端的請求有非法內容;

  5xx:表示服務器未能正常處理客戶端的請求而出現意外錯誤;

(ii)狀態碼描述文本取值

  200 OK:表示客戶端請求成功;

  301 MovedPermanently:表示請求的網頁永久跳轉的新位置

  400 Bad Request:表示客戶端請求有語法錯誤,不能被服務器所理解;

  401 Unauthonzed:表示請求未經授權,該狀態代碼必須與 WWW-Authenticate 報頭域一起使用;

  403 Forbidden:表示服務器收到請求,但是拒絕提供服務,通常會在響應正文中給出不提供服務的原因;

  404 Not Found:請求的資源不存在,例如,輸入了錯誤的URL;

  500 InternalServer Error:表示服務器發生不可預期的錯誤,導致無法完成客戶端的請求;

  502 Bad Gateway:一般是網關服務器請求服務器時,後端服務器沒有按http協議正確返回結果;

  503 ServiceUnavailable:表示服務器當前不能夠處理客戶端請求,一段時間之後,服務器可能會恢復正常;

  504 GatewayTimeout:網關操時;

b、響應頭部Header(response header) 

  Location:Location響應報頭域用於重定向接受者到一個新的位置。例如:客戶端所請求的頁面已不存在原先的位置,爲了讓客戶端重定向到這個頁面新的位置,服務器端可以發回Location響應報頭後使用重定向語句,讓客戶端去訪問新的域名所對應的服務器上的資源;

  Server:Server 響應報頭域包含了服務器用來處理請求的軟件信息及其版本。它和 User-Agent 請求報頭域是相對應的,前者發送服務器端軟件的信息,後者發送客戶端軟件(瀏覽器)和操作系統的信息。如Apache/2.2.6 

  Vary:指示不可緩存的請求頭列表;

  Connection:連接方式;

  對於請求來說:close(告訴 WEB 服務器或者代理服務器,在完成本次請求的響應後,斷開連接,不等待本次連接的後續請求了)。keepalive(告訴WEB服務器或者代理服務器,在完成本次請求的響應後,保持連接,等待本次連接的後續請求);

  對於響應來說:close(連接已經關閉); keepalive(連接保持着,在等待本次連接的後續請求); Keep-Alive:如果瀏覽器請求保持連接,則該頭部表明希望WEB 服務器保持連接多長時間(秒);例如:Keep-Alive:300;

WWW-Authenticate:WWW-Authenticate響應報頭域必須被包含在401 (未授權的)響應消息中,這個報頭域和前面講到的Authorization 請求報頭域是相關的,當客戶端收到 401 響應消息,就要決定是否請求服務器對其進行驗證。如果要求服務器對其進行驗證,就可以發送一個包含了Authorization 報頭域的請求;
  Date 服務器端時間 
  Etag 文件標識符 
  Content-Encoding傳送啓用了GZIP壓縮 gzip 
  Content-Length 內容長度 
  Content-Type 內容類型

c、空行

最後一個響應頭部之後是一個空行,發送回車符和換行符,通知服務器以下不再有響應頭部。

d、響應包體

服務器返回給客戶端的文本信息;

(3)示例

a、下載網頁

wget www.baidu.com

b、查看網頁代碼

curl www.baidu.com

c、獲取網頁響應報文頭

curl -I www.baidu.com

HTTP/1.1 200 OK

Server: bfe/1.0.8.18

Date: Mon, 27 Feb 2017 14:41:56 GMT

Content-Type: text/html

Content-Length: 277

Last-Modified: Mon, 13 Jun 2016 02:50:33 GMT

Connection: Keep-Alive

ETag: "575e1f79-115"

Cache-Control: private, no-cache, no-store, proxy-revalidate,no-transform

Pragma: no-cache

Accept-Ranges: bytes

7、網頁分類及特點
(1)靜態網頁

a、每個靜態網頁都有一個因定的URL,且URL一般以html、htm、shtml等常見後綴,而且地址中不含"?"或"&"。

b、靜態網頁一經發布,是實實在在保存在服務器上的文件,每個靜態網頁對應一個獨立的文件。

c、靜態網頁的內容相對穩定,容易補充搜索引擎收錄。

d、靜態網頁沒有數據庫支持,在製作和維護方面工作量較大,當網站信息量很大時,完全依靠靜態網頁製作方式比較困難。

e、靜態網頁的交互性較差,在功能方面有很大限制。

f、靜態網頁是在客戶端解析,效率高。並且服務器不進行解析,直接返回數據,所以可以接受更多的併發訪問。

(2)動態網頁

a、程序在服務端解析,一般以數據庫爲基礎,可以大量的和用戶交互

b、URL地址後綴一般爲jsp、asp、aspx、do、cgi、php、perl等,並常伴隨"?"或"&"。

c、架構設計要優化好(系統架構師和程序架構師的職責)。動態網頁的效率很差,併發也很低,靜態:動態比一般在10:1,所以儘可能的轉換成靜態網頁提供服務。

(3)僞靜態網頁

a、將動態網頁僞裝成靜態網頁

b、目的是便於搜索引擎招錄,提升用戶訪問量及用戶體驗

c、由於僅僅是僞裝,實際上還是動態,性能沒有提升,但因轉換而消耗資源,因此性能反而下降

d、儘可能轉換成真正的靜態頁面,除非併發量不是很大。可以用rewrite實現僞靜態,rewrite是一個模塊,一般web服務器都支持

8、WEB架構優化方案

由於靜態程序在客戶端解析,大大降低了服務器端的壓力,因此解析效率更高。在實際高併發網站架構中,可以考慮把用戶請求的數據解析後存成靜態文件放於磁盤中或放於內存中。來降低動態服務器的壓力,從而提升用戶體驗。

高併發網站架構從動態轉靜態不用業務產品實現的例子:

(1)門戶新聞業務(一旦發佈完成,幾乎不會改動)

對於新聞業務靜態化相對比較簡單,在發佈新聞時就可以生成靜態文件,然後把靜態內容同步到所有服務器節點上,提供訪問。

(2)視頻網站業務(一旦發佈完成,幾乎不會改動)

用戶上傳視頻後,需經歷審覈、轉碼的過程,大概1-2小時,審覈-轉碼-推送(同步到全國所有CDN節點)。

(3)blog/bbs/sns/微博社區業務/電商(淘寶、京東等)(用戶發佈後,可能會隨時更新)

一般使異步、消息中間件、消息隊列

見參考博文11:淺談千萬級PV/IP規模高性能高併發網站架構。

9、PV、IP和UV
(1)IP(獨立IP數)

IP可以理解爲獨立IP的訪問用戶,指1天內使用不同IP地址的用戶訪問網站的數量,同一IP無論訪問了幾個頁面,獨立IP數均爲1。但是假如說兩臺機器訪問而使用的是同一個IP,那麼只能算是一個IP的訪問。

使用獨立IP數來度量網站訪問量,不是很精確。因爲國內的上網多數都時NAT上網的,一個獨立IP背後可能爲數十上百個客戶端訪問。

(2)PV(page view,頁面瀏覽量或點擊量)

PV通常是衡量一個網絡新聞頻道或網站甚至一條網絡新聞的主要指標。用戶每1次對網站中的每個網頁訪問均被記錄1次。網頁瀏覽數是評價網站流量最常用的指標之一,簡稱爲PV。監測網站PV的變化趨勢和分析其變化原因是很多站長定期要做的工作。 Page Views中的Page一般是指普通的html網頁,也包含php、jsp等動態產生的html內容。來自瀏覽器的一次html內容請求會被看作一個PV,逐漸累計成爲PV總數。

PV是網站被訪問的頁面數據量的一個指標,但沒法估算有多少人訪問。

(3)UV(unique visitor,獨立訪客數)

UV指訪問某個站點或點擊某個網頁的不同IP地址的人數。但統計的是客戶端(PC或移動端)的數量。在同一天內,UV只記錄第一次進入網站的具有獨立IP的訪問者,在同一天內再次訪問該網站則不計數。UV提供了一定時間內不同觀衆數量的統計指標,而沒有反應出網站的全面活動。通過IP和cookie是判斷UV值的兩種方式。

  用Cookie分析UV值:

當客戶端第一次訪問某個網站服務器的時候,網站服務器會給這個客戶端的電腦發出一個Cookie,通常放在這個客戶端電腦的C盤當中。在這個Cookie中會分配一個獨一無二的編號,這其中會記錄一些訪問服務器的信息,如訪問時間,訪問了哪些頁面等等。當你下次再訪問這個服務器的時候,服務器就可以直接從你的電腦中找到上一次放進去的Cookie文件,並且對其進行一些更新,但那個獨一無二的編號是不會變的。

(4)PV、IP和UV的關係

統計的IP數量要比網站實際訪問的IP數量小得多

PV高不一定代表來訪者多,PV與來訪者數量成正比。但PV並不直接決定頁面的真實來訪者數量。PV多,則用戶訪問網站頁面的總數量多,服務器壓力大。

IP和UV之間的數據不會有太大的差異,通常UV量和比IP量高出一點,每個UV相對於每個IP更準確地對應一個實際的瀏覽者。

a、UV大於IP

這種情況就是在網吧、學校、公司等,公用相同IP的場所中不同的用戶,或者多種不同瀏覽器訪問您網站,那麼UV數會大於IP數。

b、UV小於IP

在家庭中大多數電腦使用ADSL撥號上網,所以同一個用戶在家裏不同時間訪問您網站時,IP可能會不同,因爲它會根據時間變動IP,即動態的IP地址,但是實際訪客數唯一,便會出現UV數小於IP數。

(5)併發的理解

老男孩:單位時間內,服務器能夠同時處理的最大連接數(有的請求1秒結束,有的請求可能10秒才結束)

網上:Concurrent User =Request Per Second +Simultaneous Browser connections + Thinking Time

Concurrent User:網站併發用戶數

Request Per Second:每秒請求數(吞吐量)

Simultaneous Browser connections:併發連接數

Thinking Time:用戶平均思考時間

(6)查看常見網站排名與IP-PV量

a、查詢網站

http://alexa.chinaz.com

b、相關網站的IP和PV

網站

IP(萬)

PV(萬)

服務器臺數(大概、猜測)

www.51cto.com

60

147

30

www.chinaunix.net

25

40

10

www.ganji.com

9

62

200

www.58.com

48

576

300-400

www.weibo.com

1830

8308

1000多

www.jd.com

1935

11706

500-1000?

www.taobao.com

3577

15919

10000

二、http服務軟件分類及企業實戰用途介紹

1、http服務軟件排名

查看網站:https://w3techs.com/technologies/overview/web_server/all

 

W3Techs.com,2 March 2017

Apache

50.4%

Nginx

32.7%

Microsoft-IIS

11.5%

LiteSpeed

2.5%

Google Servers

1.3%

Tomcat

0.6%

IdeaWebServer

0.3%

Node.js

0.3%

Apache Traffic Server

0.3%

Tengine

0.2%

Cowboy

0.1%

Lighttpd

0.1%

IBM Servers

0.1%

Oracle Servers

0.1%

2、當前主流web服務說明

(1)靜態服務:

a、apach:中小型靜態WEB服務的主流,WEB服務器中的老大哥

b、nginx:大型新興網站靜態WEBe服務主流

d、lighttpd:不溫不火,有逐漸被淘汰的意味,社區不活躍,但靜態效率高

 (2)動態服務:

a、IIS:微軟WEB服務器,支持asp、aspx

b、tomcat:中小企業動態WEB服務的主流,互聯網java容器主流

c、resin:大型動態WEB服務的主流,互聯網java容器主流(百度使用)

d、php(fcgi):php程序的解析容器。php在配合apache時,不是守護進程,而是以模塊的形式(mod_php5.so),配合nginx和lighttpd時,php是以守護進程模式(FCGI)

三、Linux系統軟件包的安裝方式

1、源碼編譯

(1)特點是比較靈活,只編譯想要的參數

(2)中小企業常用

2、yum或rpm方式安裝

(1)特點是簡單、方便,便不夠靈活。

(2)功能和使用情況考慮:訪問量小或內部使用時,多用yum installhttpd -y

(3)方便性考慮:追求方便時,可以用yum

(4)維護成本考慮:服務器數量很大時,用yuma或rpm

3、高級安裝:結合編譯和yum/rpm的雙重優點

通過源碼來製作成符合自已的rpm包,放到自已的yum倉庫裏,再在全網通過yum實現批量部署、管理、升級。但此方法有難度,比較複雜。

參考博文注13:rpm包製作介紹實戰操作講解http://oldboy.blog.51cto.com/blog/2561410/1121745

參考博文14:yum源及yum倉庫搭建http://oldboy.blog.51cto.com/blog/2561410/1126453

四、Apache安裝實戰

1、下載

http://mirror.bit.edu.cn/apache/httpd/httpd-2.2.27.tar.gz

http://mirrors.cnnic.cn/apache/httpd/httpd-2.2.27.tar.gz

2、卸載系統自帶Apache

rpm -e --nodeps httpd-2.2.15-53.el6.x86_64

3、配置參數說明
(1)參數說明

--prefix=/application/apache2.2.27 \     #指定安裝路徑

--enable-deflate \                           #壓縮

--enable-expires \                           #指定過期時間

--enable-headers \                           #激活header

--enable-moules=most \                       #激活大多數模塊

--enable-so \                                #支持DSO模式

--with-mpm=worker \                          #指定工作模式爲worker

--enable-rewrite                             #僞靜態

(2)worker和prefork說明:

with-mpm是指定服務器的工作模式,一般分爲worker和prefork(默認)兩種模式。worker模式是生成一個主進程和多個線程,由線程對外提供服務,缺點是如果一個線程崩潰,整個進程就會連同其它線程一起死掉,服務的穩定性不如prefork模式。prefork是生成多個進程,由進程對外提供服務。進程方式安全,但費資源。

4、安裝
(1)解壓並進入目錄

tar zxf httpd-2.2.27.tar.gz

cd /wddt/tools/ httpd-2.2.27

(2)配置參數

./configure \

--prefix=/application/apache2.2.27 \

--enable-deflate \

--enable-expires \

--enable-headers \

--enable-moules=most \

--enable-so \

--with-mpm=worker \

--enable-rewrite

(3)檢查是否有錯

echo $?

(4)編譯

make

(5)安裝

make install

(6)創建軟連接

ln -s /application/apache2.2.27/ /application/apache

(7)啓動Apache服務

a、檢查語法

/application/apache/bin/apachectl -t

httpd: Could not reliably determine the server's fully qualifieddomain name, using 127.0.0.1 for ServerName

Syntax OK

b、啓動服務

方法一:

/application/apache/bin/apachectl start

httpd: Could not reliably determine the server's fully qualifieddomain name, using 127.0.0.1 for ServerName  #這個提示不用管。不影響使用,解決方法見下面的http協議和www服務實戰進階之五FQDN(fully qualified domain name)問題的解決

方法二:

/application/apache/bin/httpd -k start

c、檢查服務端口

lsof -i :80

COMMAND   PID   USER  FD   TYPE  DEVICE SIZE/OFF NODE NAME

httpd   11026   root   4u  IPv6 1834512      0t0 TCP *:http (LISTEN)

httpd   11028 daemon    4u IPv6 1834512      0t0  TCP *:http (LISTEN)

httpd   11029 daemon    4u IPv6 1834512      0t0  TCP *:http (LISTEN)

httpd   11030 daemon    4u IPv6 1834512      0t0  TCP *:http (LISTEN)

d、檢查服務進程

ps -ef | grep httpd

root     11026     1  016:31 ?  00:00:00/application/apache2.2.27/bin/httpd -k start

daemon   11027 11026  0 16:31 ? 00:00:00 /application/apache2.2.27/bin/httpd -k start

daemon   11028 11026  0 16:31 ? 00:00:00 /application/apache2.2.27/bin/httpd -k start

daemon   11029 11026  0 16:31 ? 00:00:00 /application/apache2.2.27/bin/httpd -k start

daemon   11030 11026  0 16:31  00:00:00 /application/apache2.2.27/bin/httpd -k start

e、其它檢查

wget 192.168.58.238

curl 192.168.58.238

curl -I 192.168.58.238

5、查看幫助
(1)查看幫助

/application/apache/bin/apachectl

Usage: /application/apache2.2.27/bin/httpd [-D name] [-d directory][-f file]

                                           [-C"directive"] [-c "directive"]

                                           [-kstart|restart|graceful|graceful-stop|stop]

                                           [-v][-V] [-h] [-l] [-L] [-t] [-T] [-S]

graceful:表示優雅的重新啓動

Options:

  -D name            : define a name for use in<IfDefine name> directives

  -d directory       : specify an alternate initialServerRoot

  -f file            : specify an alternateServerConfigFile

  -C"directive"     : processdirective before reading config files

  -c"directive"     : processdirective after reading config files

  -e level           : show startup errors of level (seeLogLevel)

  -E file            : log startup errors to file

  -v                 : show version number

  -V                 : show compile settings

  -h                 : list available command lineoptions (this page)

  -l                 : list compiled in modules

  -L                 : list available configurationdirectives

  -t -D DUMP_VHOSTS  : show parsed settings (currently only vhostsettings)

  -S                 : a synonym for -t -DDUMP_VHOSTS

  -t -D DUMP_MODULES : showall loaded modules

  -M                 : a synonym for -t -DDUMP_MODULES

  -t                 : run syntax check for configfiles

  -T                 : start withoutDocumentRoot(s) check

(2)-l參數,查看安裝的模塊

/application/apache/bin/apachectl -l | egrep"_so|_rewrite|header|expire|deflate"

  mod_deflate.c

  mod_expires.c

  mod_headers.c

  mod_rewrite.c

  mod_so.c

(3)-M參數,查看安裝的模塊類型(靜態、動態)

/application/apache/bin/apachectl -M

(4)查看Apache默認的網站根目錄

grep -i documentroot httpd.conf

DocumentRoot "/application/apache2.2.27/htdocs"

(5)查看Apache默認的網站主頁

grep  DirectoryIndexhttpd.conf

DirectoryIndex index.html

五、Apache配置說明

1、Apache主要目錄結構
(1)bin目錄

a、ab:Apache Http服務器性能測試工具,簡單、易用

b、apachectl:Apache的啓動命令,腳本。

c、apxs:是一個爲Apache Http服務器編譯和安裝擴展模塊的工具,在進行DSO方式編譯模塊時會用到。

d、htcacheclean:清理磁盤緩衝區的命令,需要在編譯時指定相關參數才能用,一般很少用

e、htpasswd:建立和更新基本認證文件。如配置nagios等監控服務時會用到

f、httpd:爲Apache 的控制命令程序,apachectl執行時會調用httpd

g、rotatelogs:Apache自帶的日誌輪詢命令。一般可用cronolog替代。

(2)conf目錄

a、extra:擴展的Apache配置文件目錄,做爲httpd.conf 的子配置文件所在的目錄。

b、httpd.conf:Apache的主配置文件。

c、magic

d、mime.types

e、original

(3)htdocs目錄:是Apache默認站點目錄。
(4)logs目錄:是Apache默認日誌目錄,包括錯誤日誌及訪問日誌。

a、access_log:默認訪問日誌文件

b、error_log:默認錯誤日誌文件

c、http.pid:httpd的pid文件,http進程啓動後,會把所有進程的ID號寫到此文件

(5)modules目錄:是Apache的模塊目錄。如php、memcache等模塊編譯後都放在該目錄下
2、主配置文件httpd.conf說明
(1)導出有效主配置

grep -Ev "^#|^   #|^$" httpd.conf > httpd.conf.ori

(2)查看有效主配置

cat httpd.conf.ori

ServerRoot "/application/apache2.2.27"

Listen 80

<IfModule !mpm_netware_module>

<IfModule !mpm_winnt_module>

User daemon

Group daemon

</IfModule>

</IfModule>

ServerAdmin [email protected]

DocumentRoot "/application/apache2.2.27/htdocs"

<Directory />

    Options FollowSymLinks

    AllowOverride None

    Order deny,allow

    Deny from all

</Directory>

<Directory "/application/apache2.2.27/htdocs">

    Options Indexes FollowSymLinks

    AllowOverride None

    Order allow,deny

    Allow from all

</Directory>

<IfModule dir_module>

    DirectoryIndex index.html

</IfModule>

<FilesMatch "^\.ht">

    Order allow,deny

    Deny from all

    Satisfy All

</FilesMatch>

ErrorLog "logs/error_log"

LogLevel warn

<IfModule log_config_module>

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

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

    <IfModulelogio_module>

      # You need to enablemod_logio.c to use %I and %O

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

    </IfModule>

    CustomLog"logs/access_log" common

</IfModule>

<IfModule alias_module>

(3)有效主配置說明

a、ServerRoot"/application/apache2.2.27":服務的根目錄

b、Listen 80:監聽的端口,不寫IP,表示默認監聽本機所有配置的IP地址

c、<IfModule 。。。>:模塊的開頭

d、User daemon和Group daemon:表示默認編譯和安裝的用戶爲daemon

e、[email protected]:表示管理員的Email,當網站出問題時,該Email會在頁面顯示

f、DocumentRoot"/application/apache2.2.27/htdocs":默認站點目錄

g、<Directory 。。。>:表示權限配置

(i)對網站根目錄進行權限配置

<Directory />:對網站根目錄進行權限配置

    Options FollowSymLinks:允許帶符號連接

    AllowOverride None:禁止相關功能,如重載等功能

    Order deny,allow:表示先檢查禁止,沒有禁止的全部允許。deny和allow之間只能有一個逗號

    Deny from all:表示禁止全部訪問

</Directory>

(ii)對站點目錄進行權限配置.每個新增站點都必須要配置

<Directory "/application/apache2.2.27/htdocs">:對指定站點目錄進行權限配置

    Options IndexesFollowSymLinks:Indexes表示允許展示目錄結構,有安全風險,要禁止,去掉或在前面加上減號“-”:-Indexes。下載目錄可以展示,但一般服務不允許。

    AllowOverride None

    Order allow,deny:表示先檢查允許,沒有允許的全部禁止

    Allow from all:表示允許全部訪問

</Directory>

h、<IfModule dir_module>

     DirectoryIndex index.html:指定主頁

   </IfModule>

i、<FilesMatch "^\.ht">:表示對以“.ht”開頭的文件進行指定的處理

    Order allow,deny

    Deny from all

    Satisfy All

</FilesMatch>

j、ErrorLog "logs/error_log":錯誤日誌配置

k、LogLevel warn:日誌的級別

l、<IfModule log_config_module>:訪問日誌的類型,記錄到日誌文件中的內容和格式

   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>

     # You need to enable mod_logio.c to use %I and %O

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

   </IfModule>

    CustomLog"logs/access_log" common

</IfModule>

<IfModule alias_module>

3、擴展配置文件說明
(1)重點配置文件:httpd-vhosts.conf和httpd-mpm.conf
(2)需瞭解的配置文件:httpd-default.conf
(3)httpd-vhosts.conf配置說明

a、NameVirtualHost*:80 :基於域名的虛擬主機。*表示監聽本機所有域名或IP,80表示要監聽80端口

b、<VirtualHost*:80>:表示虛擬主機的配置,如果配置多個虛擬主機,就有多個該配置

<VirtualHost *:80>

    ServerAdmin :管理員郵箱

    DocumentRoot :網站根目錄

    ServerName :域名

    ServerAlias :域名的別名

    ErrorLog  :錯誤日誌

    CustomLog  :訪問日誌 common

</VirtualHost>

c、示例

<VirtualHost *:80>

    [email protected]

    DocumentRoot"/application/apache2.2.27/docs/dummy-host.example.com"

    ServerNamedummy-host.example.com

    ServerAliaswww.dummy-host.example.com

    ErrorLog"logs/dummy-host.example.com-error_log"

    CustomLog"logs/dummy-host.example.com-access_log" common

</VirtualHost>

(4)httpd-mpm.conf配置說明

a、PidFile"logs/httpd.pid:指定pid文件

<IfModule !mpm_netware_module>

    PidFile"logs/httpd.pid"

</IfModule>

b、LockFile"logs/accept.lock":指定lock文件

<IfModule !mpm_netware_module>

     LockFile"logs/accept.lock"

</IfModule>

c、prefork模式配置:<IfModule mpm_prefork_module>(默認模式)

由於安裝時指定了work模式,所以該配置可以不配

<IfModule mpm_prefork_module>

    StartServers          5

    MinSpareServers       5

    MaxSpareServers      10

    MaxClients          150

    MaxRequestsPerChild   0

</IfModule>

d、work模式配置:<IfModule mpm_worker_module>

<IfModule mpm_worker_module>

    StartServers          2

    MaxClients          150

    MinSpareThreads      25

    MaxSpareThreads      75

    ThreadsPerChild      25

    MaxRequestsPerChild   0

</IfModule>

(5)httpd-default.conf配置說明

a、超時設置:Timeout 300

b、保持連接狀態設置:KeepAlive On

c、保持最大連接請求設置:MaxKeepAliveRequests 100

d、同一連接上等待下一個請求的時間設置:KeepAliveTimeout 5

e、設置僞靜態的語法:AccessFileName .htaccess

f、隱藏Apache版信息:

ServerTokens Full

ServerSignature On

六、http協議和www服務實戰進階

1、虛擬主機分類

虛擬主機是在同一http服務下部署多個站點,每個站點都使用不同的域名和站點目錄,或不同IP和端口。也就是一個http服務配置多個站點。

(1)基於域名的虛擬主機

(2)基於端口的虛擬主機

(3)基於IP的虛擬主機

2、配置基於域名的虛擬主機
(1)需求

域名

目錄

www.abc.org

/var/html/www

blog.abc.org

/var/html/blog

bbs.abc.org

/var/html/bbs

(2)創建目錄

mkdir /var/html/{www,blog,bbs} -p

(3)創建主頁文件index.html

for name in www blog bbs;do echo"http://$name.abc.org">/var/html/$name/index.html;done

for name in www blog bbs;do cat /var/html/$name/index.html;done                       

http://www.abc.org

http://blog.abc.org

http://bbs.abc.org

(4)配置httpd-vhosts.conf 文件

vi /application/apache/conf/extra/httpd-vhosts.conf

<VirtualHost *:80>

    ServerAdmin [email protected]

    DocumentRoot"/var/html/www"

    ServerName www.abc.org

    ServerAlias abc.org

    ErrorLog"logs/www-error-log"

    CustomLog"logs/www-access-log" common

</VirtualHost>

 

<VirtualHost *:80>

    ServerAdmin [email protected]

    DocumentRoot"/var/html/blog"

    ServerName blog.abc.org

    ErrorLog"logs/blog-error-log"

    CustomLog "logs/blog-access-log"common

</VirtualHost>

 

<VirtualHost *:80>

    ServerAdmin [email protected]

    DocumentRoot"/var/html/bbs"

    ServerName bbs.abc.org

    ErrorLog"logs/bbs-error-log"

    CustomLog"logs/bbs-access-log" common

</VirtualHost>

(5)配置主配置文件httpd.conf

加載相關擴展配置文件httpd-vhosts.conf、httpd-mpm.conf,將主配置文件中前面的“#”號去掉。

vi /application/apache/conf/httpd.conf  

# Server-pool management (MPM specific)

Include conf/extra/httpd-mpm.conf

# Virtual hosts

Include conf/extra/httpd-vhosts.conf

(6)檢查語法

/application/apache/bin/apachectl –t

(7)平滑重啓Apache

/application/apache/bin/apachectl graceful

(8)本地配置域名解析:修改客戶端hosts文件

192.168.1.5 www.abc.org blog.abc.org bbs.abc.org

(9)檢查本地配置域名解析是否配好

ping www.abc.org

ping blog.abc.org

ping bbs.abc.org

(10)瀏覽器訪問相關頁面,報403錯:禁止訪問

Forbidden

You don't have permission to access / on this server.

(11)報403錯原因

Apache的主配置文件httpd.conf 中沒有配置站點目錄的訪問權限,程序不能訪問/var/html/下的目錄和文件。

(12)修改httpd.conf文件,配置站點目錄訪問權限

vi httpd.conf

#在httpd.conf文件最後添加如下代碼

<Directory "/var/html">

    Options FollowSymLinks

    AllowOverride None

    Order allow,deny

    Allow from all

</Directory>

(13)重啓Apache

/application/apache/bin/apachectl graceful

(14)瀏覽器訪問相關頁面,成功

http://www.abc.org

http://blog.abc.org

http://bbs.abc.org

3、配置基於端口的虛擬主機
(1)修改httpd.conf文件,配置監聽端口

在Listen 80下面新增如下代碼:

Listen 8000

Listen 9000

(2)修改擴展配置文件httpd-vhosts文件,配置相關監聽端口

(i)在NameVirtualHost *:80下面新增如下代碼:

NameVirtualHost *:8000

NameVirtualHost *:9000

(ii)將blog和bbs站點監聽端口改爲如下:

<VirtualHost *:8000>

    ServerAdmin [email protected]

    DocumentRoot"/var/html/blog"

    ServerName blog.abc.org

    ErrorLog"logs/blog-error-log"

    CustomLog"logs/blog-access-log" common

</VirtualHost>

 

<VirtualHost *:9000>

    ServerAdmin [email protected]

    DocumentRoot "/var/html/bbs"

    ServerName bbs.abc.org

    ErrorLog"logs/bbs-error-log"

    CustomLog"logs/bbs-access-log" common

</VirtualHost>

(3)重啓Apache

/application/apache/bin/apachectl graceful

(4)瀏覽器訪問相關頁面,成功

http://www.abc.org

http://blog.abc.org:8000

http://bbs.abc.org:9000

4、配置基於IP的虛擬主機
(1)爲eth0臨時配置一個新IP

ifconfig eth0:0 192.168.158.99/24 up

(2)檢查

ifconfig

ping 192.168.158.99

(3)修改擴展配置文件httpd-vhosts文件,配置相關IP

vi /application/apache/conf/extra/httpd-vhosts.conf

#註銷下面代碼

#NameVirtualHost *:80

#NameVirtualHost *:8000

#NameVirtualHost *:9000

#修改下面代碼

<VirtualHost 192.168.1.5:80>

    ServerAdmin [email protected]

    DocumentRoot"/var/html/www"

    ServerName 192.168.1.5

    ServerAlias abc.org

    ErrorLog"logs/www-error-log"

    CustomLog"logs/www-access-log" common

</VirtualHost>

 

<VirtualHost 192.168.158.99:80>

    ServerAdmin [email protected]

    DocumentRoot"/var/html/blog"

    ServerName 192.168.158.99

    ErrorLog"logs/blog-error-log"

    CustomLog"logs/blog-access-log" common

</VirtualHost>

(4)檢查語法

/application/apache/bin/apachectl –t

(5)平滑重啓Apache

/application/apache/bin/apachectl graceful

(6)瀏覽器訪問相關頁面,成功

http://192.168.1.5

http:// 192.168.158.199

5、關於FQDN(fully qualified domain name)問題的解決

Apache每次在啓動或重啓時,總是報一外FQDN的錯誤,雖不影響使用,但總是礙眼。具體錯誤如下:httpd: Could notreliably determine the server's fully qualified domain name, using 127.0.0.1for ServerName。意思是Apache找不到完成的QDN,所以用12.0.0.1代替。

解決方法:在Apache的主配置文件httpd.conf中添加一行ServerName 127.0.0.1:80

七、Apache日誌

1、Apache日誌格式說明
(1)通用日誌格式(Common Log Format)

擴展配置文件httpd-vhosts中,配置如下

<VirtualHost 192.168.158.99:80>

    ServerAdmin [email protected]

    DocumentRoot"/var/html/blog"

    ServerName 192.168.158.99

    ErrorLog"logs/blog-error-log"

    CustomLog"logs/blog-access-log" common

</VirtualHost>

(2)組合日誌格式(Combined Log Format)

擴展配置文件httpd-vhosts中,配置如下

<VirtualHost 192.168.158.99:80>

    ServerAdmin [email protected]

    DocumentRoot"/var/html/blog"

    ServerName 192.168.158.99

    ErrorLog"logs/blog-error-log"

    CustomLog"logs/blog-access-log" combined

</VirtualHost>

(3)日誌格式在主配置文件httpd.conf中可以修改

<IfModule log_config_module>

    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>

      # You need to enablemod_logio.c to use %I and %O

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

    </IfModule>

    CustomLog"logs/access_log" common

</IfModule>

(4)Apache日誌輪詢工具

a、系統自帶的日誌輪詢命令rotatelogs。是 Apache 2.2 中自帶的管道日誌程序

b、生產環境常用的日誌輪詢工具cronolog

2、配置日誌輪詢工具cronolog
(1)下載(打不開,後從Chinaunix下載)

wget http://cronolog.org/download/cronolog-1.6.2.tar.gz(打不開)

wget http://down1.chinaunix.net/distfiles/cronolog-1.6.2.tar.gzChinaunix

(2)解壓並安裝

cd /wddg/tools

tar zxf cronolog-1.6.2.tar.gz

cd cronolog-1.6.2

./configure

make

make install

(3)查看安裝目錄

ll /usr/local/sbin/cronolog

-rwxr-xr-x 1 root root 33388 Feb 23 09:57 /usr/local/sbin/cronolog

(4)配置cronolog

a、一定要使用全路徑,否則有時會出錯,命令路徑前還有一個豎線“|”

b、cronolog輪詢格式

(i)按小時(生產環境常見用法)

CustomLog "|/usr/local/sbin/cronolog /app/logs/access_blog_%Y%m%d%H.log"combined

(ii)按天(生產環境常見用法)

CustomLog "|/usr/local/sbin/cronolog/app/logs/access_blog_%Y%m%d.log" combined

(iii)按周(生產環境常見用法)

CustomLog "|/usr/local/sbin/cronolog/app/logs/access_blog_%w.log" combined

CustomLog "|/usr/local/sbin/cronolog/app/logs/%w/access_blog.log" combined

(iv)按月(生產環境不常見用法)

CustomLog "|/usr/local/sbin/cronolog/app/logs/access_blog_%Y%m.log" combined

c、修改擴展配置文件httpd-vhosts,配置如下

<VirtualHost 192.168.158.99:80>

    ServerAdmin [email protected]

    DocumentRoot"/var/html/blog"

    ServerName 192.168.158.99

    ErrorLog"logs/blog-error-log"

CustomLog"|/usr/local/sbin/cronolog /application/apache/

logs/access_blog_%Y%m%d.log"combined

</VirtualHost>

(5)訪問blog,並查看日誌生成情況

http://192.168.158.99

ll /application/apache/logs

-rw-r--r-- 1 root   root  392 Feb 23 10:18 access_blog_20170223.log

cat access_blog_20170223.log

192.168.158.111 - - [23/Feb/2017:10:18:42 +0800] "GET /HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2824.2 Safari/537.36"

192.168.158.111 - - [23/Feb/2017:10:18:42 +0800] "GET/favicon.ico HTTP/1.1" 404 209 "http://192.168.158.99/""Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/54.0.2824.2 Safari/537.36"

3、系統自帶的日誌輪詢命令rotatelogs(不常用)
(1)語法格式

rotatelogs [-l] logfile [rotationtime [offset]] | [filesizeM]

(2)選項

-l:使用本地時間代替GMT時間作爲時間基準。注意:在一個改變GMT偏移量(比如夏令時)的環境中使用-l會導致不可預料的結果。

logfile:它加上基準名就是日誌文件名。如果logfile中包含”%”,則它會被視爲用於strftime()的格式字符串;否則它會被自動加上以秒爲單位的”.nnnnnnnnnn”後綴。這兩種格式都表示新的日誌開始使用的時間。

rotationtime:日誌文件滾動的以秒爲單位的間隔時間。

offset:相對於UTC的時差的分鐘數。如果省略,則假定爲”0″並使用UTC時間。比如,要指定UTC時差爲”-5小時”的地區的當地時間,則此參數應爲”-300″。

filesizeM:指定以filesizeM文件大小滾動,而不是按照時間或時差滾動。

(3)使用方式:擴展配置文件httpd-vhosts.conf中修改指定站點的日誌

ErrorLog "|/application/apache/bin/rotatelogs -llogs/error_%Y%m%d.log 86400"

CustomLog "|/application/apache/bin/rotatelogs–l logs/access_%Y%m%d.log 86400" combined

(4)測試(Apache允許同一類型日誌配置多個日誌文件)

vi /application/apache/conf/extra/httpd-vhosts.conf

<VirtualHost 192.168.158.99:80>

   ServerAdmin [email protected]

   DocumentRoot "/var/html/blog"

   ServerName 192.168.158.99

   ErrorLog "logs/blog-error-log"

CustomLog"|/usr/local/sbin/cronolog /application/apache/logs/

access_blog_%Y%m%d.log"combined

CustomLog "|/application/apache/bin/rotatelogs/application/apache/logs/

access_blogrotatelogs_%Y%m%d%H%M.log 86400"combined

</VirtualHost>

(5)訪問blog,並查看日誌生成情況

http://192.168.158.99

ll /application/apache/logs

-rw-r--r-- 1 root   root 1321 Feb 23 12:45access_blog_20170223.log

-rw-r--r-- 1 root   root 929 Feb 23 12:45 access_blogrotatelogs_201702230000.log

4、通過定時任務,來實現日誌輪詢
(1)通過定時任務在每天0點將Apache的日誌重命名

cd /application/apache/logs

mv www-access_log www-access_$(date+%F)_log

(2)平滑重啓Apache,重新生成一個新日誌文件

/application/apache/bin/apachectlgraceful

5、Apache日誌中不記錄指定元素日誌

當計算日誌PV時,一般不希望統計圖片元素、css、js等元素週期律的日誌。因爲打開一個頁面纔是一個PV,同時服務器也不希望記錄來自前端負載均衡健康檢查的無用日誌。這時,整個配置就需要mod_setenvif模塊的支持,不記錄指定的元素日誌。

(1)示例1:不記錄圖片的日誌

vi/application/apache/conf/extra/httpd-vhosts.conf

<VirtualHost *:9000>

   ServerAdmin [email protected]

   DocumentRoot "/var/html/bbs"

ServerNamebbs.abc.org

<FilesMatch "\.(css|js|gif|jpg|ico|swf)">

SetEnv IMAG 1

</FilesMatch >

   ErrorLog "logs/bbs-error-log"

   CustomLog "logs/bbs-access-log" common env=!IMAG

</VirtualHost>

(2)示例2:不記錄負載均衡健康檢查的日誌

vi/application/apache/conf/extra/httpd-vhosts.conf

<VirtualHost *:9000>

   ServerAdmin [email protected]

   DocumentRoot "/var/html/bbs"

ServerNamebbs.abc.org

SetEnvIf Request_URI "^/check/.html$" dontlog

   ErrorLog "logs/bbs-error-log"

   CustomLog "logs/bbs-access-log" common env=!dontlog

</VirtualHost>

6、統計Apache日誌各IP訪問量
(1)日誌樣表

cat/application/apache/logs/access_blog_20170223.log  

10.0.0.101 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.102 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.103 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.104 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.105 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.101 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.102 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.103 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.101 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.102 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.101 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.101 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.101 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.102 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.103 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.104 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.105 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.101 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.102 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.103 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

(2)查找並排序:方法一

awk '{print $1}'access_blog_20170223.log| sort | uniq -c|sort -rn -k1|head -10     

7 10.0.0.101

5 10.0.0.102

4 10.0.0.103

2 10.0.0.104

2 10.0.0.105

(3)查找並排序:方法二(awk數組)

awk '{++S[$1]} END {for (key in S)print S[key],key}' access_blog_20170223.log |sort -rn -k1|head -10

7 10.0.0.101

5 10.0.0.102

4 10.0.0.103

2 10.0.0.104

2 10.0.0.105

八、隱藏Apache版本信息

1、在編譯安裝前修改相關源文件
(1)修改httpd-2.2.27/include/ap_release.h文件,將相關內容修改如下:

修改前:#defineAP_SERVER_BASEVENDOR "Apache Software Foundation"

修改後:#defineAP_SERVER_BASEVENDOR "IIS"

修改前:#defineAP_SERVER_BASEPROJECT "Apache HTTP Server"

修改後:#defineAP_SERVER_BASEPROJECT "IIS"

修改前:#defineAP_SERVER_BASEPRODUCT "Apache"

修改後:#defineAP_SERVER_BASEPRODUCT "IIS"

修改前:#define AP_SERVER_MAJORVERSION_NUMBER2

修改後:#defineAP_SERVER_MAJORVERSION_NUMBER 7

修改前:#defineAP_SERVER_MINORVERSION_NUMBER 2

修改後:#defineAP_SERVER_MINORVERSION_NUMBER 0

修改前:#defineAP_SERVER_PATCHLEVEL_NUMBER   27

修改後:#defineAP_SERVER_PATCHLEVEL_NUMBER   0

修改前:#defineAP_SERVER_DEVBUILD_BOOLEAN    0

修改後:#defineAP_SERVER_DEVBUILD_BOOLEAN    0

(2)修改httpd-2.2.27/os/unix/os.h文件,將相關內容修改如下:

修改前:#definePLATFORM "Unix"

修改後:#definePLATFORM "Win32"

(3)編譯安裝

./configure

make

make install

(4)通過curl命令檢查

curl –I http://10.0.0.99

2、在編譯安裝後修改相關配置文件
(1)修改httpd-default.conf文件,將相關內容修改如下:

vi/application/apache/conf/extra/httpd-default.conf

修改前:ServerTokensFull

修改後:ServerTokensProd

修改前:ServerSignatureOn

修改後:ServerSignatureOff

(2)修改主配置文件httpd.conf,將http-default.conf引用打開

修改前:

# Various default settings

#Include conf/extra/httpd-default.conf

修改後:

# Various default settings

Include conf/extra/httpd-default.conf

(3)平滑重啓Apache

/application/apache/bin/apachectlgraceful

(4)檢查修改是否成功

curl -I http://192.168.158.99

HTTP/1.1 200 OK

Date: Thu, 23 Feb 2017 06:15:22 GMT

Server: Apache  #已無版本號

Last-Modified: Wed, 22 Feb 201713:40:55 GMT

ETag:"1bf366-14-5491ea5590f07"

Accept-Ranges: bytes

Content-Length: 20

Content-Type: text/html

發佈了40 篇原創文章 · 獲贊 15 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章