HTTP協議和APACHE服務器

Web Service

 

傳輸層:提供進程地址

Portnumber:

tcp:傳輸控制協議,面向連接的協議;通信前需要建立虛擬鏈路;結束後拆除鏈路;

0-65535

udpUser DatagramProtocol,無連接的協議;

0-65535

 

IANA:

0-1023:衆所周知,永久的分配給固定的應用使用,特權端口,22/tcp(ssh), 80/tcp(http), 443/tcp(https)

1024-41951:亦爲註冊端口,但要求並不是特別嚴格,分配給程序註冊爲某應用使用,11211/tcp, 11211/udp (memcached),3306/tcp(mysql)

41952+:客戶端程序隨機使用的端口;動態端口,或私有端口;其範圍的定義:/proc/sys/net/ipv4/ip_local_port_range

 

Socket: IPC的一種實現,允許位於不同主機(甚至同一主機)上不同進程之間進行通信;數據交換;Socket API, 1983年,4.2 BSD

SOCK_STREAMtcp套接字

SOCK_DGRAMudp套接字

SOCK_RAW: 裸套接字

 

IPv4:

分類:

A1-127

B128-191

C192-223

D:組播,224-239

E240-254

 

私有地址:

A10.0.0.0/8

B172.16.0.0/16-172.31.0.0/16

C192.168.0.0/24-192.168.255.0/24

 

TCP協議的特性:

建立連接:三次握手

