初識HTTP協議
HTTP(hyper text transfer protocal)作為互聯網應用最廣泛的協議,任何一個運維人員都無法回避它,HTTP的目的就是提供一種發布和接收html頁面的方法,為了更好的理解HTTP協議,首先需要了解幾個常識:
1、URL(Uniform Resource Locator)統一資源定位符,用于描述某個服務器上某個特定資源的位置,也就是通常我們見到的網址。
2、HTML(Hyper Text Markup Language)超文本標記語言,HTML 語言是為了能把存放在一臺電腦中的文本或圖形與另一臺電腦中的文本或圖形方便地聯系在一起,形成有機的整體,人們不用考慮具體信息是在當前電腦上還是在網絡的其它電腦上。這樣,你只要使用鼠標在某一文檔中點取一個圖標,Internet就會馬上轉到與此圖標相關的內容上去。
3、TCP(Transmission Control Protocol)傳輸控制協議,是面向連接的協議,也就是說通訊前要建立虛擬鏈接,而HTTP的協議就是通過TCP來實現的。
HTTP的工作機制:就是基于B/S(瀏覽器/服務器)架構,由瀏覽器(即客戶端)發起http請求—->服務器響應http請求。
一次完整的http請求過程如下
常見的HTTP服務器程序以及應用程序服務器
常見的http服務器程序:
httpd(apache)
nginx
lighthttpd
常見的應用程序服務器:
IIS(microsoft)
tomcat
jetty
jboss
weblogic
webshpere(IBM)
httpd的功能特性
httpd主要有以下特性
高度模塊化:core + modules
DSO: Dynamic Shared Object,動態共享庫
MPM:Multipath Processing Modules,多道處理模塊
prefork:多進程模型,每個進程響應一個請求;一個主進程:負責生成n個子進程,子進程也稱為工作進程,每個子 進程處理一個用戶請求;即便沒有用戶請求,也會預先生成多個空閑進程,隨時等待請求到達;最大不會超過1024個;
worker:多線程模型,每個線程響應一個請求; 一個主進程:生成多個子進程,每個子進程負責生個多個線程,每個線程響應一個請求;
event:事件驅動模型,每個線程響應n個請求; 一個主進程:生成m個子進程,每個進程直接n個請求;
同時支持以下功能
1、虛擬主機
2、 IP、Port、FQDN
3、CGI:Common Gateway Interface,通用網關接口;
4、 反向代理
5、 負載均衡
6、路徑別名
7、豐富的用戶認證機制
8、basic
9、 digest
10、支持第三方模塊
httpd的安裝與配置
yum安裝httpd
yum install -y httpd service httpd start
yum安裝的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: 錯誤日志
站點文檔目錄:/var/www/html
httpd的十八般武藝
1、指定監聽端口
Listen 80
(1) IP省略時表示監聽本機上所有可用的IP地址;
(2) Listen指令可以出現多次,用于指明多個不同的監聽端口或套接字
2、持久連接的相關配置
KeepAlive Off MaxKeepAliveRequests 100 KeepAliveTimeout 15
持久連接:連接建立后,每個資源獲取結束不會斷開連接而是繼續等待其他資源的請求并完成傳輸
非持久連接:每個資源都是單獨通過專用的連接進行獲取的
3、并發請求模式的不同實現
httpd-2.2 不支持同時編譯多個不同的MPM,rpm安裝的httpd-2.2提供了三個文件分別用于實現提供對不同的MPM的支持;確認方法:
ps aux | grep httpd
默認為/usr/sbin/httpd,其為prefork;
查看模塊列表:
httpd -l #查看靜態編譯的模塊 httpd -M #查看所有模塊,包括靜態編譯和DSO模塊
4、DSO動態裝卸載模塊的實現
# The following modules are not loaded by default: #LoadModule asis_module modules/mod_asis.so #LoadModule authn_dbd_module modules/mod_authn_dbd.so #LoadModule cern_meta_module modules/mod_cern_meta.so #LoadModule cgid_module modules/mod_cgid.so #LoadModule dbd_module modules/mod_dbd.so #LoadModule dumpio_module modules/mod_dumpio.so #LoadModule filter_module modules/mod_filter.so #LoadModule ident_module modules/mod_ident.so #LoadModule log_forensic_module modules/mod_log_forensic.so #LoadModule unique_id_module modules/mod_unique_id.so
要想啟用httpd的摸個模塊只需要將前面的#號去掉即可,是不是很方便
5、定義“main server”的文檔頁面路徑
文檔路徑映射:
DocumentRoot指向的路徑為URL起始的位置:/var/www/html/
6、站點訪問控制
訪問控制機制:
1、基于來源地址
2、基于賬號
7、Directory中的訪問控制定義
1、 Options
Indexes: 當訪問的路徑下無默認主頁面文件存在,且沒有指定具體要訪問的資源時,會將此路徑下的所有資源以列表呈現給用戶;非常危險,不建議使用;
FollowSymLinks:如果某頁面文件是為指向DocumentRoot之外路徑上的其它文件時,將直接顯示目標文件的內容;
None: none
All: 所有的都啟用;
2、 基于來源地址訪問控制
Order: 檢查次序
Order Allow Deny:只有明確Allow的來源地址,才允許訪問,其它的均為Deny
Order Deny Allow:
Allow from:允許訪問的來源地址
Deny from:拒絕訪問的來源地址
8、定義默認主頁面
DirectoryIndex index.html index.php
自左向右,查找首次匹配到的文件就將其作為主頁面
9、配置日志
錯誤日志:
ErrorLog logs/error_log
LogLevel warn
訪問日志:要定義日志格式
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog logs/access_log combined
%h: Remote host,客戶端主機
%l: Remote logname (from identd, if supplied). 客戶用戶通過identd登錄時使用名稱;一般為-;
%u: Remote user (from auth; may be bogus if return status (%s) is 401),用戶認證登錄的名字;無登錄機制一般-;
%t: Time the request was received (standard english format),收到客戶端請求時的時間;
\": 顯示引號本身,而不作為引用符號;
%r:First line of request,請求報文的首行
<method> <url> <version>
%>s:響應狀態狀態碼
%b: Size of response in bytes, excluding HTTP headers,響應報文的大小,單位為字節;不包含首部信息;
%{Referer}i:記錄Http首部Referer對應的值;即訪問入口,從哪個頁面跳轉至此頁面;
%{User-Agent}i:記錄http首部User-Agent對應的值;即瀏覽器類型;
10、路徑別名
Alias /icons/ "/var/www/icons/" <Directory "/var/www/icons"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory>
11、設定默認字符集
AddDefaultCharset UTF-8 #常用的字符集:GBK GB2312 GB18030
12、基于用戶的訪問控制
http協議支持的認證方式:
basic:基本BASE64basic,認證機制的實現
1、定義安全域
<Directory "/data/web/html/employee"> Options None AllowOverride None AuthType Basic AuthName "Employee Infomation, only for employee" AuthUserFile /etc/httpd/users/.htpasswd Require user tom jerry </Directory>
2、提供用戶的帳號文件
htpasswd [ -c ] [ -m ] [ -D ] passwdfile username
-c: 添加第一用戶時創建此文件;
-m: 以md5格式加密用戶密碼存放;
-s: 以sha格式加密用戶密碼存放;
-D:刪除指定用戶
3、組認證
<Directory "/data/web/html/employee"> Options None AllowOverride None AuthType Basic AuthName "Employee Infomation, only for employee" AuthUserFile /etc/httpd/users/.htpasswd AuthGroupFile /etc/httpd/users/.htgroup Require group GRP1 GRP2 ... </Directory>
13、虛擬主機的三種實現方式
httpd三種類型的虛擬主機:
基于IP
基于Port
基于FQDN
定義虛擬主機的方法:
<VirtualHost "IP:PORT"> ServerName ServerAlias DocumentRoot </VirtualHost>
14、內置的status頁面
<Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from 172.16.0.0/16 </Location>
15、使用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
16、https的實現方法
配置httpd支持https:
1 、為服務器申請數字證書;
(a) 創建私有CA
生成私鑰文件
openssl genrsa -out private/cakey.pem 2048
生成自簽證書
spenssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 10000
提供輔助文件
touch index.txt echo 01 > /etc/pki/CA/serial
(b) 在服務器創建證書簽署請求
生成私鑰在/etc/httpd/ssl/
(umask 077 openssl genrsa -out httpd.key)
生成證書簽署請求
openssl -req -new -key httpd.key -out httpd.csr
(c) CA簽證
獲取證書簽署請求
簽證證書
openssl ca -in httpd.csr -out -days 3665
2、 配置httpd支持使用ssl,及使用的證書;
yum -y install mod_ssl
配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot ServerName SSLCertificateFile SSLCertificateKeyFile
3、測試基于https訪問相應的主機;
17、httpd自帶的工具程序
htpasswd: basic認證基于文件實現時,用到的賬號密碼文件生成工具;
apachectl:httpd自帶的服務控制腳本,支持start, stop;
apxs:由httpd-devel包提供的,擴展httpd使用第三方模塊的工具;
rotatelogs:日志滾動工具;
suexec:訪問某些有特殊權限配置的資源時,臨時切換至指定用戶運行;
18、httpd壓力測試工具
ab [OPTIONS] URL
-n: 總的請求數
-c:模擬的并發數
-k: 以持久連接模式測試
以上就是httpd 的十八般武藝,或許你會覺得不以為然,但是別忘了,這些都是基本功,只有基本功扎實了,你的江湖路才能走的更加坦然。
原創文章,作者:zhang,如若轉載,請注明出處:http://www.www58058.com/10916
現在研究基礎的人不多了,贊