1. 程式人生 > >Http協議及其實現httpd

Http協議及其實現httpd

1、埠號分配規則

0-1023:眾所周知,永久地分配給固定的應用使用,特權埠;
1024-41951:亦為註冊埠,但要求不是特別嚴格,分配給程式註冊為某應用使用,例如,3306 TCP埠,11211 TCP埠;
41952+:客戶端程式隨機使用的埠,動態埠,或私有埠,其範圍定義在/proc/sys/net/ipv4/ip_local_port_range。
BSD Socket:IPC的一種實現,允許位於不同主機(也可以是同一主機)上的程序之間進行通訊;
Socket API封裝了核心中的socket通訊相關的系統呼叫,其中SOCK_STREAM為TCP套接字,SOCK_DGRAM為UDP套接字,SOCK_RAW為raw套按字。
根據套接字所使用的地址格式,Socket Domain:
AF_INET:IPv4 Address Family,AF_INET6:ipv6 Address Family,AF_UNIX:同一主機上的不同程序間基於socket套接字通訊使用的一種地址,Unix_SOCK。

2、TCP

(1)TCP的有限狀態機: CLOSED,LISTEN,SYN_SENT,SYN_RECV,ESTABLISHED,FIN_WAIT1,CLOSE_WAIT,FIN_WAIT2,LAST_ACK,TIMEWAIT,CLOSED。
(2)TCP協議的特性:
建立連線:三次握手;
將資料打包成段:校驗和(CRC32);
確認、重傳及超時;
排序:邏輯序號;
流量控制:滑動視窗演算法;
擁塞控制:慢啟動和擁塞避免演算法;

3、HTTP

(1)術語
http:hyper text transfer protocol,超文字傳輸協議,應用層協議,監聽於TCP的80埠,是一種文字協議;
html:hyper text mark language,超文字標記語言。
css:Cascading Style Sheet,級聯樣式表;
js:JavaScript,一種客戶端指令碼。
(2)協議版本
http/0.9:原型版本,功能簡陋;
http/1.0:在http/0.9的基礎上增加了cache,MIME和method。
MIME:Multipurpose Internet Mail Extesion,多用途因特網郵件擴充套件;
method:GET,POST,HEAD,PUT,DELETE,TRACE,OPTIONS;
http/1.1:增強了快取功能;
(3)工作模式
http請求報文:http request,http響應報文:http response,一次http事務:一次請求響應過程。
web資源(web resource):
靜態資源(無須服務端做出額外處理):.jpg,.png,.gif,.html,.txt,.js,.css,.mp3,.avi;
動態資源(服務端需要通過執行程式做出處理,傳送給客戶端的是程式的執行結果):.php,.jsp
一個頁面中展示的資源可能有多個,每個資源都需要單獨請求。
資源的標識機制URL(Uniform Resource Locator):用於描述伺服器某特定資源的位置,格式:Scheme://Server[:Port][/PATH/TO/SOME_RESOURCE],例如:

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

接收請求的模型:併發訪問響應模型
1)單程序I/O模型:啟動一個程序處理使用者請求,這意味著,一次只能處理一個請求,多個請求被序列響應;
2)多程序I/O結構:並行啟動多個程序,每個程序響應一個請求;
3)複用的I/O結構:一個程序響應n個請求;
4)多執行緒模式:一個程序生成n個執行緒,一個執行緒處理一個請求;
5)事件驅動(event-driven):一個程序直接響應n個請求;
6)複用的多程序I/O結構:啟動多個(m)個程序,每個程序生成(n)個執行緒,響應的請求的數量:m*n。

處理請求:分析請求報文的http請求報文首部。
http協議分為http請求報文首部和http響應報文首部。
請求報文首部的格式:

<method> <URL> <VERSION>
HEADERS: (name: value)
<request body>

