1. 程式人生 > >學習 Apache httpd 原理與配置

學習 Apache httpd 原理與配置

一、Apache的簡介

      Apache  Httpd又可以簡稱為httpd或者Apache,它是Internet使用最廣泛的web伺服器之一。

     使用Apache提供的web伺服器是由守護程序 httpd,通過http協議進行文字傳輸,預設使用80埠的明文傳輸方式,後來,為了保證資料的安全和可靠性,又添加了443的加密傳輸的方式(https)。

     Apache提供的伺服器又被稱為:補丁伺服器,原因很簡單,它是一款高度模組化的軟體,想要給它新增相應的功能只需新增相應的模組,讓其Apache主程式載入相應的模組,不需要的模組也可以不用載入,保證了Apache的簡潔,輕便,高效性,當出現大量訪問一個伺服器是可以使用多種複用模式,保證了伺服器能快速回應客戶端的請求,如MPM,埠複用技術。

二、一次完整的Http請求

1. http請求和響應過程:

(1)建立連線:客戶端向伺服器建立連線,傳送報文,包含相應的請求資源的方法和客戶端能支援的協議,編碼等資料。

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

(3)如果伺服器同意建立連線時便要處理請求,其中包括訪問資源,訪問資源時需要相應的對映機制,把客戶端的URL轉化為本地目錄下相應的檔案

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

(5)傳送響應報文,報文中包含相應的狀態碼,和資料報文

(6)伺服器記錄日誌

(7)客戶端接收資料

附示例:

[[email protected] ~]# 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    ===>網頁內容
[[email protected]
 ~]#

2. http兩種連線方式:

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

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

數量限制:多少個資源

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

附示例:

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

[[email protected] conf.d]# pwd
/etc/httpd/conf.d
[[email protected] 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版本配置檔案示例:

[[email protected] ~]# 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 [email protected] 管理員的郵箱地址,當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

相關推薦

no