將數據打包成段:校驗和(CRC-32

確認、重傳以及超時:

排序:邏輯序號

流量控制:滑動窗口算法

擁塞控制:慢啓動和擁塞避免算法

 

Socket Domain(根據其所使用的地址):

AF_INETAddressFamilyIPv4

AF_INET6IPv6

AF_UNIX:同一主機上不同進程之間通信時使用;

 

每類套接字都至少提供了兩種socket:流,數據報

流:可靠地傳遞、面向連接、無邊界;

數據報:不可靠地傳遞、有邊界、無連接;

 

套接字相關的系統調用:

socket(): 創建一個套接字;

bind():綁定

listen():監聽

accept():接收請求

connect():請求連接建立

write():發送

read():接收

send(),recv(), sendto(), recvfrom()

 

 

MIME:Multipurpose Internet Mail Extesion

 

工作機制:

http請求

http響應

 

Web資源:web resource

靜態文件:.jpg, .gif, .html, .txt, .js, .css, .mp3, .avi

動態文件:.php, .jsp,

 

媒體:

媒體類型(MIME類型):major/minor

text/html

text/plain

image/jpeg

image/gif

 

URI:Uniform Resource Identifier

URL: Uniform Resorce Locator,用於描述某服務器某特定資源的位置;

Scheme://Server:Port/path/to/resource

URN:Uniform Resource Naming

 

http協議版本:

HTTP/0.9:原型版本,功能簡陋

HTTP/1.0:第一個廣泛使用的版本,支持MIME

HTTP/1.1: 增強了緩存功能

spdy

HTTP/2.0

 

 

 

一次完整的http請求處理過程:

(1) 建立或處理連接:接收請求或拒絕請求

(2) 接收請求:

接收來自於網絡的請求報文中對某資源的一次請求的過程;

 

併發訪問響應模型(Web I/O):

單進程I/O結構:啓動一個進程處理用戶請求,而且一次只處理一個;多個請求被串行響應

多進程I/O結構:並行啓動多個進程,每個進程響應一個請求;

複用I/O結構:一個進程響應N個請求;

多線程模型:一個進程生成N個線程,每個線程響應一個用戶請求;

事件驅動機制:event-driven 一個進程可以與多個進程通信

複用的多進程I/O結構:啓動多個(m)進程,每個進程響應n個請求;並行響應

 

(3) 處理請求:對請求報文進行解析,並獲取請求的資源及請求方法等相關信息

(4) 訪問資源:獲取請求報文中請求的資源

web服務器,即存放了web資源的服務器,負責向請求者提供對方請求的靜態資源,或動態運行後生成的資源;這些資源放置於本地文件系統某路徑下,此路徑通常稱爲DocRoot

web服務器資源路徑映射方式:

(a)docroot

(b)alias

(c) 虛擬主機docroot

(d) 用戶家目錄docroot

(5) 構建響應報文

資源的MIME類型:

顯式分類

魔法分類

協商分類

URL重定向:

web服務構建的響應並非客戶端請求的資源,而是資源另外一個訪問路徑;

(6) 發送響應報文

(7) 記錄日誌

 

http服務器程序:

httpd (apache)nginx lighttpd

 

應用程序服務器:

IIS

tomcat,jetty, jboss, resin

webshpere,weblogic, oc4j

 

http協議:

http協議版本:

http/0.9,http/1.0, http/1.1, http/2.0

 

協議查看或分析的工具:

tcpdump,tshark, wireshark

 

報文語法格式:

request請求報文[Client發給Server]

<method><request-URL> <version>

<headers>

<entity-body>

 

response響應報文[Server發給Client]

<version><status> <reason-phrase>

<headers>

 

<entity-body>

 

method: 請求方法,標明客戶端希望服務器對資源執行的動作

method(方法)

GET

從服務器獲取一個資源;

HEAD

只從服務器獲取文檔的響應首部;

POST

向服務器發送要處理的數據;

PUT

將請求的主體部分存儲在服務器上;

DELETE

請求刪除服務器上指定的文檔;

TRACE

追蹤請求到達服務器中間經過的代理服務器;

OPTIONS

請求服務器返回對指定資源支持使用的請求方法;

 

version:

HTTP/版本號

status:

三位數字,如200301, 302, 404, 502; 標記請求處理過程中發生的情況;

status(狀態碼)

1xx100-101, 信息提示;

2xx200-206, 成功

3xx300-305, 重定向

4xx400-415, 錯誤類信息,客戶端錯誤

5xx500-505, 錯誤類信息,服務器端錯誤

 

常用的狀態碼:

200

成功,請求的所有數據通過響應報文的entity-body部分發送;OK

301

請求的URL指向的資源已經被刪除;但在響應報文中通過首部Location指明瞭資源現在所處的新位置;Moved Permanently

302

301相似,但在響應報文中通過Location指明資源現在所處臨時新位置;  Found

304

客戶端發出了條件式請求詢問[Server本地緩存和Server內容是否不一致],但服務器上的資源未曾發生改變,則通過響應此響應狀態碼通知客戶端;Not Modified

401

需要輸入賬號和密碼認證方能訪問資源;Unauthorized

403

請求被禁止;Forbidden

404

服務器無法找到客戶端請求的資源;Not Found

500

服務器內部錯誤;Internal Server  Error

502

代理服務器從後端服務器[即代理服務器,保存真正Server的緩存,若無緩存則去找上級服務器…]收到了一條僞響應;Bad Gateway

 

reason-phrase

對狀態碼的簡要描述;

headers

每個請求或響應報文可包含任意個首部;每個首部都有首部名稱,後面跟一個冒號,而後跟上一個可選空格,接着是一個值;

headers格式:

例:

GET /test/hello.html   HTTP/1.1

發送GET請求,請求資源/test/hello.html  協議版本HTTP/1.1

Accept: */*

客戶端可以接收任何數據

Rerferer: http://localhost:80/test/abc.html

請求來自哪裏,即從哪個頁面跳轉過來的

Accept-Language:   zh-cn

頁面支持什麼語言

User-Agent: Moziala/4.0

告訴服務器客戶端的瀏覽器內核/版本

Accept-Encoding: gzip,defate

表示接收什麼樣的數據壓縮格式

Host: localhost:80

主機

Connection: Keep-Alive

表示長連接,即不立即斷開

 

首部的分類:

通用首部、請求首部、響應首部、實體首部、擴展首部

 

通用首部:[請求和響應都可以使用]

Date: 報文的創建時間

Connection:連接狀態,如keep-alive,close

Via:顯示報文經過的中間節點,即經過幾個代理

Cache-Control:控制緩存的生效方法 [ 例:cache-control: max-age=100 緩存在100s後失效 ]

 

請求首部:[專用於請求]

Accept:通過服務器自己可接受的媒體類型;

Accept-Charset  接受的字符編碼格式 UTF-8

Accept-Encoding:接受的壓縮編碼格式,如gzip

Accept-Language:接受的語言格式 zh-cn

 

Client-IP: 客戶端IP

Host: 請求的服務器名稱和端口號

Referer:包含當前正在請求的資源的上一級資源[ 即從哪個頁面跳轉過來的 ]

User-Agent:客戶端代理[ 客戶端瀏覽器的內核/版本 ]

 

條件式請求首部:

Expect:用於指出客戶端要求的特殊服務器行爲。

If-Modified-Since:自從指定的時間之後,請求的資源是否發生過修改;

If-Unmodified-Since:自從指定的時間之後,請求的資源是否沒發生過修改;

If-None-Match:本地緩存中存儲的文檔的ETag標籤是否與服務器文檔的Etag不匹配;

If-Match:本地緩存中存儲的文檔的ETag標籤是否與服務器文檔的Etag匹配;

 

安全請求首部:

Authorization:向服務器發送認證信息,如賬號和密碼;

Cookie: 客戶端向服務器發送cookie

 

代理請求首部:

Proxy-Authorization: 向代理服務器認證

 

響應首部:[專用於響應]

信息性:

Age:響應持續時長

Server:服務器程序軟件名稱和版本

 

協商首部:某資源有多種表示方法時使用

Accept-Ranges:服務器可接受的請求範圍類型

Vary:服務器查看的其它首部列表;

 

安全響應首部:

Set-Cookie:向客戶端設置cookie

WWW-Authenticate:來自服務器的對客戶端的質詢認證表單

 

實體首部:[專用於描述entity-body即附加數據]

Allow: 列出對此實體可使用的請求方法[GET POST…]

Location:告訴客戶端真正的實體位於何處[重定向時使用]

 

Content-Encoding:內容壓縮編碼格式

Content-Language:內容語言

Content-Length: 主體的長度

Content-Location: 實體真正所處位置;

Content-Type:主體的對象類型[text/html …]

 

緩存相關:

ETag:實體的擴展標籤;

Expires:實體的過期時間;

Last-Modified:最後一次修改的時間

 

entity-body:實體主體;請求時附加的數據或響應時附加的數據;

 

 

httpd程序環境:

 

rpm包安裝的httpd的默認工作目錄(根目錄):/etc/httpd

 

配置文件:

主配置文件:/etc/httpd/conf/httpd.conf

分段配置文件:/etc/httpd/conf.d/*.conf

服務腳本:

/etc/rc.d/init.d/httpd

腳本的配置文件:/etc/sysconfig/httpd

模塊文件目錄:

/etc/httpd/modules -->/usr/lib64/httpd/modules

主程序文件:

/usr/sbin/httpd (prefork)

/usr/sbin/httpd.worker (worker)

/usr/sbin/httpd.event (event)

日誌文件目錄:

/var/log/httpd

access_log: 訪問日誌文件

error_log:錯誤日誌[ httpd服務啓動和關閉的信息也在這裏 ]

站點文檔目錄:

/var/www/html

 

/etc/httpd/conf/httpd.conf配置文件:

由三部分組成

### Section 1:Global Environment [全局有效配置]

### Section 2: 'Main' serverconfiguration [Main server有效配置]

### Section 3: Virtual Hosts [虛擬主機有效配置]

 

'Main'serverVirtual Hosts不能同時啓用;默認啓用的是'Main'server [即全局的DocumentRoot 指令]

 

1、指定監聽地址和端口

 

Listen [IP:]80

(1) IP省略時表示監聽本機上所有可用的IP地址;

(2) Listen指令可以出現多次,用於指明多個不同的監聽端口或套接字:

Listen172.16.100.11:80

Listen172.16.100.11:8080

 

2、持久連接相關

 

KeepAlive Off|On

MaxKeepAliveRequests 100

KeepAliveTimeout 15

持久連接:一次TCP三次握手連接建立後,每個資源獲取結束不會立即四次斷開連接,而繼續等待其它資源請求並完成傳輸;

斷開要求:

數量限制:如100

時間限制:如15

劣勢:對併發訪問量較大的服務器,開持久連接會有些請求得不到服務;

改進:減短時間,httpd-2.4支持毫秒級

非持久連接:每個資源都是單獨通過專用的連接進行獲取

 

測試:

#telnet Server 80

GET/URL HTTP/1.1

Host:Server

 

3MPM                          

多路處理模塊:併發請求響應的不同實現

prefork,worker, event

MPMMultipathProcessing Modules   多路處理模塊機制

prefork多進程模型,每個進程響應一個請求;

啓動一個主進程,用來監聽套接字和負責生成子進程 [ 子進程也稱爲工作進程 ],每個子進程處理一個用戶請求;即便沒有用戶請求,也會預先生成多個空閒進程,隨時等待請求到達;最大不會超過1024個;

一個請求到來時,主進程不會響應這個請求,而是讓一個預先生成的子進程去處理,主進程再去監聽套接字

worker多線程模型,每個線程響應一個請求;

啓動一個主進程用來生成多個子進程,每個子進程負責生個多個線程,每個線程響應一個請求;

例:若有m子進程,n線程,可以同時處理m*n請求        

一個請求到來時,主進程不會響應這個請求,而是讓一個預先創建的空閒子進程去找一個預先生成的線程去處理;且預先生成的空閒進程和線程數量是有上下限的        

event事件驅動模型,每個線程響應多個請求;

一個主進程:生成多個子進程,每個進程直接響應多個請求;

 

httpd-2.2: event爲測試使用

httpd-2.4: event可生產使用

 

httpd-2.2 不支持同時編譯多個不同的MPMrpm安裝的httpd-2.2提供了三個文件分別用於實現提供對不同的MPM的支持;確認方法:

# ps aux | grep httpd

 

默認爲/usr/sbin/httpd,其爲prefork;

查看模塊列表:

httpd -l: 查看靜態編譯的模塊

httpd -M: 查看所有模塊,包括靜態編譯和DSO模塊[動態裝卸載模塊]

httpd-worker -M|-l

httpd-event -M|-l

更換支持不同的MPM的主程序:

編輯/etc/sysconfig/httpd

啓用變量:HTTPD [取消註釋即可]

wKioL1VEjNajjorUAAFRQsV5_Uo115.jpg

修改其配置屬性在/etc/httpd/conf/http.conf

wKiom1VEi6DTCWEDAAHpKbys3Jc984.jpg

注意:MaxRequsetPerChild不是越大越好,而是根據實際情況,內存較大的服務器設大些,內存較小設小些;即設定一個獨立的子進程能處理的請求數,到達這個數量時,子進程會被父進程終止,這時就會釋放佔用的內存。所以越大時佔用內存越大。

 

# worker MPM

#StartServers: initial number of server processes to start

#MaxClients: maximum number of simultaneous client connections

#MinSpareThreads: minimum number of worker threads which are kept spare

#MaxSpareThreads: maximum number of worker threads which are kept spare

#ThreadsPerChild: constant number of worker threads in each server process

#MaxRequestsPerChild: maximum number of requests a server process serves

<IfModule worker.c>

StartServers         4 [服務器啓動時啓動多少子進程]

MaxClients         300 [最多允許多少個併發連接,不超過1024]

MinSpareThreads     25 [最少總空閒線程]

MaxSpareThreads     75 [最多總空閒線程]

ThreadsPerChild     25 [每一個子進程可以生成多少個線程]

MaxRequestsPerChild  0 [不限制]

</IfModule>

 

4、配置指令模塊加載:

 

LoadModule<module_name> <module_path>

wKiom1VEi8HALWpXAAAxVeE40IU278.jpg

模塊路徑:可使用相對路徑;相對於ServerRoot[/etc/httpd]指令指向的位置而言;

 

注意:建議使用service httpd reload重新裝載配置文件

 

5、定義'Main'server的文檔頁面路徑

DocumentRoot指令   指定網站頁面位置[路徑要事先存在]

wKioL1VEjUmxprUuAAAfnF109A4032.jpg

 

6、站點路徑訪問控制

訪問控制機制:

基於來源地址

基於賬號

 

定義的方式有兩種:

文件系統路徑:

<Directory"/PATH/TO/SOMEDIR">

...

</Directory>

URL路徑:

<Location"/URL">

...

</Location>

 

7Directory中的訪問控制定義

(1) Options

Indexes: 當訪問的路徑下無默認主頁面文件存在,且沒有指定具體要訪問的資源時,會將此路徑下的所有資源以列表呈現給用戶;非常危險,不建議使用;

FollowSymLinks:如果某頁面文件爲鏈接文件,指向DocumentRoot之外路徑上的其它文件時,將直接顯示目標文件的內容;

None: 都不啓用

All:所有的都啓用;

(2) AllowOverride None

是否允許路徑下的.htaccess文件覆蓋定義的訪問控制權限

(3) 基於來源地址訪問控制

Order: 檢查次序

Order Allow Deny:以Allow優先處理,但沒有寫入規則的則默認爲Deny。常用於:開放所有,拒絕特定

Order Deny Allow:   Deny優先處理,但沒有寫入規則的則默認爲Allow。常用於:拒絕所有,開放特定

注意:當AllowDeny的規則當中有重複的,則以Order先後順序爲主。

Allow from:允許訪問的來源地址

Deny from:拒絕訪問的來源地址

 

from後可跟上的地址格式:

IP地址;

網絡地址:

172.16

172.16.0.0

172.16.0.0/16

172.16.0.0/255.255.0.0

<Directory  /var/www>

Options None

AllowOverride None

Order Allow Deny

Allow from all

Deny from 192.168.1.110

</Directory>

 

8、定義默認的主頁面

DirectoryIndex index.htmlindex.html.var

 

自左而右,找到首次匹配到的文件;就將其做爲默認主頁面返回。

 

9、配置日誌

 

錯誤日誌:

wKiom1VEi_6hj5uaAAGoi6GifGo538.jpg

 

訪問日誌:要定義日誌格式

先定義日誌格式

wKiom1VEjDKA_TA7AAE1Br03Ziw858.jpg

 

日誌內容

wKioL1VEjcyTUQ4PAAFLKlyRPEY529.jpg

 

%h

記錄客戶端主機的IP地址

%l

客戶用戶通過identd登錄時使用名稱;一般爲- [ - 爲空 ]

%u

用戶認證登錄的名字[基於.htpasswd的密碼認證纔有];無登錄機制一般爲-

%t

收到客戶端請求時的時間;

\"

 顯示引號本身,而不作爲引用符號;\爲轉意符

%r

請求報文的首行     <method> <url> <version>

%>s

響應狀態狀態碼

%b

響應報文的大小,單位爲字節;不包含首部信息;

%{Referer}i

記錄Http首部Referer對應的值即訪問入口,從哪個頁面跳轉至此頁面;[直接從瀏覽器進入爲空]

%{User-Agent}i

記錄http首部User-Agent對應的值;即瀏覽器內核類型;

 

詳情:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats

 

10、路徑別名

 

Alias/URL/ "/path/to/some_directory"

例如:Alias /bbs/ "/web/bbs/htdocs/"

DocumentRoot"/var/www/html"

注意:路徑最後一個斜線都要有或者都沒有

URL: http://www.lx.com/bbs/index.html --> 找的是/web/bbs/htdocs/index.html而不是/var/www/html下的文件

 

 

11、設定默認字符集

AddDefaultCharset UTF-8

常用字符集:GBK, GB2312, GB18030

 

12、基於用戶的訪問控制

質詢:

響應報文首部:WWW-Authenticate[ 服務器用401狀態拒絕客戶端請求,說明需要用戶提供用戶名和密碼;彈出對話框 ]

認證:

請求報文首部:Authorization[ 客戶端用戶填入賬號密碼後再次發請求至服務器;認證通過,則請求授權 ]

 

安全域:需要用戶認證後方能訪問的路徑,應該有其名稱,用於向用戶通知此認證的原因等;

 

http協議支持的認證方式:

basic:基本   BASE64 [ 只是編碼不是加密 ]

digest:摘要 [老的瀏覽器不支持]

 

basic認證機制的實現

(1) 定義安全域

<Directory"/data/web/html/employee">

    Options None

    AllowOverride None

    AuthType Basic                                                                         

   AuthName "Employee Infomation, only for employee"   [ "註釋顯示信息" ]

   AuthUserFile /etc/httpd/users/.passwd                               [ htpasswd生成的基於Basic的密鑰文件 ]

   Require user tom jerry                                                            [ 允許AuthUserFile文件中的那些用戶登錄 ]

</Directory>        

 

Require valid-user: 所有位於AuthUserFile文件中定義的用戶都允許登錄;

Require user user1 user2 ...: 僅允許user1user2等出現AuthUserFile文件中定義的特定幾個用戶登錄;                

wKiom1VEjIvTVu-YAAEzrnRVqmw531.jpg

(2) 提供用戶的賬號文件

htpasswd命令用於維護此文件

 

 htpasswd [ -c ] [ -m ] [ -D ] passwdfileusername

         -c:添加第一用戶時創建此文件;若文件存在,則覆蓋文件

         -m:md5格式加密用戶密碼存放;

         -s:sha格式加密用戶密碼存放;

         -D:刪除指定用戶

 

htpasswd -c .passwd lx

當添加第二個用戶時,不用-c  htpasswd .passwd abc

wKioL1VEjhOj5ysYAABiaRRNLgQ143.jpg

(3) 組認證

<Directory"/data/web/html/employee">

    Options None

    AllowOverride None

    AuthType Basic

    AuthName "Employee Infomation, onlyfor employee"

    AuthUserFile /etc/httpd/users/.htpasswd

    AuthGroupFile /etc/httpd/users/.htgroup

    Require group GRP1 GRP2 ...

</Directory>

 

組文件:

每行定義一個組,格式

Grp_Name: USERNAME1 USERNAME2 ...

 

測試:組認證過程:

1.編輯/etc/httpd/conf/httpd.conf

wKioL1VEjjbyTKoCAAFg2zEHkSY935.jpg

2.mkdir -p /web/vhosts/test  /web/vhosts/test/protect  

3.創建測試database頁面 vim /web/vhosts/test/protect/database  ; <h1>database test<h1>

4.htpasswd命令創建密碼文件   htpasswd -c/web/vhosts/test/protect/.passwd lx ;

htpasswd /web/vhosts/test/protect/.passwd tom;           htpasswd/web/vhosts/test/protect/.passwd jeery

5.創建組文件 vim/web/vhosts/test/protect/.group

wKioL1VEjk7AupbbAABenZi5vpU362.jpg

 

注意:虛擬用戶一定要有密碼才能登錄,即必須用htpasswd命令創建進入AuthUserFile

 

13、虛擬主機

一個物理器可以服務於多個站點,每個站點可通過一個或多個虛擬主機來實現;

 

httpd三種類型的虛擬主機:

基於IP

基於Port[端口]

基於FQDN[域名] 需有DNS解析

 

注意:得首先關閉'Main'server ;即註釋全局的DocumentRoot指令即可;

 

定義虛擬主機的方法:

<VirtualHost"IP:PORT">

ServerName 主機名[www.lx.com]

DocumentRoot網站頁面放置主目錄[/var/www/html]

注意:額外經常用於每個虛擬主機的配置有

ErrorLog錯誤日誌記錄文件位置,不存在會自動生成 [/var/log/httpd/lx.err]

CustomLog  訪問日誌文件位置,不存在會自動生成 [/var/log/httpd/lx.access]  日誌格式[ common|combined|agent|referer]

ServerAlias  定義路徑別名

<Directory></Directory>

<Location></Location>

</VirtualHost>

 

注意:大多數可用於全局或'main' server中的指令,都可以定義有VirtualHost中;

 

示例1:基於IP

<VirtualHost172.16.100.11:80>

    ServerName www.a.com

    DocumentRoot /vhost/a.com/htdocs/

</VirtualHost>

 

<VirtualHost172.16.100.21:80>

    ServerName www.b.org

    DocumentRoot /vhost/b.org/htdocs/

</VirtualHost>

 

<VirtualHost172.16.100.31:80>

    ServerName www.c.net

    DocumentRoot /vhost/c.net/htdocs/

</VirtualHost>        

 

注意:本機要配置上所有IP地址並能夠用於通信;

 

示例2:基於Port

<VirtualHost172.16.100.11:80>

    ServerName www.a.com

    DocumentRoot /vhost/a.com/htdocs/

</VirtualHost>

 

<VirtualHost172.16.100.11:808>

    ServerName www.b.org

    DocumentRoot /vhost/b.org/htdocs/

</VirtualHost>

 

<VirtualHost172.16.100.11:8080>

    ServerName www.c.net

    DocumentRoot /vhost/c.net/htdocs/

</VirtualHost>        

 

注意:httpd要監聽這裏指明的所有端口

Listen

 

示例3:混用IPPort

<VirtualHost172.16.100.11:80>

    ServerName www.a.com

    DocumentRoot /vhost/a.com/htdocs/

</VirtualHost>

 

<VirtualHost172.16.100.21:80>

    ServerName www.b.org

    DocumentRoot /vhost/b.org/htdocs/

</VirtualHost>

 

<VirtualHost172.16.100.11:8080>

    ServerName www.c.net

    DocumentRoot /vhost/c.net/htdocs/

</VirtualHost>        

 

示例4:基於FQDN

註釋全局的DocumentRoot指令

NameVirtualHost 172.16.100.11:80

 

<VirtualHost172.16.100.11:80>

    ServerName www.a.com

    DocumentRoot /vhost/a.com/htdocs/

</VirtualHost>

 

<VirtualHost172.16.100.11:80>

    ServerName www.b.org

    DocumentRoot /vhost/b.org/htdocs/

</VirtualHost>

 

<VirtualHost172.16.100.11:80>

    ServerName www.c.net

    DocumentRoot /vhost/c.net/htdocs/

</VirtualHost>        

wKiom1VEjR2xw04mAALrWN-H-Ps333.jpg

 

14、內置的status頁面

<Location/server-status>

    SetHandler server-status

    Order deny,allow

    Deny from all

    Allow from 172.16.0.0/16

</Location>

可以嵌套使用,Location相當於Directory

 例:通過www1.stuX.com/server-status輸出httpd工作狀態相關信息,且只允許帳號lx通過密碼才能訪問,接可以查看www1.stuX.comindex.html

wKioL1VEjrWS83JiAAGGHCUnmSw249.jpg

15 curl命令

 

curl是基於URL語法在命令行方式下工作的文件傳輸工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET,DICT, FILELDAP等協議。curl支持HTTPS認證,並且支持HTTPPOSTPUT等方法, FTP上傳,kerberos認證,HTTP上傳,代理服務器, cookies用戶名/密碼認證,下載文件斷點續傳,上載文件斷點續傳,http代理服務器管道( proxy tunneling),甚至它還支持IPv6 socks5代理服務器,,通過http代理服務器上傳文件到FTP服務器等等,功能十分強大。

 

curl[options] [URL...]

 

curl的常用選項:

 

   -A/--user-agent <string> 設置用戶代理髮送給服務器

   -basic 使用HTTP基本認證

   --tcp-nodelay 使用TCP_NODELAY選項

   -e/--referer <URL> 來源網址

   --cacert <file> CA證書 (SSL)

   --compressed 要求返回是壓縮的格式

   -H/--header <line>自定義頭信息傳遞給服務器

    -I/--head只顯示響應報文首部信息

   --limit-rate <rate> 設置傳輸速度

    -u/--user<user[:password]>設置服務器的用戶和密碼

   -0/--http1.0 使用HTTP1.0        

 

用法:curl [options] [URL...]

例:  1.僞裝成chrome瀏覽器

curl -A "chrome 4.0" http://192.168.1.110

wKiom1VEjW_h8NEPAAHyii2bSxE257.jpg

 

另一個工具:elinks   全屏瀏覽器

elinks[OPTION]... [URL]...

-dump: 不進入交互式模式,而直接將URL的內容輸出至標準輸出;

 

16 使用mod_deflate模塊壓縮頁面優化傳輸速度

 

適用場景:

(1) 節約帶寬,額外消耗CPU;同時,可能有些較老瀏覽器不支持;

(2) 壓縮適於壓縮的資源,例如文件文件;

 

添加進/etc/httpd/conf/httpd.conf即可對壓縮格式做限定

SetOutputFilter DEFLATE  輸出過濾器

 

#mod_deflate configuration

 

# Restrict compression to these MIMEtypes    限制壓縮這些MIME類型

AddOutputFilterByTypeDEFLATE text/plain

AddOutputFilterByTypeDEFLATE text/html

AddOutputFilterByTypeDEFLATE application/xhtml+xml

AddOutputFilterByTypeDEFLATE text/xml

AddOutputFilterByTypeDEFLATE application/xml

AddOutputFilterByTypeDEFLATE application/x-javascript

AddOutputFilterByTypeDEFLATE text/javascript

AddOutputFilterByTypeDEFLATE text/css

 

# Level of compression (Highest 9 -Lowest 1)    壓縮級別

DeflateCompressionLevel9

 

# Netscape 4.x has some problems.       

BrowserMatch^Mozilla/4 gzip-only-text/html

 

#Netscape 4.06-4.08 have some more problems

BrowserMatch^Mozilla/4\.0[678] no-gzip

 

#MSIE masquerades as Netscape, but it is fine

BrowserMatch\bMSI[E] !no-gzip !gzip-only-text/html

 

17https

 

http over ssl = https 443/tcp  不再是文本格式傳輸而是二進制格式傳輸

ssl: v3   tls: v1

 

SSL會話的簡化過程

(1) 客戶端發送可供選擇的加密方式,並向服務器請求證書;

(2) 服務器端發送證書以及選定的加密方式給客戶端;

(3) 證書驗正:

如果信任給其發證書的CA

(a) 驗正證書來源的合法性;用CA的公鑰解密證書上數字簽名;

(b) 驗正證書的內容的合法性:完整性驗正

(c) 檢查證書的有效期限;

(d) 檢查證書是否被吊銷;

(e) 證書中擁有者的名字,與訪問的目標主機要一致;

(4) 客戶端生成臨時會話密鑰(對稱密鑰),並使用服務器端的公鑰加密此數據發送給服務器,完成密鑰交換;

(5) 服務用此密鑰加密用戶請求的資源,響應給客戶端;

 

注意:SSL會話是基於IP地址創建;所以單IP的主機上,僅可以使用一個https虛擬主機;

 

配置httpd支持https

(1) 爲服務器申請數字證書;

測試:通過私建CA發證書

(a) 創建私有CA

(b) 在服務器創建證書籤署請求

(c) CA簽證

(2) 配置httpd支持使用ssl,及使用的證書;

#yum -y install mod_ssl

 

配置文件:/etc/httpd/conf.d/ssl.conf

DocumentRoot

ServerName

SSLCertificateFile   [證書]

SSLCertificateKeyFile   [私鑰]

(3) 測試基於https訪問相應的主機;

#openssl s_client [-connect host:port] [-cert filename] [-CApath directory][-CAfile filename]

openssl s_client -connect 192.168.1.115 -Cafile/etc/pki/CA/cacert.pem

基於windows的方法:把CA中自簽證書重命名爲cacert.crt導入到授信任的根證書即可

 

18httpd自帶的工具程序

 

htpasswd: basic認證基於文件實現時,用到的賬號密碼文件生成工具;

apachectlhttpd自帶的服務控制腳本,支持start, stop

apachectl start

apxs:由httpd-devel包提供的,擴展httpd使用第三方模塊的工具;

rotatelogs:日誌滾動工具;

access.log-->

access.log, access.1.log-->

access.log,access.1.log, access.2.log

suexec:訪問某些有特殊權限配置的資源時,臨時切換至指定用戶運行;可以在配置文件中修改UserGroup即用誰的身份運行httpd

 

19http壓力測試工具

abwebbenchhttp_load

jmeterloadrunner

tcpcopy

 

ab[OPTIONS] URL

-n: 總的請求數

-c:模擬的併發數[不能超過1024,超過時用ulimit命令設置]

-k: 以持久連接模式測試

ab -n 1000 -c 100 -k http://www.lx.com  [ulimit -n #: 調整當前用戶所同時打開的文件數;]

測試結果也一目瞭然,測試出的吞吐率爲:Requests per second: 2015.93 [#/sec](mean)  初次之外還有其他一些信息。

Server Software 表示被測試的Web服務器軟件名稱

Server Hostname 表示請求的URL主機名

Server Port 表示被測試的Web服務器軟件的監聽端口

Document Path 表示請求的URL中的根絕對路徑,通過該文件的後綴名,我們一般可以瞭解該請求的類型

Document Length 表示HTTP響應數據的正文長度

Concurrency Level 表示併發用戶數,這是我們設置的參數之一

Time taken for tests 表示所有這些請求被處理完成所花費的總時間

Complete requests 表示總請求數量,這是我們設置的參數之一

Failed requests 表示失敗的請求數量,這裏的失敗是指請求在連接服務器、發送數據等環節發生異常,以及無響應後超時的情況。如果接收到的HTTP響應數據的頭信息中含有2XX以外的狀態碼,則會在測試結果中顯示另一個名爲      “Non-2xx responses”的統計項,用於統計這部分請求數,這些請求並不算在失敗的請求中。

Total transferred 表示所有請求的響應數據長度總和,包括每個HTTP響應數據的頭信息和正文數據的長度。注意這裏不包括HTTP請求數據的長度,僅僅爲web服務器流向用戶PC的應用層數據總長度。

HTML transferred 表示所有請求的響應數據中正文數據的總和,也就是減去了Total transferredHTTP響應數據中的頭信息的長度。

Requests per second 吞吐率,計算公式:Complete requests / Time taken for tests

Time per request 用戶平均請求等待時間,計算公式:Time token for tests/Complete requests/Concurrency Level

Time per requet(across all concurrentrequest) 服務器平均請求等待時間,計算公式:Time taken for tests/Complete requests,正好是吞吐率的倒數。也可以這麼統計:Time per request/Concurrency Level

Transfer rate 表示這些請求在單位時間內從服務器獲取的數據長度,計算公式:Total trnasferred/ Time taken for tests,這個統計很好的說明服務器的處理能力達到極限時,其出口寬帶的需求量。

Percentage of requests served within acertain timems這部分數據用於描述每個請求處理時間的分佈情況,比如以上測試,80%的請求處理時間都不超過6ms,這個處理時間是指前面的Time per request,即對於單個用戶而言,平均每個請求的處理時間。

 

 

編譯安裝httpd-2.4

 

新特性:

(1) MPM支持運行DOS[動態模塊裝載]機制;

(2) 支持eventMPM

(3) 支持異步讀寫;

(4) 支持每模塊及每個目錄分別使用各自的日誌級別;

(5) 每請求配置;<If>

(6) 增強版的表達式分析器;

(7) 支持毫秒級的keepalivetimeout

(8) 基於FQDN的虛擬主機不再需要NameVirtualHost指令;

(9) 支持用戶自定義變量;

 

新模塊:

(1)mod_proxy_fcgi

(2)mod_ratelimit

(3)mod_remoteip

 

修改了一些配置機制:

不再支持使用Order, Deny, Allow來做基於IP的訪問控制;

 

httpd依賴於apr,apr-util, 可能還有apr-icon

apr:apache portable runtime

 

編譯安裝步驟:

 

前提:

         下載1.4+版的aprapr-utilhttpd-2.4的源碼包

安裝開發環境,安裝pcre-develzib-devel

 

例:以apr-1.5.0.tar.bz2apr-util-1.5.3.tar.bz2httpd-2.4.10.tar.bz2爲例  [ 注意:源碼編譯有先後順序 apr->apr-util->httpd-2.4 ]

yum groupinstall "Development tools" "Server PlatformDevelopment"

yum install pcre-devel zib-devel

 

(1)apr

#./configure --prefix=/usr/local/apr

#make && make install

 

(2)apr-util

# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr

#make && make install

 

(3)httpd-2.4

#groupadd -r apache

#useradd -r -g apache apahce

# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd --enable-so --enable-ssl--enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr--with-apr-util=/usr/local/apr-util/ --enable-modules=most--enable-mpms-shared=all --with-mpm=prefork

注意:-with-包名[pcre-devel]=路徑          

都要先裝它的devel包,用rpm包裝的devel包不用指路徑,因爲默認就是找/usr/下的;而不在這個路徑下的要指明 

-enable-so

支持DSO動態裝卸載模塊機制

-enable-cgi

支持CGI[通用網關接口]模式

-enable-ssl

支持ssl

-enable-rewrite

支持url重寫,依賴pcre-devel

-with-zilb

可以基於zlib可以壓縮報文

-with-pcre

支持使用pcre功能

-with-apr=/usr/local/apr

支持apr功能

-with-apr-util=/usr/local/apr-util

支持apr-util貢呢

--enable-modules=most

開啓最多的模塊

--enable-mpms-share=all

把所有的mpm都做成共享模塊

--with-mpm=prefork

prefork設爲默認的mpm

#make && make install

 

先將/usr/local/apache/bin設爲開機啓動的環境變量

wKioL1VEjxOxuBYJAAEqql-smAk377.jpg

 

啓動服務:

apachectl start|stop

 

配置:

注意:主配置文件在/etc/http/httpd.conf 輔助配置文件在/etc/httpd/extra/

(1) 切換使用MPM

LoadModulempm_NAME_module modules/mod_mpm_NAME.so

NAME:prefork, event, worker

wKiom1VEjd-hkmE4AABVPZrpac0997.jpg

httpd -M查看模塊是否啓用

(2) 修改'Main'serverDocumentRoot

①修改DocumentRoot   ②顯示授權編寫Directory

wKioL1VEj2mhegf2AAJhv06wiS4699.jpg

(3) 基於IP的訪問控制法則

允許所有主機訪問:Require all granted

拒絕所有主機訪問:Require all deny

 

控制特定IP訪問:

Require ip IPADDR:授權指定來源地址的主機訪問

Require not ip IPADDR:拒絕指定來源地址的主機訪問

 

IPADDR

IP:172.16.100.2

Network/mask:172.16.0.0/255.255.0.0

Network/Length:172.16.0.0/16

Net:172.16

例:Require ip 192.168.1.110

控制特定主機(HOSTNAME)訪問

Requirehost HOSTNAME

Requirenot host HOSTNAME

 

HOSTNAME:

FQDN: 特定主機

DOMAIN:指定域內的所有主機

例:Require host www.baidu.com

 

(4) 虛擬主機

基於IPPortFQDN都支持;

基於FQDN需要註釋'Main' ServerDocumentRoot不再需要NameVirtualHost指令;

vim /etc/httpd/httpd.conf  開啓這一項

wKioL1VEj4rRxKzLAAGU4N9ik1M467.jpg

(5) ssl

啓用模塊:取消註釋

wKiom1VEjjnBmuoWAACoULSrBsA883.jpg

編輯配置vim /etc/httpd/extra/httpd-ssl.conf

wKiom1VEjlXD69QIAAHMvKKtSxs334.jpg

 

(6) 服務腳本

①先複製一個之前用rpm包安裝的/etc/rc.d/init.d/httpd文件

scp [email protected]:/etc/rc.d/init.d/httpd/etc/rc.d/init.d/httpd

vim /etc/rc.d/init.d/httpd 修改這三項

wKiom1VEjpCTnT8kAAEApAIjKK0055.jpg

③用chkconfig命令增加httpd服務;在chkconfig工具服務列表中增加此服務,此時服務會被在/etc/rc.d/rc#.d中賦予K/S入口了

wKioL1VEkBnhHHojAAEiC6GJoF4022.jpg

④測試使用service httpd start

wKioL1VEkDSh8Fz6AAH8aJvu9nM157.jpg


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