訪問資源:獲取請求報文中請求的資源。
web伺服器,即存放了web資源的主機,負責向請求者提供對方請求的靜態資源,或動態資源執行生成的結果,這些資源通常應該放置於本地檔案系統某路徑下,此路徑稱為DocRoot;例如,DocRoot為/var/www/html/,而/var/www/html/下有檔案images/logo.jgp,URL則為:http://www.magedu.com/images/logo.jpg。
web伺服器的資源路徑對映方式:
(a) docroot
(b) alias
© 虛擬主機的docroot
(d) 使用者家目錄的docroot

http請求處理中的連線模式:
保持連線(長連線)(keep-alive,在請求的時間和數量上控制連線時長)和非保持連線(短連線)。
(5)報文語法格式
request報文:

<method> <request-URL> <version>
<headers>

<entity-body>

response報文:

<version> <status> <reason-phrase>
<headers>

<entity-body>

method:請求方法,標明客戶端希望伺服器對資源執行的動作:GET、HEAD、POST;
version:HTTP/.
status:三位數字,如200,301,302,404,502,標記請求處理過程中發生的情況;
reason-phrase:狀態碼所標記的狀態的簡要描述;
headers:每個請求或響應報文可包含任意個首部,每個首部都有首部名稱,後面跟一個冒號,而後跟上一個可選空格,接著是一個值;
entity-body:請求時附加的資料或響應時附加的資料;
method(方法):
GET:從伺服器獲取一個資源;
HEAD:只從伺服器獲取文件的響應首部;
POST:向伺服器傳送要處理的資料;
PUT:將請求的主體部分儲存在伺服器上;
DELETE:請求刪除伺服器上指定的文件;
TRACE:追蹤請求到達伺服器中間經過的代理伺服器;
OPTIONS:請求伺服器返回對指定資源支援使用的請求方法;
協議檢視或分析的工具:tcpdump, tshark, wireshark;
status(狀態碼):
1xx:100-101,資訊提示;
2xx:200-206,成功;
3xx:300-305,重定向;
4xx:400-415,錯誤類資訊,客戶端錯誤;
5xx:500-505,錯誤類資訊,伺服器端錯誤;
常用的狀態碼:
200: 成功,請求的所有資料通過響應報文的entity-body部分發送;OK;
301: 請求的URL指向的資源已經被刪除,但在響應報文中通過首部Location指明瞭資源現在所處的新位置;Moved Permanently;
302: 與301相似,但在響應報文中通過Location指明資源現在所處臨時新位置; Found;
304: 客戶端發出了條件式請求,但伺服器上的資源未曾發生改變,則通過響應此響應狀態碼通知客戶端;Not Modified;
401: 需要輸入賬號和密碼認證方能訪問資源;Unauthorized;
403: 請求被禁止;Forbidden;
404: 伺服器無法找到客戶端請求的資源;Not Found;
500: 伺服器內部錯誤;Internal Server Error;
502: 代理伺服器從後端伺服器收到了一條偽響應;Bad Gateway;
headers:
格式:Name: Value

Cache-Control:public, max-age=600
Connection:keep-alive
Content-Type:image/png
Date:Tue, 28 Apr 2015 01:43:54 GMT
ETag:"5af34e-ce6-504ea605b2e40"
Last-Modified:Wed, 08 Oct 2014 14:46:09 GMT

Accept:image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Host:access.redhat.com
If-Modified-Since:Wed, 08 Oct 2014 14:46:09 GMT
If-None-Match:"5af34e-ce6-504ea605b2e40"
Referer:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html-single/Installation_Guide/index.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36

