http协议及httpd配置
一、HTTP
http協議全稱為超文本傳輸協議(hyper text transfer protocol),是一種應用層協議,監聽在80/tcp。所謂超文本就是使用html編程語言開發的純文本文件
1. 超文本標記語言
超文本標記語言(hyper text mark language)就是用來開發超文本文檔的, 通過一些標簽對文本進行修飾,客戶端的瀏覽器引擎負責解析這些標簽,將結果顯示在瀏覽器上
<html><head><title> TITLE</title></head><body><h1></h1><p> lianjie... <a href="https://www.busyops.com"> lianjie... </a></p><h2></h2></body> </html>2. HTTP協議版本
- HTTP/0.9:最原型版本,有很多的嚴重的設計缺陷,僅能夠實現簡單的資源交互,不支持多媒體內容,所以由于過于簡陋,很快就被HTTP/1.0版本取代
- HTTP/1.0:這是第一個被真正廣泛使用的版本,支持版本號、各種HTTP首部、HTTP請求的方法以及引入MIME,但仍然有很多問題,比如緩存機制設計的比較薄弱
- HTTP/1.1:增強了緩存功能,引入了長鏈接機制
- spdy:google為能夠加速http協議的資源獲取性能而專門設計的
- HTTP/2.0:2.0借鑒了spdy的優勢,對1.1進行了諸多改進,使得性能上有很大提升,所以google已經放棄對spdy的支持了
3. http事務
http的工作模式就是客戶端發送一次請求、服務端回應一次響應,而一次請求和響應過程就叫做http事務
4. MIME機制(Multipurpose Internet Mail Extesion)
http是一種文本協議,意思是只能傳輸文本,任何要發送的內容通通會編碼為艾斯克碼再進行發送,但是圖片是二進制格式的,強行將二進制編碼為文本對方收到會亂碼的,在早些時候http協議僅能夠實現超文本瀏覽,沒有任何圖片內容。后來http協議當中引入了mime機制之后才能支持多媒體瀏覽的。mime早期是為了smtp協議而設計的,smtp是一種古老的郵件協議,早期的時候也是只能傳輸文本的,但后來人們需要發送附件、發一些非文本文件,mime就可以將非文本數據編碼成文本,而后對方還能同樣的反向機制還原回來
Web服務器構建響應報文時,會基于MIME機制對內容進行分類,以實現構建響應報文時能夠明確標記資源內容類型
- 顯示指定:自己提前在服務器上將資源類型定義完成
- 魔法分類:服務器自行掃描內容并判斷類型
- 協商分類:服務器端和客戶端協商哪種類型最好,然后在決定發送哪個
媒體類型:每一種資源都有媒體類型,主要被MIME標記以后由MIME對它們分別使用不同的編碼方式對它們進行編碼,媒體類型標記決定了客戶端瀏覽器在訪問此資源是應該由哪個Web插件進行解析
格式:主類型/次類型 major/minor
5. cookie
http協議是無狀態的(stateless),服務器無法持續追蹤用戶來源,通過引用cookie機制解決,客戶端第一次訪問服務器時,服務器會發送cookie給客戶端,能唯一標識用戶信息,每個cookie都有作用范圍
- 胖cookie:將用戶的訪問記錄都存儲在用戶本地,這種容易被其他第三方的殺毒軟件竊取信息
- session:用戶的訪問記錄都存儲在遠端的服務器上
6. http請求首部和響應報文語法格式
請求報文和響應報文都有固定的格式,其第一行都稱為協議報文起始行。接著會跟上很多的<headers>,然后接兩個換行和<entity-body>部分,請求報文中如果沒用使用put或post方法,<entity-body>中的內容一般都是空的。
(1) 請求報文首部格式
<method> <request-URL> <version> <headers>兩次換行 <entity-body>① method
method叫做請求方法,標明客戶端希望服務器對資源執行的動作,就是客戶端告訴服務器端你應該做什么
- GET:從服務器獲取一個資源
- PUT:上傳,將請求的主體部分存儲在服務器端而不是被服務器處理,所以PUT方法中<entity-body>當中一定是包含內容的,此方法對服務器比較危險。要使用PUT方法需要服務器端開啟分布式版本協作功能(DAV)機制,但一般不會有人互聯網中公開的
- MOVE:請求服務器將指定頁面移至另一個網絡
- DELETE:刪除服務器上指定的文檔,此方法對服務器很危險
- TRACE:web服務器是可以被代理的,想知道一次資源請求到底經過了多少級代理,就可以使用這個方法
- HEAD:只從服務器獲取文檔的響應首部,意為著每一次服務器端在發響應內容給客戶端時,不發送數據內容,只發送http響應首部,包含 <request-URL>、<version>、<headers>
- POST:向服務器發送要處理的數據。服務器端通常是有一個表單提供給我們,我們填入些數據點提交,這些提交的數據都會放在請求報文的<entity-body>當中提交給服務器端,所以在使用POST方法時<entity-body>是有數據的,有時候注冊賬號、上傳賬號和密碼用到最多的就是post方法
- OPTIONS:可以請求服務器返回其指定資源支持的請求方法。比如很多服務器對某些資源允許HEAD、GET,但是不允許DELETE和PUT,這個時候如果知道一個資源支持哪些方法,就可以用options
② request-URL
請求的URL
③ version
使用的http協議版本,格式為HTTP/<major>.<minor>
④ headers
各種類型的headers
(2) 響應首部語法格式
<version> <status> <reason-phrase> <headers>兩次換行 <entity-body>---------------------------------- <version>:響應時使用的協議版本號 <reason-phrase>:原因短語,用來說明狀態碼簡要描述 <entity-body>:響應實體status
狀態碼,三位數字,就是服務器端告訴客戶端,你的請求發生了什么
- 1xx:目前正在使用的只有100和101兩種,這類狀態碼主要做額外信息提示的,沒有太多額外的意義
- 2xx:200-206,主要用來表示成功類的響應
- 200:成功,請求的所有數據通過響應報文的entity-body部分發送給你了,對應的原因短語為OK
- 201:上傳文件成功后顯示,對應的原因短語為CREATED
- 3xx:300-305,重定向類的狀態碼。本來請求的是某一資源,但是服務器端沒有把那個資源響應給你,而是給你重定向到別的位置
- 301:永久重定向,請求的URL資源已經被刪除,但服務器端會在響應報文中通過首部Location指明資源現在所處的新位置,下次客戶端請求這個資源時直接向新訪問即可。對應的原因短語為Moved Permanently(永久)
- 302:臨時重定向,與301相似,也會在響應報文中通過Location首部指明資源現在所處的臨時新位置,不過將來還有可能在回來,下次客戶端請求這個資源時依然會向老位置詢問。對應的原因短語為Found
- 304:表示客戶端發出了條件式請求,也就是說客戶端請求資源時會問服務端這個資源在上次我請求過以后有沒有發生改變,如果發生了變化,服務器就會告訴客戶端發生變化了,并發送新資源給客戶端。如果未變化,服務器端會告訴客戶端,資源沒變化,你直接使用你緩存的資源就可以了,對應的原因短語為Not Modified
- 4xx:400-415,表示客戶端類錯誤
- 401:表示需要輸入賬號和密碼,當客戶端請求需要認證的資源時,服務器端要求客戶端輸入賬號和密碼才能訪問,所以先返回個錯誤給客戶端。對應的原因短語為Unauthorized
- 403:請求被禁止,比如服務端禁止某個IP訪問。對應的原因短語為Forbidden
- 404:資源請求失敗,無法找到客戶端請求的資源。對應的原因短語為Not Found
- 405:你使用的方法不被允許、不支持,對應的原因短語為Method Not Allowed
- 5xx:500-505,表示服務器端的錯誤,比如你請求的資源服務器應該響應給你的,但是服務器資源因為自己內部有語法錯誤運行不成功,這就沒法響應了
- 500:服務器內部錯誤,對應的原因短語為Internal(內部的) server Error
- 502:代理服務器從上游服務器收到一條偽響應,不是真正的響應,是錯誤的響應,對應的原因短語為Bad Gateway
- 503:服務暫時不可用,對應的原因短語為Service Unavailable
7. headers
用來標記請求或響應的屬性,每個請求或響應報文可使用任意個header。通用格式為header名稱后面跟一個冒號,而后在跟上一個可選空格,(有沒有都行,但大多數都在,所以就成了標準語法)接著是一個值
(1) headers示例
請求header示例
Accept: text/html,application/xhtml+xml, Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Cache-Control: max-age=0 Connection: keep-alive Host: www.bilibili.com Referer: https://www.bilibili.com/ Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64)響應header示例
Access-Control-Allow-Credentials: true Access-Control-Allow-Headers: Origin, Access-Control-Allow-Origin: https://www.bilibili.com Connection: keep-alive Content-Encoding: gzip Content-Type: application/json;charset=UTF-8 Date: Thu, 22 Nov 2018 13:19:22 GMT Server: Apache-Coyote/1.1 Transfer-Encoding: chunked X-Cache: BYPASS from ks-bj6-webcdn-11.hdslb.com(2) headers分類
① 通用首部
請求與響應報文都可用的首部
- Date:報文的創建時間
- Connection:通常表示這次鏈接是長鏈接或是短連接,常見的值如keep-alive、close
- Via:經由。顯示報文經過的中間節點(代理服務器),這些信息是由服務器管理員或網站程序員定義的,可以設置不顯示
- Cache-Control:控制緩存的生效機制,這是http1.1才有的功能
- Pragma:偶爾在HTTP\1.1中還會出現,是為了兼容HTTP\1.0的,也是跟緩存相關
② 請求首部
- Accept:客戶端通知服務器自己能夠接收的媒體類型(MIME類型)
- Accept-Charset:客戶端通知服務器自己能夠接收的字符集類型
- Accept-Encoding:編碼格式,客戶端通知服務器端自己能接收哪些壓縮機制,如gzip、deflate、sdch
- Accept-Language:客戶端通知服務器端自己能接收哪些語言編碼的頁面
- Host:請求的服務器名稱和端口,大多數端口都省略了
- Referer:包含了當前正在請求資源的上一級資源
- User-Agent:客戶端代理,說白了就是瀏覽器類型,現在的瀏覽器向服務器發請求一般都會附帶自己的瀏覽器類型,因此服務器就是因此來給你返回特定站點
- Client-IP
安全請求首部
- Authorization:向服務器發送認證信息,如賬號密碼
- Cookie:客戶端向服務器端發送身份標識
- Cookie2:版本2
條件式請求首部
- Expect:表示客戶端期望服務器發什么樣的信息
- If-Modified-Since:自從指定時間后資源有沒有修改過
- If-Unmodified-Since:自從指定時間后資源是否沒修改過
- If-None-Match:本地緩存中存儲文檔的Etag標簽是否與服務器端文檔的Etag不匹配,Etag是擴展標簽
- If-Match:本地緩存中存儲文檔的Etag標簽是否與服務器端文檔的Etag匹配
③ 代理請求首部
- Proxy-Authorization:與代理服務器進行認證是用到的首部
④ 響應首部
信息性響應首部
- Age:響應持續時長,指這個資源有限期限
- Server:指服務器程序的版本號或者是服務器程序名稱
協商性響應首部
某資源有多種表示方法時使用
- Accept-Ranges:服務器端通知客戶端可自己接受的請求類型
- Vary:首部列表,服務器會根據此列表挑選最適合的版本發給客戶端
安全響應首部
- Set-Cookie:向客戶端設置Cookie
- Set-Cookie2:向客戶端設置Cookie2
- WWW-Authenticate:來自服務器對客戶端的質詢認證表單
⑤ 實體首部
用來標示實體自己的相關信息的,很多時候用來表示報文中內容的相關屬性
跟內容格式相關
- Allow:列出對此實體可使用的請求方法,使用options時通常有這個響應
- Location:告知客戶端真正實體位于何處,這是在重定向時使用的
- Content-Encoding:內容的編碼格式
- Content-Language:內容使用的語言
- Content-Length:內容的長度
- Content-Location:實體真正的所處位置
- Content-Range:在整個資源中此實體表示的字節范圍
- Content-Type:實體的對象類型
跟緩存相關
- Etag:資源的擴展標簽?;跇撕炞鰲l件請求時會使用,在網絡上圖片不會經常改動,當客戶端第一次請求資源時,服務器在返回狀態碼200的同時還會返回該圖片的簽名Etag(可以理解為圖片的指紋)。接著客戶端再次訪問該圖片時,就會去服務器校驗指紋信息, 如果圖片沒有變化則直接使用緩存里的圖片,從而減輕了服務器的負擔。也就是說二次訪問返回狀態碼為304,瀏覽器就會從本地緩存里面取圖片,節省了圖片在網絡上傳輸的時間
- Expires:內容過期時間
- Last-Modified:最后一次修改時間
8. Web資源
請求和響應中的內容叫web資源(Web resource),這種資源有兩種類型,我們現在看到的網頁都是通過多個資源組成的,每個資源都需要單獨請求
- 常見的靜態資源:.jpg .gif htm txt .js .css .mp3,靜態資源是服務端無需額處理,客戶端請求時就直接發送給客戶端就可以了
- 常見的動態資源:.php .jsp,服務端需要執行程序作出處理,將處理結果發送至客戶端
web資源能支持這么多種類型,就是因為http協議中引入了mime機制
9. URL
統一資源定位符(Uniform Resource Locator),在請求或響應web資源時需要明確指出請求資源的位置,而url就是用來描述服務器某特定資源的位置
基本語法:<scheme>://<user>:<passwd>@<host>:<Port>/<Path>;<params>?<query>#<frag>
10. http的請求過程
- 第一步:建立連接。服務器端要判斷是否接受客戶端請求,如果要接受請求則建立鏈接
- 第二步:接受請求。接收來自于網絡上某主機請求報文中對某資源的一次請求
- 第三步:處理請求。服務器端對請求報文進行解析,從而并獲知客戶端請求的資源及請求方法等相關信息
- 第四步:獲取資源。服務器端根據客戶端所請求的資源,向本地磁盤發起I/O請求從而獲取資源
- 第五步:構建響應報文。一旦服務器端拿到了資源,就開始構建響應報文并以此響應客戶端請求,所謂構建響應報文就是在這個資源的外部加上響應報文的首部
- 第六步:發送響應報文
- 第七步:記錄日志
11. 并發訪問響應模型(Web I/O)
服務器同時響應多個用戶請求的方式
- 單進程I/O結構:啟動一個進程處理用戶請求,而且一次只處理一個,多個請求被串行響應
- 多進程I/O結構:兩級進程結構,主控進程負責接收用戶請求,而后把請求分發給子進程,每個子進程響應一個請求
- 復用I/O結構:一個進程響應N個請求,有兩種機制
- 多線程模型:一個進程生成N個線程,每個線程響應一個用戶請求,但是此種方式線程內存空間都是共享的,可能會出現堵塞的情況
- 事件驅動(event-driven):一個進程可以響應多個請求,內部沒有線程,通過事件回調機制完成
- 復用的多進程I/O結構:啟動多個進程,每個進程響應N個請求
二、http服務器程序
http是一個協議,而協議必須有實現方式,web服務器程序就是http協議的實現
1. 常見的靜態web服務器程序
- httpd:apache,a patchy server后來叫apache
- nginx
- lighttpd:德國人研發的Web服務器,性能與nginx不相上下的Web服務器
2. 應用程序服務器
不單能服務靜態內容,又能解析動態內容
(1) 輕量級
- IIS:解析asp
- tomcat:著名的jsp容器
- jetty:在google當中被廣泛使用的輕量級jsp容器
- jboss:早期時候被紅帽購買的第三方組織,提供專業級jsp服務器解決方案的應用程序,是二次封裝的tomcat
(2) 重量級
- webshpere:IBM公司的重量級jsp容器,通常在企業級部署時使用
- weblogic:早期是小公司研發的,后來被BEA公司收購,對它做了大規模的改進,使得weblogic也占據了大量的市場
- oc4j:Oracle公司開發,后來Oracle收購了BEA,于是就專注weblogic的維護了
互聯網上有一個著名的數據挖掘站點,它會統計過去一段時間內web站點使用的web服務器的程序比例。網址為www.netcraft.com
3. 網站衡量指標
- PV:page view,用戶完成一次完整的頁面訪問叫一個pv,注意PV和一次資源請求是不一樣的
- UV:user view,統計有多少個用戶訪問
- IP:獨立的瀏覽量,這個數一定會小于uv的
計算網站帶寬:假如一個資源的大小為5K、用戶并發量為1000,那么服務器帶寬至少應該準備5M
三、httpd的簡介
httpd也稱為apache,據說是由美國的一個組織開發的最初版本。這個組織曾經為了開發一個完整的web服務器軟件,從而召集了很多優秀的工程師,當開發成功后這個項目組就解散了。而開發人員就散布于各大互聯網公司,但是這些工程師對此前研發的這個程序仍然懷有一份感情,不舍得這個軟件沒落了。于是他們就各自通過互聯網進行協作,通過打補丁的方式維護這個web服務器。后來,這個服務器程序就被戲謔的稱為a patchy server(一個充滿了補丁的服務器),在后來就被簡寫成了apache。現在httpd是由apache這個組織負責維護的,其成立后的兩年內就讓httpd程序占據了60%的市場份額。隨著組織的影響力越來越大,于是就成立了軟件基金會(ASF),專門扶持更多的開源項目
1. httpd的特性
- 高度模塊化設計:是由core加各種modules組成
- DSO:動態共享對象(Dynamic Shared Object),支持模塊的動態裝載
- MPM:多路處理模塊,實現多種不同的I/O訪問模型。prefork、worker、event
- CGI:一種動態網站技術的接口
- 支持虛擬主機:一臺物理服務器可以服務多個網站
- 支持主機反向代理:將用戶的訪問發送至后端的主機
- 支持負載均衡
- 支持路徑別名
- 豐富的用戶認證機制
- 支持第三方模塊
2. MPM
MPM叫做多路處理模塊,它是httpd上實現并發訪問模型的幾種機制
- prefork:父進程負責管理子進程,每個進程響應一個請求,即便沒有用戶請求時,也會生成多個空閑進程,隨時等待請求到達
- worker:父進程管理子進程,子進程通過線程響應用戶請求,每個線程響應一個請求
- event:事件驅動模型,父進程管理子進程,子進程通過事件驅動機制直接響應多個請求
3. httpd 相關的安裝包
- httpd:主程序包
- httpd-devel:對httpd做二次開發時用到的包
- httpd-manual:httpd的手冊
- httpd-toosl:httpd相關的測試工具
- mod_ssl:httpd開啟ssl需要的包
4. rpm方式安裝httpd配置文件路徑
(1) rpm安裝
直接使用yum install httpd -y即可,分析依賴關系時會自動將httpd-tools也安裝上。如果將來可能無法訪問互聯網,也可以將httpd-manual(手冊包)一并安裝
(2) 配置文件路徑
① httpd 2.2
httpd2.2中,主程序有三個用于啟用不同的MPM,需要哪個就啟動哪個。如果是編譯安裝的話,必須將三個都編譯才行
- /etc/httpd/conf/httpd.conf:主配置文件
- /etc/httpd/conf.d/*.conf:為httpd.conf提供額外配置片段
- /etc/rc.d/init.d/httpd:服務腳本文件
- /usr/sbin/httpd:主程序文件
- /usr/sbin/httpd.worker:主程序文件
- /usr/sbin/httpd.event:主程序文件
- /usr/sbin/apachectl:輔助的程序腳本
- /usr/lib64/httpd/modules/mod_*.so:模塊文件路徑
- /var/www/html:默認網頁存放路徑
- /var/log/httpd/:日志文件目錄
② httpd 2.4
- /etc/httpd/conf:配置文件目錄
- /etc/httpd/conf/httpd.conf:主配置文件
- etc/httpd/conf.d/*.conf:為httpd.conf提供額外配置片段
- /etc/httpd/conf.modules.d/*.conf:專門配置模塊工作特性的配置文件,httpd2.2沒有這個目錄
- /usr/sbin/httpd:主程序文件
- /usr/sbin/apachectl:輔助的程序腳本
- /usr/lib/systemd/system/httpd.service:systemd unit文件
- /usr/lib64/httpd/modules/mod_*.so:模塊文件路徑
- /var/www/html:默認網頁存放路徑
- /var/log/httpd/:日志文件目錄
5. 編譯安裝httpd
httpd依賴于arp、apr-util、apr-icon,apr就是apache portable runtime,意為apache運行環境,類似apache虛擬機,因為apache是一個跨平臺工具,不同的操作系統互相調用接口不相同,2.4需要1.4以上版本的apr
(1) 安裝apr
./configure --prefix=/usr/local/apr make && make install ./configure --prefix=/usr/local/arp-util --with=/usr/local/apr make && make install.apr安裝完畢后,需要安裝開發環境pcre-devel(2) 編譯安裝httpd
./configure --prefix=/usr/local/apache --sysconf=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most –enable -mpms-shared=all --with-mpm=prefork
四、配置httpd配置
在httpd 2.2中將配置文件邏輯分為三段全局環境段(Global Environment)、主服務器配置段(Main server configuration)、虛擬主機配置段(Virtual Hosts),但是在httpd 2.4中配置分段的概念已經弱化了。不過二者配置格式是一致的,都需要使用指令后跟一個值配置,指令不區分大小寫,但是值要是定義路徑時,大小寫取決于文件系統
1. 監聽端口
文件為:/etc/httpd/conf/httpd.conf
Listen:格式為Listen [IP:]Port [protocol],省略ip表示監聽所有地址,而后面的協議用來規定此Linten的端口只能通過哪種協議訪問,常用于SSL,比如Listen 8443 https。如果修改了監聽端口需要重啟才能生效,但是如果添加了監聽端口重載下配置即可。Listen可以應用多次
2. 長連接
文件為:/etc/httpd/conf/httpd.conf
KeepAlive on|off:持久連接(Persistent Connection),http協議是基于tcp實現的,每一次的http事務都會三次握手、四次斷開,嚴重浪費帶寬資源。那么就可以啟用長連接機制,讓客戶端僅需建立一次連接,請求完畢后再斷開。但是為了更好的保證資源不被浪費,長連接從兩個維度進行了限制,一是請求資源限制,二是超時時長限制,當二者中有一個達到閾值時就自動斷開連接,下一次http事務需要重新進行三次握手、四次斷開。對并發訪問量較大的服務器,持久連接功能會導致有些請求的得不到響應
- MaxkeepAliverequests #:數量限制,獲取規定的資源數后就斷開連接,默認是100個
- KeepAliveTimeout #[ms]:持久連接時間限制,httpd 2.4支持毫秒級持久時間,使用毫秒級別需要在后面加上ms
3. MPM更換
確認當前運行的是哪個模塊使用命令ps aux | grep httpd
(1) httpd 2.2
對于rpm安裝的httpd 2.2來講,為了支持不同MPM機制,其提供了三個二進制文件,分別為/usr/sbin/httpd、/usr/sbin/httpd.worker、/usr/sbin/httpd.event,編輯vim/etc/sysconfig/httpd,修改里面HTTPD=對應的值即可
(2) httpd 2.4
編輯配置文件/etc/httpd/conf.modules.d/00-mpm.conf,在其中將想要啟動的mpm注釋信息去掉即可,也就是LoadModule關鍵字對應的值
4. prefork工作特性配置
文件為:/etc/httpd/conf/httpd.conf
- startservers:服務啟動后立即創建多少個子服務進程,每個子進程響應一個請求
- minspareservers:最少空閑子進程數
- maxspareservers:最大空閑子進程數
- serverlimit:對maxclients做限定,在服務進程生命周期內,允許啟動的進程最大值
- maxclients:最大允許啟動的子進程數量
- maxrequestperchild:一個進程最多能響應多少次請求,達到閾值后自動關閉這個子進程,定義為0表示永不過期
5. worker工作特性配置
文件為:/etc/httpd/conf/httpd.conf
- startservers:服務啟動后立即創建多少個子進程
- minsparethreads:最少空閑線程
- maxsparethreads:最大空閑線程
- threadsperchild:每個進程最大啟動的線程數
- maxclients:最大并發請求數
- maxrequestperchild:每個線程響應的最大請求次數,0表示不做限制
6. event工作特性配置
7. DSO機制
使用命令httpd -M查看模塊時,后面顯示為shared類型的模塊都是可以LoadModule關鍵字動態裝卸載的。指定模塊路徑可使用相對地址路徑,相對于主配文件ServerRoot關鍵字指向的路徑,默認路徑為/etc/httpd/modules,這個路徑是個鏈接,指向了/usr/lib64/httpd/modules,如果需要添加第三方模塊就可以編譯完成后將模塊放置在這個路徑,接著使用LoadModule關鍵字進行裝載
8. 中心主機相關指令
- DocumentRoot:定義中心主機的網頁文檔路徑,默認為/var/www/html/
- ServerName:定義中心主機名稱,格式為ServerName [scheme://]FQDN[:port],用于定義當前主機域名
- DirectoryIndex:定義默認頁面
- user/group:指定以哪個用戶的身份運行進程
- AddDefaultCharset:設定默認字符集
9. 訪問控制機制
可基于三種方式指明對哪些資源進行訪問控制
(1) 文件系統路徑
- <Directory ""> </Directory>:對目錄文件做控制
- <File ""> </File>:對單個文件做控制
- <FileMatch ""> </FILEMatch>:根據正則表達式匹配做控制,但建議不使用,因為每次匹配時要調用正則表達式匹配引擎,效率會降低
(2) URL路徑
可以明確指明限制哪些請求方法
- <Location ""> </Localtion>
- <LocationMatch ""> </LocaltionMatch>
10. 配置Directory訪問控制
(1) httpd 2.2
使用<Directory ""> </Directory>將配置段包含,其中可使用的指令如下
- options:定義當不存在主頁時,用戶對此目錄下的資源訪問機制,可以多參數共存,多項指令可以使用空白字符分割All: Indexes:允許索引目錄 FollowSymLinks:允許索引目錄,意思將目錄中所有文件以索引形式展示 SymLinksifOwnerMatch:符號鏈接文件和源文件屬主是同一個用戶時允許追蹤 AllowOverride:是否允許當前配置去覆蓋每一個網站頁面路徑下的.htaccess
- Order:檢查次序
- Allow from IP:允許某個ip地址或網絡地址訪問,默認為Allow from all
- Deny from IP:拒絕某個IP或網絡地址訪問Deny from all
(2) httpd 2.4
使用<Directory ""> </Directory>將配置段包含,其中可使用的指令如下
- options:定義當不存在主頁時,用戶對此目錄下的資源訪問機制,可以參數有很多,多項指令可以使用空白字符分割All:啟用所有選項,除了MultiViews None:什么選項都不啟用 Indexes:允許索引目錄,意思將目錄中所有文件以索引形式展示 FollowSymLinks:允許跟蹤符號鏈接文件所指向的源文件 SymLinksifOwnerMatch:符號鏈接文件和源文件屬主是同一個用戶時允許追蹤 AllowOverride:是否允許當前配置去覆蓋每一個網站頁面路徑下的.htaccess。
- Require [not] ip | host:拒絕或允許某個IP或網段訪問,當IP有多個時需要使用子配置<Requireall>或<Requireany>將其包含,拒絕所有和允許所有使用Require all denied和Require all granted
11. 配置路徑別名
(1) httpd 2.2
直接在配置文件中加入Alias /URL/ "/PATH/TO/SOMEDIR/"
(2) httpd 2.4
- 在配置文件中加入Alias /URL/ "/PATH/TO/SOMEDIR/"
- 使用<Directory>配置塊對/PATH/TO/SOMEDIR/進行授權
12. 配置日志
(1) 定義訪問日志格式
- LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined:通過LogFormat定義日志格式,后面給這個格式起個名稱用于后面引用
使用CustomLog "logs/access_log" combined定義日志路徑及啟用哪個日志格式
(2) 錯誤日志
- ErrorLog "logs/error_log":定義錯誤日志路徑
- LogLevel warn:debug、info、notice、warn、error、crit、alert、emerg
13. 用戶認證質詢
對指定的頁面資源提供賬號密碼認證功能,這個機制是http協議內建的,
(1) 認證過程
- 第一步:當客戶端請求需要認證的資源時,服務器端會向客戶端發送認證質詢響應首部(WWW-Authenticate),響應碼為401并拒絕客戶端請求,要求客戶端輸出賬號密碼
- 第二步:客戶端填入賬號密碼后發送一個請求認證的首部(Authorization)
- 第三步:認證通過則向客戶端發送響應資源
(2) 認證類型
- basic:明文認證,這種方式會以明文的方式發送賬號密碼,極度不安全
- digest:消息摘要認證,使用單向加密方式傳出加密后的認證密碼結果
(3) 認證配置
① 生成密碼文件
使用命令:htpasswd命令,格式:htpasswd [options] passwdfile name [passwd]
optons:-c:自動創建passwordfile:因此應該在第一次添加用戶時使用-m:MD5加密用戶密碼-s:sha1:加密用戶密碼-D:刪除指定用戶-b:直接在命令中指定密碼 注:文件放在/etc/httpd/conf.d/.htpasswdhtpasswd -c -s /etc/httpd/conf.d/.htpasswd tom
htpasswd -b -s /etc/httpd/conf.d/.htpasswd mike 123456
② 對用戶進行授權
/etc/httpd/conf.d/admin.conf<Directory "/var/www/html/admin">options NoneAllowOverride NoneAuthType BasicAuthName "Please enter user and passwd."AuthUserFile "/etc/httpd/conf.d/.htpasswd"Require valid-user </Directory>如果僅授權個別用戶使用 Require user tom 即可③ 對組進行授權
- 第一步:使用htpasswd命令創建密碼文件
- 第二步:創建組定義文件,組文件手動創建,每一行定義一個組:GRP_NAME: username
- 第三步:在配置文件中進行授權
? digest:消息摘要;
c) 需要用戶認證后方能訪問的路徑叫安全域;
d) 虛擬賬號:僅用于訪問某服務時用到的認證標識;
14. 虛擬主機
互聯網上有些站點訪問量非常小,一臺物理服務器去承載一個站點太浪費了,因此可以使用單臺物理服務器承載多個站點,這就需要用到虛擬主機,每一個虛擬主機承載一個獨立的域名,維護自己獨立的網頁路徑。這里需要注意,httpd 2.2虛擬主機不要與中心主機混用,如要使用虛擬主機,先禁用中心主機,只需注釋掉DocumentRoot就能實現。而在httpd 2.4中直接定義虛擬主機即可。另外,每個虛擬主機最好能分開定義日志文件
(1) 基于ip的虛擬主機
vim /etc/httpd/conf.d/virtualhost.conf<VirtualHost 192.168.1.200:80>ServerName web1.busyops.comDocumentRoot "/vhosts/web1/htdocs"<Directory "/vhosts/web1/htdocs">options NoneAllowOVerride NoneRequire all granted</Directory></VirtualHost><VirtualHost 192.168.1.201:80>ServerName web2.busyops.comDocumentRoot "/vhosts/web2/htdocs"<Directory "/vhosts/web2/htdocs">options NoneAllowOVerride NoneRequire all granted</Directory></VirtualHost>(2) 基于端口的虛擬主機
基于端口區分虛擬主機需要使用Listen關鍵字啟用端口
<VirtualHost 192.168.1.200:80>ServerName web1.busyops.comDocumentRoot "/vhosts/web1/htdocs"<Directory "/vhosts/web1/htdocs">options NoneAllowOVerride NoneRequire all granted</Directory></VirtualHost>Listen 8080 <VirtualHost 192.168.1.200:8080>ServerName web2.busyops.comDocumentRoot "/vhosts/web2/htdocs"<Directory "/vhosts/web2/htdocs">options NoneAllowOVerride NoneRequire all granted</Directory></VirtualHost>(3) 基于域名的虛擬主機
<VirtualHost 192.168.1.200:80>ServerName www.web1.comDocumentRoot "/vhosts/web1/htdocs"<Directory "/vhosts/web1/htdocs">options NoneAllowOVerride NoneRequire all granted</Directory></VirtualHost><VirtualHost 192.168.1.200:80>ServerName www.web2.comDocumentRoot "/vhosts/web2/htdocs"<Directory "/vhosts/web2/htdocs">options NoneAllowOVerride NoneRequire all granted</Directory></VirtualHost>注意:在httpd 2.2中,如果啟用基于主機名稱的虛擬主機,需要將NameVirtualHost項啟用
15. httpd內建的status頁面
以虛擬主機為例,編輯器配置文件在其中加入<Location>定義
<VirtualHost 192.168.1.200:80>ServerName www.web1.comDocumentRoot "/vhosts/web1/htdocs"<Directory "/vhosts/web1/htdocs">options NoneAllowOVerride NoneRequire all granted</Directory><Location /admin-status>SetHandler server-statusRequire ip 192.168.1.208</Location></VirtualHost> 進程槽位狀態_:空閑進程W:正在發送響應的S:正在啟動的R:正在接受用戶請求K:保持連接D:正在做DNS查詢C:正在斷開連接L:正在記錄日志G:正在優雅終止I:正在空閑清理進程.:沒啟動在httpd 2.2的主配文件中,可以啟用ExtendedStatus On讓status頁面顯示的更加詳細
16. 頁面壓縮
壓縮頁面優化傳輸速度,需要使用mod_deflate模塊。適用于帶寬稀缺,CPU空閑較多的情況。需要注意可能有些較老瀏覽器不支持。并且壓縮那些適合壓縮的資源,例如文本文件
第一步:開啟主配文件deflate模塊(或檢查模塊是否裝載httpd -M | grep deflate
LoadModule deflate_module modules/mod_deflate.so
第二步:在主配文件中或conf.d/目錄下加入壓縮配置
SetOutputFilter DEFLATE 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 DeflateCompressionLevel 9 BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html第三步:使用httpd -t檢查配置文件,執行systemctl restart httpd.service
- SetOutputFilter DEFLATE:作為Web服務器來講,把文件響應給客戶端叫輸出。這選項表示調用一個叫做Deflate的輸出過濾器
- AddOutputFilterByType DEFLATE:定義壓縮的MIME類型,將這些類型都調用一個叫做Deflate的輸出過濾器
- DeflateCompressionLevel 9:定義壓縮比(Highest 9 - Lowest 1)
較老版本的瀏覽器不支持壓縮,服務器根據客戶端請求首部中的User-Agent來判斷客戶端是哪種類型
- BrowserMatch ^Mozilla/4 gzip-only-text/html:表示對mozilla/4的瀏覽器只用gzip壓縮text/html
- BrowserMatch ^Mozilla/4\.0[678] no-gzip:Mozilla4.0[678]的表示不壓縮
- BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html:對于MSIE瀏覽器不壓縮,如果要壓縮的話那也只壓縮這一種類型!gzip-only-text/html
17. 配置HTTPS
(1) SSL會話的簡化過程
- 客戶端發送可供選擇的加密方式,并向服務器請求證書
- 服務器端發送證書以及選定的加密方式給客戶端
- 客戶端取得證書并進行證書驗證:驗證證書來源的合法性(用CA的公鑰解密證書上數字簽名)、驗證證書的內容的完整性(使用同樣的單向加密算法進行驗證)、檢査證書的有效期限、檢査證書是否被吊銷、證書中擁有者的名字與訪問的目標主機要一致
- 客戶端生成臨時會話密鑰(對稱密鑰),并使用服務器端的公鑰加密此對稱秘鑰發送給服務器,完成密鑰文換
- 服務器用此密鑰加密用戶請求的資源,響應給客戶端
注意:SSL會話是基于IP地址創建,所以單IP的服務器上僅可以使用一個https虛擬主機
(2) 配置過程
① 建立私有CA
(1) 生成CA自己的私鑰文件 cd /etc/pki/CA (umask 077; openssl genrsa -out private/cakey.pem 2048)(2) 生成CA自簽證書 touch index.txt echo 01 > serial openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 7300② 在web服務器創建證書簽署請求
(1) 創建單獨保存秘鑰的文件 mkdir /etc/httpd/ssl(2) 生成web服務器私鑰文件 (umask 077; openssl genrsa -out ssl/httpd.key 1024)(3) 生成證書頒發請求并發送給CA服務器 openssl req -new -key ssl/httpd.key -out ssl/httpd.csr scp ssl/httpd.csr root@192.168.1.250:/tmp/③ CA簽證并發還證書
(1) 簽署請求并發還客戶端 openssl ca -in /tmp/httpd.csr -out certs/web.server.com.crt -days 365 scp certs/web.busyops.crt root@192.168.1.200:/etc/httpd/ssl/④ 安裝ssl模塊
httpd服務器安裝mod_ssl:yun install -y mod_ssl,生成的配置文件如下
- /etc/httpd/conf.d/ssl.conf:配置文件
- /etc/httpd/conf.modules.d/00-ssl.conf:模塊配置文件
- /usr/lib64/httpd/modules/mod_ssl.so:模塊
- /usr/libexec/httpd-ssl-pass-dialog
- /var/cache/httpd/ssl:ssl會話緩存
⑤ 修改配置ssl.conf
配置文件:/etc/httpd/conf.d/ssl.conf
- Listen 443 https:設置端口及協議,保持不變即可
- SSLSessionCache:SSL會話非常消耗資源,使用會話保持功能可減少建立SSL的頻次,此項第一SSL會話緩存位置
- SSLSessionCacheTimeout:SSL會話緩存時長
- SSLRandomSeed:定義SSL會話隨機數來源
- DocumentRoot:于需要提供SSL會話的主機保持一致
- ServerName:于需要提供SSL會話的主機保持一致
- SSLCertificateFile:服務器公鑰
- SSLCertificateKeyFile服務器私鑰文件
⑥ 測試基于https訪問相應的主機
openssl s_client [-connect host:port] [-CAfile filename]
五、http相關命令
1. httpd命令
option -l:顯示編譯 進核心的模塊 -M:顯示靜態編譯及動態裝載的模塊 -t:檢查語法 -t -D DUMP_VHOSTS:導出虛擬主機配置信息2. 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、socket4代理服務器,通過http代理服務器上傳文件到FTP服務器等等,功能十分強大
命令格式:curl [options] URL
3. ab命令
壓力測試(apache bench)
命令格式:ab [option] URL
輸出信息
Server Software:服務器程序 Server Hostname:域名 Server Port:Document Path: 測試的URL Document Length: 請求的頁面大小Concurrency Level: 并發數量 Time taken for tests: 這個測試的時間 Complete requests: 在請求數 Failed requests: 失敗的數量 Write errors: 響應報文錯誤數 Non-2xx responses: 10000 Keep-Alive requests: 10000 Total transferred: 總數據傳輸量 HTML transferred: 主體部分大小 Requests per second: 沒秒鐘可以完成的響應數量 Time per request: 每并發數完成需要的時間 Time per request: 每單個請求需要的時長 Transfer rate: 傳輸速率Connection Times (ms)min mean[+/-sd] median max最短 平均 中間值 最長 Connect: 請求建立需要的時間 Processing: 處理請求的時間 Waiting: 發送響應報文的時間 Total: 一次請求完成的時間 Percentage of the requests served within a certain time (ms)50% 7 :完成50%消耗的時間66% 8 :完成66%消耗的時間75% 215 :完成75%消耗的時間80% 218 :完成80%消耗的時間90% 428 :完成90%消耗的時間95% 856 :完成95%消耗的時間98% 1757 :完成98%消耗的時間99% 6680 :完成99%消耗的時間100% 56953 (longest request) :完成100%消耗的時間總結
以上是生活随笔為你收集整理的http协议及httpd配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计蒜客_Lpl and Energy-s
- 下一篇: 保弘实业|打工族怎么投资理财