abstract:HTTP協(xié)議: 超文本傳輸協(xié)議(HTTP,HyperText Transfer Protocol)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。所有的WWW文件都必須遵守這個標(biāo)準(zhǔn)。設(shè)計HTTP最初的目的是為了提供一種發(fā)布和接收HTML頁面的方法。1960年美國人Ted Nelson構(gòu)思了一種通過計算機(jī)處理文本信息的方法,并稱之為超文本(hypertext),這成為了HTTP超文本傳輸協(xié)議標(biāo)準(zhǔn)架
HTTP協(xié)議:
超文本傳輸協(xié)議(HTTP,HyperText Transfer Protocol)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。所有的WWW文件都必須遵守這個標(biāo)準(zhǔn)。設(shè)計HTTP最初的目的是為了提供一種發(fā)布和接收HTML頁面的方法。1960年美國人Ted Nelson構(gòu)思了一種通過計算機(jī)處理文本信息的方法,并稱之為超文本(hypertext),這成為了HTTP超文本傳輸協(xié)議標(biāo)準(zhǔn)架構(gòu)的發(fā)展根基。Ted Nelson組織協(xié)調(diào)萬維網(wǎng)協(xié)會(World Wide Web Consortium)和互聯(lián)網(wǎng)工程工作小組(Internet Engineering Task Force )共同合作研究,最終發(fā)布了一系列的RFC,其中著名的RFC 2616定義了HTTP 1.1。
HTTP是一個應(yīng)用層協(xié)議,有請求和響應(yīng)構(gòu)成,是一個標(biāo)準(zhǔn)的客戶端服務(wù)器模型。具有以下特點:
支持客戶/服務(wù)器模式
簡單快速:
客戶向服務(wù)器請求服務(wù)時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類型的不同。由于HTTP協(xié)議簡單,是的HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快
靈活:
HTTP允許傳輸任意類型的數(shù)據(jù)對象。正在傳輸?shù)念愋陀蠧ontent-Type加以標(biāo)記。
無連接:
無連接的含義是限制每次鏈接只處理一個請求。服務(wù)器處理完客戶的請求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時間。
無狀態(tài):
HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對于事務(wù)處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前的信息時,它的應(yīng)答就較快。
HTTP版本:
http/0.9:作為HTTP協(xié)議的第一個版本。是非常弱的,只定義了最基本的簡單請求和簡單回答。
http/1.0:新增了cache, MIME{MIME: multipurpose internet mail extensions(多用途的網(wǎng)際郵件擴(kuò)充協(xié)議)}機(jī)制,用非持久連接,即在非持久連接下,一個tcp連接只傳輸一個Web對象
http/1.1:新增了緩存功能,條件式請求;
speedy協(xié)議: SPDY是Google開發(fā)的基于TCP的應(yīng)用層協(xié)議,用以最小化網(wǎng)絡(luò)延遲,提升網(wǎng)絡(luò)速度,優(yōu)化用戶的網(wǎng)絡(luò)使用體驗。SPDY并不是一種用于替代HTTP的協(xié)議,而是對HTTP協(xié)議的增強(qiáng)。新協(xié)議的功能包括數(shù)據(jù)流的多路復(fù)用、請求優(yōu)先級以及HTTP報頭壓縮。谷歌表示,引入SPDY協(xié)議后,在實驗室測試中頁面加載速度比原先快64%。
http/2.0:在開放互聯(lián)網(wǎng)上HTTP 2.0將只用于https://網(wǎng)址,而 http://網(wǎng)址將繼續(xù)使用HTTP/1,目的是在開放互聯(lián)網(wǎng)上增加使用加密技術(shù),以提供強(qiáng)有力的保護(hù)去遏制主動攻擊。DANE RFC6698允許域名管理員不通過第三方CA自行發(fā)行證書。
HTTP協(xié)議HTTP協(xié)議通常承載于TCP協(xié)議之上,有時也承載于TLS或SSL協(xié)議層之上,這個時候,就成了我們現(xiàn)在常用的HTTPS,如下圖所示:
http協(xié)議的實現(xiàn):
開源實現(xiàn):httpd(apache), nginx, lighttpd, ...
C/S:
C(客戶端): browser(瀏覽器), user agent(用戶代理),
chrome, ie, firefox, safari, opera, ...
elinks, curl, wget, ...
S(服務(wù)器端):httpd(apache), nginx, lighttpd, ...
通信模型:
請求/響應(yīng)
一次完整的Http請求處理過程:
一次HTTP操作稱為一個事務(wù),其工作過程可分為七步
(1) 建立或處理連接請求 :接受或拒絕請求
(2) 接收請求:接受來自于網(wǎng)絡(luò)的請求報文中對某資源的一次請求的過程;接收請求的方式通常是并發(fā)訪問響應(yīng)模型(WEB I/O)
(3) 解析請求,處理請求:對請求報文進(jìn)行解析,并獲取請求的資源及請求方法等相關(guān)信息
(4) 加載用戶請求的資源;
(5) 構(gòu)建響應(yīng)報文,根據(jù)用戶請求的資源MIME類型以及URL重定向進(jìn)行報文響應(yīng);
(6) 發(fā)送響應(yīng)報文;
(7) 記錄訪問于日志中;
web資源:
URL:統(tǒng)一資源定位符(Uniform Resource Locator);是對可以從互聯(lián)網(wǎng)上得到的資源的位置和訪問方法的一種簡潔的表示,是互聯(lián)網(wǎng)上標(biāo)準(zhǔn)資源的地址?;ヂ?lián)網(wǎng)上的每個文件都有一個唯一的URL,它包含的信息指出文件的位置以及瀏覽器應(yīng)該怎么處理它。
URI:統(tǒng)一資源標(biāo)識符(Uniform Resource Identifier);是一類更通用的資源標(biāo)識符,URL 實際上是它的一個子集。URI 是一個通用的概念,由兩個主要的子集URL 和URN(統(tǒng)一資源名稱 (Uniform Resource Name, URN)) 構(gòu)成,URL 是通過描述資源的位置來標(biāo)識資源的,而URN則是通過名字來識別資源的,與它們當(dāng)前所處位置無關(guān)。
URL格式:
比如說,你想要獲取URL http://www.xxxx.com/index-fall.html。
URL 分以下三部分。
URL 的第一部分(http)是 URL 方案(scheme)。方案可以告知 Web 客戶端怎樣訪問資源。在這個例子中,URL 說明要使用HTTP 協(xié)議。
URL 的第二部分(www.xxxx.com)指的是服務(wù)器的位置。這部分告知Web 客戶端資源位于何處。
URL 的第三部分(/index-fall.html)是資源路徑。路徑說明了請求的是服務(wù)器上哪個特定的本地資源。
HTTP請求(HTTP Request)
所謂的HTTP請求,也就是Web客戶端向Web服務(wù)器發(fā)送信息,這個信息由如下三部分組成:
1.請求行
2.HTTP頭
3.內(nèi)容
請求行寫法是固定的,由三部分組成,第一部分是請求方法,第二部分是請求網(wǎng)址,第三部分是HTTP版本。 如: GET www.xxxx.com HTTP/1.1
請求行以一個方法符號開頭,以空格分開,后面跟著請求的URI和協(xié)議的版本,格式如下:
Method Request-URI HTTP-Version CRLF
其中 Method表示請求方法;Request-URI是一個統(tǒng)一資源標(biāo)識符;HTTP-Version表示請求的HTTP協(xié)議版本;CRLF表示回車和換行(除了作為結(jié)尾的CRLF外,不允許出現(xiàn)單獨的CR或LF字符)。
<method>(資源傳遞方法):GET,HEAD,POST, PUT, DELETE, OPTIONS, TRACE, ...
GET:從服務(wù)器獲取一個資源;
HEAD:只從服務(wù)器獲取文檔的響應(yīng)首部;
POST:向服務(wù)器發(fā)送要處理的數(shù)據(jù);
PUT:將請求的主體部分存儲在服務(wù)器上;
DELETE:請求刪除服務(wù)器上指定的文檔;
TRACE:追蹤請求到達(dá)服務(wù)器中間經(jīng)過的代理服務(wù)器;
OPTIONS: 請求服務(wù)器返回對指定資源支持使用的請求方法;
訪問資源:獲取請求報文中請求的資源
HTTP響應(yīng)(HTTP Response)
當(dāng)Web服務(wù)器收到HTTP請求后,會根據(jù)請求的信息做某些處理(這些處理可能僅僅是靜態(tài)的返回頁,或是包含Asp.net,PHP,Jsp等語言進(jìn)行處理后返回),相應(yīng)的返回一個HTTP響應(yīng)。HTTP響應(yīng)在結(jié)構(gòu)上很類似于HTTP請求,也是由三部分組成,分別為:
1.狀態(tài)行
2.HTTP頭
3.響應(yīng)正文
首先來看狀態(tài)行,一個典型的HTTP狀態(tài)如下: HTTP/1.1 200 OK
狀態(tài)行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服務(wù)器HTTP協(xié)議的版本;Status-Code表示服務(wù)器發(fā)回的響應(yīng)狀態(tài)代碼;Reason-Phrase表示狀態(tài)代碼的文本描述。
狀態(tài)代碼有三位數(shù)字組成,第一個數(shù)字定義了響應(yīng)的類別,且有五種可能取值:
1xx: 信息提示
2xx: 成功響應(yīng)
200:成功,請求的所有數(shù)據(jù)通過響應(yīng)報文的entity-body部分發(fā)送;ok
3xx: 重定向響應(yīng)
301:請求的URL執(zhí)行的資源已經(jīng)被刪除,但在響應(yīng)報文中通過首部location指明了資源現(xiàn)在所在的新位置:Moved Permanently
302:與301相似,但在響應(yīng)報文中通過location指明資源現(xiàn)在所在的臨時新位置:Found
304:客戶端發(fā)出了條件式請求,但服務(wù)器上的資源未曾發(fā)生改變,則通過響應(yīng)狀態(tài)碼通知客戶端:Not Modified
4xx: 客戶端錯誤
401: 需要輸入賬號和密碼認(rèn)證方能訪問資源
403:請求被禁止:Forbidden
404: 服務(wù)器無法找到客戶端請求的資源 : Not Found
5xx: 服務(wù)端錯誤
500:服務(wù)器內(nèi)部錯誤 : Internal Server Error
502:代理服務(wù)器從后端服務(wù)器收到一條偽響應(yīng) : Bad Gateway
事務(wù):request/response
request
<method> <url> <version>
HEADERS
<body>
reponse
<version> <status> <reason-phrase>
HEADERS
</body>
headers:
Name: Value1, value2, ...
Name: Value1, value2, ...
......
首部分類:
通用首部、請求首部、響應(yīng)首部、實體首部、擴(kuò)展首部
通用首部:
Connection: {close|keep-alive}
Date:報文創(chuàng)建的日期時間
Via:經(jīng)由,
Cache-Control:緩存控制;
Pragma:
請求首部:
Host:
Referer:跳轉(zhuǎn)至當(dāng)前頁面的上級資源;
User-Agent:用戶代理;
Client-IP:
Accept:可接收的MIME類型;
Accept-Language:
Accept-Encoding:gzip, defalte,
Accept-Charset:
...
響應(yīng)首部:
信息性首部:
Server:
協(xié)商類首部:
Accept-Range:服務(wù)器端可接受的請求類型范圍
Vary:其它首部列表
安全相關(guān)的首部:
WWW-Authenticate:認(rèn)證質(zhì)詢
Set-Cookie:
Set-Cookie2:
實體首部
Content-Encoding
Content-Language
Content-Lenth
Content-Location
Content-Type
...
Allow:允許使用的請求方法;
Location:
緩存相關(guān):
Etag:擴(kuò)展標(biāo)簽
Last-Modified:
Expires:
擴(kuò)展首部:
X-Forwarded-For
……
url:Uniform Resource Locator
scheme://host:port/path
完整格式:
scheme://[<user>[:<password>]@<host>[:<port>]/<path>;<params>?<query>#frag
params:參數(shù), ;param1=value1¶m2=value2
query:查詢字符串, ?field1=value1&field2=value2
frag:頁面錨定,#frag_id, 例如#ch1
httpd:
httpd是Apache超文本傳輸協(xié)議(HTTP)服務(wù)器的主程序。被設(shè)計為一個獨立運行的后臺進(jìn)程,它會建立一個處理請求的子進(jìn)程或線程的池。
httpd所具有的特性:
高度模塊化設(shè)計:core modules + standard modules + 3rd party modules
動態(tài)鏈接庫DSO: Dynamic Shared Object(動態(tài)共享對象)
多處理模塊MPM: multipath process modules (多道處理模塊)
prefork:process(進(jìn)程)多進(jìn)程模型
每進(jìn)程響應(yīng)一個請求; 一個主進(jìn)程負(fù)責(zé)生成n個子進(jìn)程,子進(jìn)程也稱為工作進(jìn)程,每個子進(jìn)程處理一個用戶請求,即便沒有用戶請求,也會預(yù)先生成多個空閑進(jìn)程,隨時等待請求到達(dá),最大不會超過1024個;
worker: thread(線程)多線程模型
每線程響應(yīng)一個請求;一個主進(jìn)程生成多個子進(jìn)程,每個子進(jìn)程負(fù)責(zé)生成多個線程,每個線程處理一個請求;如果有M個進(jìn)程,每個進(jìn)程有N個線程,則可處理的請求個數(shù)為:M*N
event: thread(線程)時間驅(qū)動模型
每進(jìn)程響應(yīng)N請求;一個主進(jìn)程,生成M個子進(jìn)程,每個進(jìn)程直接負(fù)責(zé)N個請求;可處理的請求個數(shù)為:M*N (注:在httpd-2.2版本中event為測試使用,在httpd-2.4中event可生產(chǎn)使用。)
http的功能特性:
CGI:Common Gateway Interface,通用網(wǎng)關(guān)接口;
虛擬主機(jī):基于IP,PORT,F(xiàn)QDN的虛擬主機(jī)。
反向代理:http, fcgi, wsgi, ajp, ...
負(fù)載均衡;
路徑別名;
豐富的用戶認(rèn)證機(jī)制:如basic和digest;
支持第三方模塊;
httpd的安裝:
httpd的安裝和其他軟件安裝的方式一樣,我們可以通過rpm包或源碼編譯的方式進(jìn)行安裝,rpm包的方式可以通過便捷的yum命令進(jìn)行安裝,“yum -y install httpd”即可,通過rpm包安裝的httpd其默認(rèn)工作目錄(根目錄):/etc/httpd,其中:
程序環(huán)境:
主程序文件:
/usr/sbin/httpd
模塊文件:
/usr/lib64/httpd/modules/*.so
主配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
/etc/httpd/conf.modules.d/*.conf
站點文檔路徑:
/var/www/html
日志文件路徑:
/var/log/httpd/
access_log:訪問日志
error_log:錯誤日志
Unit File:
usr/lib/systemd/system/httpd.service
自帶腳本:
/usr/sbin/apachectl
配置文件當(dāng)中的語法格式:
DIRECTIVE VALUE
指令 值
DIRECTIVE: 不區(qū)分字符大小寫;例如ServerRoot;
VALUE:除了文件系統(tǒng)路徑,大多數(shù)也不區(qū)分字符大小寫;
配置修改完成后:
(1) 測試語法;
(2) 讓服務(wù)程序重載配置文件:
centos6 ~]# service httpd reload
centos7 ~]# systemctl reload httpd.service
CentOS7相關(guān)命令:
啟動服務(wù)(等同于service httpd start)
systemctl start httpd.service
停止服務(wù)(等同于service httpd stop)
systemctl stop httpd.service
重啟服務(wù)(等同于service httpd restart)
systemctl restart httpd.service
查看服務(wù)是否運行(等同于service httpd status)
systemctl status httpd.service
開機(jī)自啟動服務(wù)(等同于chkconfig httpd on)
systemctl enable httpd.service
開機(jī)時禁用服務(wù)(等同于chkconfig httpd on)
systemctl disable httpd.service
查看服務(wù)是否開機(jī)啟動 (等同于chkconfig --list)
systemctl list-units --type=service
httpd-2.4的基本配置:
httpd配置文件httpd.conf中相關(guān)的內(nèi)容及相關(guān)說明
1、監(jiān)聽的地址和端口:
Listen [ip:]port
①IP省略時表示監(jiān)聽本機(jī)上所有可用的IP地址;
②Listen可重復(fù)使用多數(shù);默認(rèn)監(jiān)聽本地可用的所有地址;
例: Listen 172.16.100.11:80
Listen 172.16.100.11:8080
2、保持連接:
persistent connection:tcp連接建立后,資源獲取完成之后不會斷開連接,而是繼續(xù)等待請求其它資源;服務(wù)模式是保持連鏈接的,如何斷開?可以從數(shù)量和時間連個方面去限制。
定義開關(guān) KeepAlive On|Off
數(shù)量限制 MaxKeepAliveRequests 100
時間限制 KeepAliveTimeout 10
3、MPM:多路處理模塊
并發(fā)請求響應(yīng)的不同實現(xiàn),有三種模式(prefork,worker,event)前文已經(jīng)提到過。
httpd-2.2不支持同時編譯多個不同的MPM,rpm安裝的httpd-2.2提供了三個文件分別用于實現(xiàn)提供對不同的MPM的支持。確認(rèn)方法:ps aux| grep httpd 默認(rèn)為/usr/sbin/httpd,其為prefork;
查看模塊列表:
httpd -l:查看靜態(tài)編譯的模塊
httpd -M:查看所有模塊,包塊靜態(tài)編譯和DSO模塊
httpd -t -D DUMP_MODULES :顯示所有加載模塊,同于-M。
更換支持不同的MPM的主程序:
編輯 /etc/sysconfig/httpd
啟動變量:HTTPD
4、DSO:配置指令模塊加載
格式:LoadModule <mod_name> <modules/mod_file_name>
模塊路徑可使用相對路徑:
相對于ServerRoot指令的值來說;/etc/httpd/
5、定義Main Server的文檔頁面路徑
(1) DocumentRoot:站點文檔根路徑;,文件路徑的映射;
(2) ServerName:服務(wù)器名稱
DocumentRoot指向的路徑為URL起始地位置
如:一個文件的絕對路徑為/var/www/html/images/1.jpg,那么通過URL訪問時的路徑為:
http://server/images/1.jpg
6、站點路徑訪問控制
訪問控制機(jī)制:可以基于來源地址或基于賬號來進(jìn)行,定義的方式有兩種:
① 基于文件系統(tǒng)路徑:
<Directory "/PATH/TO/DIR">
</Directory>
<File "">
</File>
②基于URL進(jìn)行:
<Location "URL">
...
</Location>
<LocationMatch ~ "URL_PATTERN">
...
</LocationMatch>
7、Directory中的訪問控制定義
① Options:
Indexes Includes { FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews }
None=none
All:所有的都啟用
Indexes(索引):當(dāng)前訪問的路徑下無默認(rèn)主頁面文件存在,且沒有指定具體要訪問的資源時,會將此路徑下的所有資源以列表呈現(xiàn)給用戶;非常危險,不建議使用
FollowSymLinks:允許跟蹤符號鏈接,如果某頁面文件是指向DocumentRoot之外路徑上的其他文件時,將直接顯示目標(biāo)文件的內(nèi)容。
ExecCGI:允許執(zhí)行CGI腳本
② AllowOverride
httpd的訪問控制配置,允許每目錄單獨進(jìn)行;在每個目錄下建立一個.htaccess文件;
AllowOverride表示是否允許目錄中的.htaccess文件中的配置來覆蓋當(dāng)前配置段中的配置;
Options FileInfo AuthConfig Limit
All
None
③基于來源地址的訪問控制:
允許所有地址訪問:Require all granted
拒絕所有地址訪問:Require all denied
<RequireAll>
</RequireAll>
基于IP控制:
Require ip ADDRESS
Require not ip ADDRESS
ADDRESS:
ip
基于主機(jī)名控制:
Require host HOSTNAME
Require not host HOSTNAME
HOSTNAME:
FQDN
DOMAIN.TLD
8、定義默認(rèn)的主頁面:
DirectoryIndex index.html index.html.var
自左而右,找到首次匹配到的文件,就將其作為默認(rèn)主頁返回;
9、配置日志:
錯誤日志:
ErrorLog "/var/log/httpd/error_log"
LogLevel warn
Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
訪問日志:受限要定義日志格式,然后才能設(shè)置日志信息。通過關(guān)鍵字LogFormat來定義一個日志的格式:
LogFormat "FORMAT_STRINGS" LOG_FORMAT_NAME
如:LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
通過關(guān)鍵字CustomLog來設(shè)置訪問日志的存放路徑及格式信息:
CustomLog "/PATH/TO/LOG_FILE" LOG_FORMAT_NAME
注:"FORMAT_STRINGS"參數(shù)詳情請參考:
http://httpd.apache.org/docs/2.4/mod/mod_log_config.html#formats
10、路徑別名:
如DocumentRoot "/var/www/html",在/var/www/html/web/htdocs下面又有bbs/index.html,顯然我們通過url訪問的時候路徑是這樣的:
URL:http://www.xxxx.com/web/htdocs/bbs/index.html
此時我們可以使用Alias /URL/ "/path/to/some_directory"即
Alias /xxbbs/ "/var/www/html/web/htdocs/bbs" 來重新定義一個別名路徑,那么我們可以通過訪問新的url來訪問之前同樣的內(nèi)容。
格式:
Alias /URL/ /PATH/TO/SOME_DIR/
注:/ 相對應(yīng)
11、設(shè)定默認(rèn)字符集
AddDefaultCharset UTF-8
常用字符集:GBK,GB2312,GB18030
12、虛擬主機(jī):
主機(jī)標(biāo)識方式:
IP不同
PORT不同
ServerName:
模式:
<VirtualHost IP:PORT> ServerName DocumentRoot <Directory ""> ... Require all granted </DIrective> ErrorLog CustomLog </VirtualHost>
示例:
注:httpd-2.2中使用基于ServerName的虛擬主機(jī)時,要使用專用配置指令 NameVirtualHost IP:PORT
<VirtualHost 10.1.0.68:80> ServerName www1.a.com DocumentRoot "/vhosts/www1" <Directory "/vhosts/www1"> Options None AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 10.1.0.68:8080> ServerName www2.b.com DocumentRoot "/vhosts/www2" <Directory "/vhosts/www2"> Options None AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 10.1.0.69:80> ServerName www3.c.com DocumentRoot "/vhosts/www3" <Directory "/vhosts/www3"> Options None AllowOverride None Require all granted </Directory> </VirtualHost>
13、基于用戶的訪問控制:
Require user USERLIST
Require group GRPLIST
虛擬用戶: 只是用戶標(biāo)識,為了獲取某個資源。
認(rèn)證方式:
basic
digest
http協(xié)議認(rèn)證過程 :
認(rèn)證質(zhì)詢:
WWW-Authencate:響應(yīng)碼為401,拒絕客戶端請求,并說明用戶需要輸入正確的賬號和密碼之后方可訪問;
認(rèn)證:
Authorization:客戶端填入賬號和密碼,再次發(fā)送請求報文;認(rèn)證通過,服務(wù)器發(fā)送響應(yīng)內(nèi)容;
<Directory ""> Options None AllowOverride None AuthType Basic AuthName "STRING" AuthUserFile "" Require user USER1 USER2 ... </Directory>
賬號文件生成工具h(yuǎn)tpasswd
htpasswd [options] "/PATH/TO/HT_PASSWD_FILE" username
-c:創(chuàng)建此文件;
-m:md5加密密碼存放;
-s:sha加密
-D: 刪除指定用戶
示例:
<VirtualHost *:80> ServerName www1.a.com DocumentRoot "/vhosts/www1" <Directory "/vhosts/www1"> Options None AllowOverride None Require all granted </Directory> <Directory "/vhosts/www1/admin"> Options None AllowOverride None AuthType Basic AuthName "Admin Area, Enter your name/pass" AuthUserFile "/etc/httpd/conf/.htpasswd" Require valid-user </Directory> ErrorLog "logs/www1-error_log" CustomLog "logs/www1-access_log" combined </VirtualHost>
Require的使用方式:
(1) Require valid-user
(2) Require user USER1 USER2 ...
基于組進(jìn)行認(rèn)證:
<Directory "/vhosts/www1/admin"> Options None AllowOverride None AuthType Basic AuthName "Admin Area, Enter your name/pass" AuthUserFile "/etc/httpd/conf/.htpasswd" AuthGroupFile "/etc/httpd/conf/.htgroup" Require group GRPNAME1 GRPNAME 2 </Directory>
組賬號文件:
每行定義一個組
group_name: user1 user2 ...
示例1:
(1) 基于主機(jī)名實現(xiàn)三個虛擬主機(jī)
(2) 每虛擬主機(jī)使用獨立的訪問日志和錯誤日志
(3) 第三個虛擬主機(jī)的/admin要進(jìn)行用戶訪問認(rèn)證
(4) 在第二個虛擬主機(jī)上提供/status;
(5) 在第三個虛擬主機(jī)提供路徑別名/bbs,訪問其它文件系統(tǒng)路徑;
(6) 嘗試使用混合類型的虛擬主機(jī):基于IP,PORT和ServerName
[root@centos7~]# tree /vhosts/ /vhosts/ ├── www1 │ └── index.html ├── www2 │ └── index.html └── www3 ├── admin │ └── index.html ├── index.html └── test └── index.html [root@centos7 ~]# htpasswd -c -m /etc/httpd/conf.d/.htpasswd tom [root@centos7 ~]# htpasswd -m /etc/httpd/conf.d/.htpasswd jack [root@centos7 ~]# cat /etc/httpd/conf.d/.htpasswd tom:$apr1$KsgClzeF$3sjkA4SYzbO4rsLJ1Ry1F0 jack:$apr1$8CXU2TlX$uQt2LfZYK1yLWwF8oQD4F1 配置文件 [root@centos7 ~]# vim /etc/httpd/conf.d/vhosts.conf <VirtualHost *:80> ServerName www1.magedu.com DocumentRoot "/vhosts/www1" <Directory "/vhosts/www1"> Options None AllowOverride None Require all granted </Directory> ErrorLog "logs/www1-error_log" Customlog "logs/www1-access_log" combined </VirtualHost> <VirtualHost *:80> ServerName www2.magedu.com DocumentRoot "/vhosts/www2" <Directory "/vhosts/www2"> Options None AllowOverride None Require all granted </Directory> <Location /status> SetHandler server-status Require all granted </location> ErrorLog "logs/www2-error_log" Customlog "logs/www2-access_log" combined </VirtualHost> <VirtualHost *:80> ServerName www3.magedu.com DocumentRoot "/vhosts/www3" <Directory "/vhosts/www3"> Options None AllowOverride None Require all granted </Directory> <Directory "/vhosts/www3/admin"> Options None AllowOverride None AuthType Basic AuthName "Admin , Enter your name/passwd" AuthUserFIle "/etc/httpd/conf.d/.htpasswd" Require valid-user </Directory> Alias /bbs/ /vhosts/www3/admin/ ErrorLog "logs/www2-error_log" Customlog "logs/www2-access_log" combined </VirtualHost>
示例2
2:使用腳本實現(xiàn)基于主機(jī)名的虛擬主機(jī)按需創(chuàng)建;
每虛擬使用單獨的配置文件;
腳本可接受參數(shù),參數(shù)虛擬主機(jī)名稱;
#!/bin/bash Dir=/vhost/ Host() { cat <<EOF > /etc/httpd/conf.d/vhosts.conf <VirtualHost *:80> ServerName $Vhost.magedu.com DocumentRoot "$Dir$Vhost" <Directory "$Dir$Vhost"> Options None AllowOverride None Require all granted </Directory> </VirtualHost> EOF } HostLog() { cat <<EOF > /etc/httpd/conf.d/vhosts.conf <VirtualHost *:80> ServerName $Vhost.magedu.com DocumentRoot "$Dir$Vhost" <Directory "$Dir$Vhost"> Options None AllowOverride None Require all granted </Directory> ErrorLog "logs/$Vhost-error_log" CustomLog "logs/$Vhost-access_log" combined </VirtualHost> EOF } read -p "Input VirtualHost:(Hostname|quit) " Vhost until [[ $Vhost == "quit" ]];do read -p "Whether use Log:(y|n) " Log if [ $Log == "y" ];then mkdir -pv $Dir$Vhost &> /dev/null HostLog echo ""$Vhost".magedu.com" > $Dir$Vhost/index.html systemctl reload httpd else mkdir -pv $Dir$Vhost &> /dev/null Host echo ""$Vhost".magedu.com" > $Dir$Vhost/index.html systemctl reload httpd fi read -p "Input VirtualHost:(Hostname|quit) " Vhost done
14、curl命令
curl是基于URL語法在命令行方式下工作的文件傳輸工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等協(xié)議。curl支持HTTPS認(rèn)證,并且支持HTTP的POST、PUT等方法, FTP上傳, kerberos認(rèn)證,HTTP上傳,代理服務(wù)器, cookies, 用戶名/密碼認(rèn)證, 下載文件斷點續(xù)傳,上載文件斷點續(xù)傳, http代理服務(wù)器管道( proxy tunneling), 甚至它還支持IPv6, socks5代理服務(wù)器,,通過http代理服務(wù)器上傳文件到FTP服務(wù)器等等,功能十分強(qiáng)大。
語法:curl [options] [URL...]
curl的常用選項:
-A/--user-agent <string> 設(shè)置用戶代理發(fā)送給服務(wù)器
--basic 使用HTTP基本認(rèn)證
-e/--referer <URL> 來源網(wǎng)址
--cacert <file> CA證書 (SSL)
--compressed 要求返回是壓縮的格式
-H/--header <line>自定義首部信息傳遞給服務(wù)器
-I/--head 只顯示響應(yīng)報文首部信息
--limit-rate <rate> 設(shè)置傳輸速度
-u/--user <user[:password]>設(shè)置服務(wù)器的用戶和密碼
-0/--http1.0 使用HTTP 1.0
-X, --request <command>:自定義請求方法
另一個工具:elinks
語法:elinks [OPTION]... [URL]...
-dump: 不進(jìn)入交互式模式,而直接將URL的內(nèi)容輸出至標(biāo)準(zhǔn)輸出;
15、使用mod_deflate模塊壓縮頁面優(yōu)化傳輸速度
適用場景:
(1) 節(jié)約帶寬,額外消耗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
16、https, http over ssl
OpenSSL:
libcrpyto, libssl (ssl/tls), openssl
PKI:
CA,
SSL會話的簡化過程
(1) 客戶端發(fā)送可供選擇的加密方式,并向服務(wù)器請求證書;
(2) 服務(wù)器端發(fā)送證書以及選定的加密方式給客戶端;
(3) 客戶端取得證書并進(jìn)行證書驗正:
如果信任給其發(fā)證書的CA:
(a) 驗正證書來源的合法性;用CA的公鑰解密證書上數(shù)字簽名;
(b) 驗正證書的內(nèi)容的合法性:完整性驗正
(c) 檢查證書的有效期限;
(d) 檢查證書是否被吊銷;
(e) 證書中擁有者的名字,與訪問的目標(biāo)主機(jī)要一致;
(4) 客戶端生成臨時會話密鑰(對稱密鑰),并使用服務(wù)器端的公鑰加密此數(shù)據(jù)發(fā)送給服務(wù)器,完成密鑰交換;
(5) 服務(wù)用此密鑰加密用戶請求的資源,響應(yīng)給客戶端;
注意:SSL會話是基于IP地址創(chuàng)建;所以單IP的主機(jī)上,僅可以使用一個https虛擬主機(jī);
回顧幾個術(shù)語:PKI,CA,CRL,X.509 (v1, v2, v3)
配置httpd支持https:
(1) 為服務(wù)器申請數(shù)字證書;
測試:通過私建CA發(fā)證書
(a) 創(chuàng)建私有CA
(b) 在服務(wù)器創(chuàng)建證書簽署請求
(c) CA簽證
(2) 配置httpd支持使用ssl,及使用的證書;
# yum -y install mod_ssl
配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile
SSLCertificateKeyFile
(3) 測試基于https訪問相應(yīng)的主機(jī);
# openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]
17、httpd自帶的應(yīng)用程序
htpasswd:basic認(rèn)證基于文件實現(xiàn),用于生成賬號和密碼的程序;
htdbm
htdigest
apachectl:httpd自帶的服務(wù)控制腳本,支持start和stop等子命令;
apxs:- APache eXtenSion tool