首部的分類:
通用首部,請求首部,響應首部,實體首部,擴充套件首部;
1)通用首部:
Date:報文的建立時間;
Connection:連線狀態,如keep-alive,close;
Via:顯示報文經過的中間節點;
Cache-Control:控制快取;
Pragma:引數;
2)請求首部:
Accept:通過伺服器自己可接受的媒體型別;
Accept-Charset:接受的字符集;
Accept-Encoding:接受編碼格式,如gzip;
Accept-Language:接受的語言;
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;
Cookie2:cookie第二版;
代理請求首部:
Proxy-Authorization:向代理伺服器認證;
3)響應首部:
資訊性:Age:響應持續時長,Server:伺服器程式軟體名稱和版本;
協商首部:某資源有多種表示方法時使用;
Accept-Ranges:伺服器可接受的請求範圍型別;
Vary:伺服器檢視的其它首部列表;
安全響應首部:
Set-Cookie:向客戶端設定cookie;
Set-Cookie2:向客戶端設定cookie2;
WWW-Authenticate:來自伺服器的對客戶端的質詢認證表單;
4)實體首部:
Allow:列出對此實體可使用的請求方法;
Location:告訴客戶端真正的實體位於何處;
Content-Encoding:內容的編碼格式;
Content-Language:內容的語言;
Content-Length:主體的長度;
Content-Location:實體真正所處位置;
Content-Type:主體的物件型別;
5)快取相關:
ETag:實體的擴充套件標籤;
Expires:實體的過期時間;
Last-Modified:最後一次修改的時間;

4、httpd

(1)http的伺服器程式有:httpd (apache)、nginx、lighttpd;
http的應用程式伺服器:IIS(.Net應用)、tomcat(.jsp應用);
httpd是ASF(apache software foundation)的頂級專案,apache(a patchy server)。
(2)httpd的特性
高度模組化: core + modules;
DSO:dynamic shared object;
MPM:Multipath processing Modules(多路處理模組);
prefork:多程序模型,每個程序響應一個請求;一個主程序:負責生成子程序及回收子程序,負責建立套接字,負責接收請求,並將其派發給某子程序進行處理;n個子程序:每個子程序處理一個請求;工作模型:會預先生成幾個空閒程序,隨時等待用於響應使用者請求,存在最大空閒程序數和最小空閒程序數。
worker:多程序多執行緒模型,每執行緒處理一個使用者請求;一個主程序:負責生成子程序,負責建立套接字,負責接收請求,並將其派發給某子程序進行處理;多個子程序:每個子程序負責生成多個執行緒;每個執行緒:負責響應使用者請求;併發響應數量:m* n;m:子程序數量,n:每個子程序所能建立的最大執行緒數量。
event:事件驅動模型,多程序模型,每個程序響應多個請求;一個主程序 :負責生成子程序,負責建立套接字,負責接收請求,並將其派發給某子程序進行處理;子程序:基於事件驅動機制直接響應多個請求。event模型在httpd-2.2中仍為測試使用模型,而在httpd-2.4中,event可用於生產環境中。
(3)httpd的程式版本
httpd 1.3:官方已經停止維護;
httpd 2.0;
httpd 2.2:用於CentOS 6系統中;
httpd 2.4:用於CentOS 7系統中,是目前的最新穩定版。
(4)httpd的功能特性
支援CGI(Common Gateway Interface);虛擬主機(IP方式,PORT方式, FQDN方式);
反向代理;負載均衡;路徑別名;豐富的使用者認證機制(basic認證和digest認證),還支援第三方模組。
(5)安裝httpd
rpm包:CentOS 發行版中直接提供;
編譯安裝:定製新功能,或其它原因;
(6)配置檔案
1)httpd-2.2
程式環境:CentOS 6
配置檔案:/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
2)httpd-2.4
程式環境:CentOS 7
配置檔案:/etc/httpd/conf/httpd.conf,/etc/httpd/conf.d/* .conf
模組相關的配置檔案:/etc/httpd/conf.modules.d/* .conf
systemd unit file:/usr/lib/systemd/system/httpd.service
主程式檔案:/usr/sbin/httpd,httpd-2.4支援MPM的動態切換;
日誌檔案:/var/log/httpd(access_log:訪問日誌,error_log:錯誤日誌)
站點文件:/var/www/html
模組檔案路徑:/usr/lib64/httpd/modules
服務控制:
systemctl enable|disable httpd.service
systemctl {start|stop|restart|status} httpd.service
(7)httpd-2.2的常用配置
主配置檔案:/etc/httpd/conf/httpd.conf
  ### Section 1: Global Environment
  ### Section 2: ‘Main’ server configuration
  ### Section 3: Virtual Hosts
配置格式:
directive value
directive:不區分字元大小寫;
value:為路徑時,是否區分字元大小寫,取決於檔案系統;
常用配置:
1)修改監聽的IP和PORT:Listen [IP:]PORT
(a) 省略IP表示為0.0.0.0;
(b) Listen指令可重複出現多次:Listen 80,Listen 8080;
© 修改監聽socket,重啟服務程序方可生效;
(8)持久連線
Persistent Connection:TCP連線建立後,每個資源獲取完成後不會斷開連線,而是繼續等待其它資源請求的進行; 通過數量限制和時間限制控制連線時長。
副作用:對併發訪問量較大的伺服器,長連線機制會使得後續某些請求無法得到正常響應;折衷辦法:使用較短的持久連線時長,以及較少的請求數量。

KeepAlive  On|Off
KeepAliveTimeout  15
MaxKeepAliveRequests  100

測試:

telnet  WEB_SERVER_IP  PORT
GET  /URL  HTTP/1.1
Host: WEB_SERVER_IP

(9)MPM
httpd-2.2不支援同時編譯多個MPM模組,所以只能編譯選定要使用的那個。CentOS 6 的rpm包為此專門提供了三個應用程式檔案,httpd(prefork), httpd.worker, httpd.event,分別用於實現對不同的MPM機制的支援。確認現在使用的是哪下程式檔案的方法:ps aux | grep httpd
預設使用的為/usr/sbin/httpd,其為prefork的MPM模組 ;
檢視httpd程式的模組列表:
檢視靜態編譯的模組:# httpd -l
檢視靜態編譯及動態編譯的模組:# httpd -M
更換使用httpd程式,以支援其它MPM機制:
在/etc/sysconfig/httpd配置檔案中,修改HTTPD=/usr/sbin/httpd.{worker,event}
注意:重啟服務程序方可生效。
MPM配置:
1)prefork的配置

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000
</IfModule>		

2)worker的配置

<IfModule worker.c>
StartServers         4
MaxClients         300
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>	

(10)DSO
配置指定實現模組載入:LoadModule <mod_name> <mod_path>
模組檔案路徑可使用相對路徑,相對於ServerRoot(預設/etc/httpd)。
(11)定義’Main’ server的文件頁面路徑
DocumentRoot ""
文件路徑對映:DoucmentRoot指向的路徑為URL路徑的起始位置,其相當於站點URL的根路徑;
(FileSystem) /web/host1/index.html --> (URL) /index.html
(12)站點訪問控制常見機制
可基於兩種機制指明對哪些資源進行何種訪問控制:
1)檔案系統路徑

<Directory  "">
...
</Directory>
						
<File  "">
...
</File>
						
<FileMatch  "PATTERN">
...
</FileMatch>

2)URL路徑

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

中“基於源地址”實現訪問控制:
(a) Options
後跟1個或多個以空白字元分隔的“選項”列表;
Indexes:指明的URL路徑下不存在與定義的主頁面資源相符的資原始檔時,返回索引列表給使用者;
FollowSymLinks:允許跟蹤符號連結檔案所指向的原始檔;
None:沒有選項;
All:全部選項;
(b) AllowOverride
與訪問控制相關的哪些指令可以放在.htaccess檔案(每個目錄下都可以有一個)中;
All:所有指令;
None:沒有指令;
© 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幾種形式。
(13)定義站點主頁面:
DirectoryIndex index.html index.html.var
(14)定義路徑別名
格式:Alias /URL/ "/PATH/TO/SOMEDIR/"
例:

DocumentRoot "/www/htdocs"
http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm 
/www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm 
						
Alias  /download/  "/rpms/pub/"
http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm 
/rpms/pub/bash-4.4.2-3.el6.x86_64.rpm

(15)設定預設字符集
AddDefaultCharset UTF-8
中文字符集:GBK, GB2312, GB18030
(16)日誌設定
日誌型別:訪問日誌和錯誤日誌。
錯誤日誌:

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”的值;即發出請求的應用程式;
(17)基於使用者的訪問控制
認證質詢:www-Authenticate:響應碼為401,拒絕客戶端請求,並說明要求客戶端提供賬號和密碼;
認證:Authorization:客戶端使用者填入賬號和密碼後再次傳送請求報文;認證通過時,則伺服器傳送響應的資源;
認證方式有兩種:basic明文認證和digest訊息摘要認證。
安全域:需要使用者認證後方能訪問的路徑,應該通過名稱對其進行標識,以便於告知使用者認證的原因;
使用者的賬號和密碼存放於何處?文字檔案、SQL資料庫,或ldap目錄儲存;
虛擬賬號:僅用於訪問某服務時用到的認證標識。
1)basic認證配置示例
(a) 定義安全域

<Directory "">
	Options None
	AllowOverride None
	AuthType Basic
	AuthName "String“
	AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"
	Require  user  username1  username2 ...
</Directory>

允許賬號檔案中的所有使用者登入訪問:Require valid-user
(b) 提供賬號和密碼儲存(文字檔案)
使用專用命令完成此類檔案的建立及使用者管理:
htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username
-c:自動建立此處指定的檔案,因此,僅應該在此檔案不存在時使用;
-m:md5格式加密;
-s:sha格式加密;
-D:刪除指定使用者;

2)基於組賬號進行認證
(a) 定義安全域

<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>

(b) 建立使用者賬號和組賬號檔案;
組檔案中每一行定義一個組:GRP_NAME: username1 username2 ...
(18)虛擬主機
站點標識: socket
1)IP相同,但埠不同;
2)IP不同,但埠均為預設埠;
3)FQDN不同;
有三種實現方案:
基於ip:為每個虛擬主機準備至少一個ip地址;
基於port:為每個虛擬主機使用至少一個獨立的port;
基於FQDN:為每個虛擬主機使用至少一個FQDN;
注意:一般虛擬主機不要與中心主機混用。因此,要使用虛擬主機,得先禁用’main’主機,禁用方法:註釋中心主機的DocumentRoot指令即可。
1)虛擬主機的配置方法:

<VirtualHost  IP:PORT>
	ServerName FQDN
	DocumentRoot  ""
</VirtualHost>

2)其它可用指令
ServerAlias:虛擬主機的別名,可多次使用;
ErrorLog;
CustomLog;
<Directory “”>

</ Directory>
Alias
3)基於IP的虛擬主機

<VirtualHost 172.16.100.6:80>
	ServerName www.a.com
	DocumentRoot "/www/a.com/htdocs"
</VirtualHost>

<VirtualHost 172.16.100.7:80>
	ServerName www.b.net
	DocumentRoot "/www/b.net/htdocs"
</VirtualHost>

<VirtualHost 172.16.100.8:80>
	ServerName www.c.org
	DocumentRoot "/www/c.org/htdocs"
</VirtualHost>

4)基於埠的虛擬主機

<VirtualHost 172.16.100.6:80>
	ServerName www.a.com
	DocumentRoot "/www/a.com/htdocs"
</VirtualHost>

<VirtualHost 172.16.100.6:808>
	ServerName www.b.net
	DocumentRoot "/www/b.net/htdocs"
</VirtualHost>

<VirtualHost 172.16.100.6:8080>
	ServerName www.c.org
	DocumentRoot "/www/c.org/htdocs"
</VirtualHost>

5)基於FQDN的虛擬主機

NameVirtualHost 172.16.100.6:80

<VirtualHost 172.16.100.6:80>
	ServerName www.a.com
	DocumentRoot "/www/a.com/htdocs"
</VirtualHost>

<VirtualHost 172.16.100.6:80>
	ServerName www.b.net
	DocumentRoot "/www/b.net/htdocs"
</VirtualHost>

<VirtualHost 172.16.100.6:80>
	ServerName www.c.org
	DocumentRoot "/www/c.org/htdocs"
</VirtualHost>						

(19)status頁面
LoadModule status_module modules/mod_status.so

<Location /server-status>
	SetHandler server-status
	Order allow,deny
	Allow from 172.16
</Location>

5、URL

基本語法:<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
params:引數,例如:http://www.magedu.com/bbs/hello;gender=f;
query:查詢條件,例如:http://www.magedu.com/bbs/item.php?username=tom&title=abc
frag:位置錨定,例如:
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html-single/Installation_Guide/index.html#ch-Boot-x86

6、常用命令

(1)curl
curl是基於URL語法在命令列方式下工作的檔案傳輸工具,它支援FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等協議。curl支援HTTPS認證,並且支援HTTP的POST、PUT等方法, FTP上傳, kerberos認證,HTTP上傳,代理伺服器, cookies, 使用者名稱/密碼認證, 下載檔案斷點續傳,上載檔案斷點續傳, http代理伺服器管道( proxy tunneling), 甚至它還支援IPv6, socks5代理伺服器,,通過http代理伺服器上傳檔案到FTP伺服器等等,功能十分強大。
MIME: major/minor,image/png,image/gif。
curl [options] [URL...]
curl的常用選項:
-A/–user-agent :設定使用者代理髮送給伺服器;
–basic:使用HTTP基本認證;
–tcp-nodelay:使用TCP_NODELAY選項;
-e/–referer :來源網址;
–cacert :CA證書 (SSL);
–compressed:要求返回是壓縮的格式;
-H/–header :自定義首部資訊傳遞給伺服器;
-I/–head:只顯示響應報文首部資訊;
–limit-rate :設定傳輸速度;
-u/–user <user[:password]>:設定伺服器的使用者和密碼;
-0/–http1.0:使用HTTP 1.0;
(2)elinks
elinks [OPTION]... [URL]...
-dump: 不進入互動式模式,而直接將URL的內容輸出至標準輸出;
(3)user/group
指定以哪個使用者的身份執行httpd服務程序;
User apache
Group apache
(4)使用mod_deflate模組壓縮頁面優化傳輸速度
適用場景:
1)節約頻寬,額外消耗CPU,同時,可能有些較老瀏覽器不支援;
2)壓縮適於壓縮的資源,例如文字檔案;
SetOutputFilter DEFLATE

# mod_deflate configuration

# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain 
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css

# Level of compression (Highest 9 - Lowest 1)
DeflateCompressionLevel 9
	 
# 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

(5)httpd自帶的工具程式
htpasswd:basic認證基於檔案實現時,用到的賬號密碼檔案生成工具;
apachectl:httpd自帶的服務控制指令碼,支援start和stop;
apxs:由httpd-devel包提供,擴充套件httpd使用第三方模組的工具;
rotatelogs:日誌滾動工具;
access.log -->
access.log, access.1.log -->
access.log, acccess.1.log, access.2.log
suexec:訪問某些有特殊許可權配置的資源時,臨時切換至指定使用者身份執行;
ab: apache bench;
(6)httpd的壓力測試工具
ab,webbench,http_load,seige,jmeter,loadrunner;
tcpcopy:網易開發,複製生產環境中的真實請求,並將之儲存下來;
ab [OPTIONS] URL
-n:總請求數;
-c:模擬的並行數;
-k:以持久連線模式測試;

7、httpd-2.4

(1)新特性
1)MPM支援執行為DSO機制,以模組形式按需載入;
2)event MPM生產環境可用;
3)非同步讀寫機制;
4)支援每模組及每目錄的單獨日誌級別定義;
5)每請求相關的專用配置;
6)增強版的表示式分析器;
7)毫秒級持久連線時長定義;
8)基於FQDN的虛擬主機也不再需要NameVirutalHost指令;
9)新指令,AllowOverrideList;
10)支援使用者自定義變數;
11)更低的記憶體消耗;
(2)新模組
1)mod_proxy_fcgi;
2)mod_proxy_scgi;
3)mod_remoteip;
(3)安裝httpd-2.4
依賴於:apr-1.4+, apr-util-1.4+, [apr-iconv];
apr: apache portable runtime;
1)CentOS 6:
預設:apr-1.3.9, apr-util-1.3.9
開發環境包組:Development Tools, Server Platform Development;
開發程式包:pcre-devel;
編譯安裝步驟:
(a) apr-1.4+
# ./configure --prefix=/usr/local/apr
# make && make install
(b) apr-util-1.4+
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
# make && make install
© httpd-2.4
# ./configure --prefix=/usr/local/apache24 --sysconfdir=/etc/httpd24 --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
# make && make install
自帶的服務控制指令碼:apachectl
2) CentOS 7:
# yum install httpd
配置檔案:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.modules.d/.conf
/etc/httpd/conf.d/
.conf
配置應用:
(a) 切換使用的MPM
編輯配置檔案/etc/httpd/conf.modules.d/00-mpm.conf,啟用要啟用的MPM相關的LoadModule指令即可。
(b) 基於IP的訪問控制
允許所有主機訪問:Require all granted
拒絕所有主機訪問:Require all deny
© 控制特定的IP訪問
Require ip IPADDR:授權指定來源的IP訪問;
Require not ip IPADDR:拒絕;
(d) 控制特定的主機訪問:
Require host HOSTNAME:授權指定來源的主機訪問;
Require not host HOSTNAME:拒絕指定來源的主機訪問;
HOSTNAME:主機名;
FQDN:特定主機
domin.tld:指定域名下的所有主機

<RequireAll>
	Require all granted
	Require not ip 172.16.100.2
</RequireAll>						

(4)虛擬主機
基於FQDN的虛擬主機也不再需要NameVirutalHost指令;

<VirtualHost *:80>
	ServerName www.b.net
	DocumentRoot "/apps/b.net/htdocs"
	<Directory "/apps/b.net/htdocs">
		Options None
		AllowOverride None
		Require all granted
	</Directory>
</VirtualHost>	

注意:任意目錄下的頁面只有顯式授權才能被訪問;
(5)毫秒級持久連線時長定義:KeepAliveTimeout #ms

8、HTTPS

https = http over ssl;
(1)SSL會話的簡化過程
1)客戶端傳送可供選擇的加密方式,並向伺服器請求證書;
2)伺服器端傳送證書以及選定的加密方式給客戶端;
3)客戶端取得證書並進行證書驗證:
如果信任給其發證書的CA:
(a) 驗證證書來源的合法性;用CA的公鑰解密證書上數字簽名;
(b) 驗證證書的內容的合法性:完整性驗證;
© 檢查證書的有效期限;
(d) 檢查證書是否被吊銷;
(e) 證書中擁有者的名字,與訪問的目標主機要一致;
4)客戶端生成臨時會話金鑰(對稱金鑰),並使用伺服器端的公鑰加密此資料傳送給伺服器,完成金鑰交換;
5)伺服器端用此金鑰加密使用者請求的資源,響應給客戶端;
注意:SSL會話是基於IP地址建立,所以單IP的主機上,僅可以使用一個https虛擬主機;
(2)配置httpd支援https
1)為伺服器申請數字證書;
測試:通過私建CA發證書
(a) 建立私有CA;
(b) 在伺服器建立證書籤署請求;
© 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]