Http
端口定義:
0-1023:永久配置設定給固定的應用使用,特權端口
1024-41951:也是注冊端口,要求不嚴格
41952+:用戶端随即使用的端口,動态端口,或私有端口
BSD Socket :
IPC的一種實作,允許位于不同主機上的程序之間進行通訊
Socket API(封裝了核心中socket通信相關的系統調用)
SOCK_STREAM:tcp套接字
SOCK_DGRAM:UDP套接字
SOCK_RAW:raw套接字
TCP協定的特性:
建立連接配接:三次握手
将資料打包成段:校驗和CRC32
确認、重傳及逾時
排序:邏輯序号
流量控制:滑動視窗算
http:hyper text transfer protocol,應用層協定,80/tcp
Html:hyper text mark language,程式設計語言,超文本标記語言
<html>
<head>
<title>TITLE</title>
</head>
<body>
<h1></h1>
<p>……<a href=”http://www.baidu.com/download.html”>……</a></p>
<h2><h2>
</body>
</html>
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
service start/stop/restart/status/reload/configtest httpd
CentOS 7:
/etc/httpd/conf/*.conf
子產品相關配置檔案:/etc/httpd/conf.modules.d/*.conf
systemd unit file:
/usr/lib/systemd/system/httpd.service
httpd-2.4支援MPM的動态切換
/var/log/httpd/:
access_log:通路日志
error_log:錯誤日志
systemctl enable httpd.service
systemctl start/stop/restart/status httpd.service
Web Server :
httpd-2.2的常用配置:
主配置檔案:
DirectoryIndex index.html 定義預設首頁名稱
DocumentRoot “/var/www/html”預設站點目錄
ServerRoot “/etc/httpd” 用于指定Apache的運作目錄,服務啟動之後自動将目錄改為目前目錄,在後面所使用的所有相對路徑都是相對這個目錄的
#Section 1 : 全局環境變量
#Section 2 : 主服務配置
#Section 3 : 虛拟主機
cp -v httpd.conf {,.backup} #編輯配置檔案之前備份同名字尾為“.backup”的檔案
配置檔案格式:
directive value
directive : 不區分大小寫
value : 為路徑時,是否區分大小寫取決于檔案系統
常用配置:
1. 修改監聽的IP和端口
Listen IP:PORT
不寫IP預設監聽所有IP
2. 修改監聽Socket 重新開機即生效
3. 持久連結功能:TCP建立連結之後,每個最遠擷取完成後不斷開連接配接,而是繼續等待其他資源請求的進行
是否開啟:KeepAlive On/Off
斷開方法:
1. 數量限制
最大連接配接數:MaxKeepAliveRequests 100
2. 時間限制
逾時時長:KeepAliveTimeout 10
Telnet 測試:
Telnet SERVER_IP PORT
GET /URL HTTP/1.1
Host: SERVER_IP
MPM子產品
http2.2不支援同時編譯多個MPM子產品,故隻能編譯標明使用的那一個,CentOS 6 中轉麼能提供了三個應用程式檔案,httpd(prefok), httpd.worker httpd.event 分别用于實作對不同的MPM機智的支援
預設使用的為/usr/sbin/httpd,為prefork的MPM子產品
檢視httpd程式的子產品清單
# httpd -l
檢視靜态編譯以及動态編譯的子產品
# httpd -M
更換使用httpd程式,來支援其他MPM機制
HTTPD=/usr/sbin/httpd.{worker,event}
重新開機服務才可生效
MPM(多處理子產品)配置:
prefork的配置:
<IfModule prefork.c>
StartServers 8 #啟動時啟動多少程序
MinSpareServers 5 #最小空閑程序
MaxSpareSercers 20 #最大空閑程序
ServerLimit 256 #最大線上程序數量
MaxClients 256 #這個是真正控制單台host上Apache真正能控制的最大 并發連接配接數。這個參數很重要,是你計算系統峰值時消耗 系統資源的主要依據
MaxRequestPerChild 4000 #每一個程序能處理的請求最大數量,之後必須銷毀
</IfModule>
worker的配置:
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0 #永久存在不執行銷毀
PV/UV :
PV : PageView 頁面浏覽量
UV : UserView
DSO :
配置指定實作子產品加載
LoadModule <mod_name> <mod_path>
子產品檔案路徑可使用相對路徑
相對于ServerRoot(預設/etc/httpd)
定義‘Main’server的文檔頁面路徑
修改DocumentRoot指向的路徑為URL路徑的起始位置
相當于站點URL的根路徑
站點通路控制常見機制
可基于兩種機制指明對那些資源進行通路控制
檔案系統路徑
1. <Directory””>
……
</Directory>
2. <File””>
</File>
URL路徑 :
<Location “/”>
</Location>
<Directory>中“基于源位址”實作通路控制
1. Options後面跟一個或多個以空白字元分隔得“選項”清單
選項:
indexes: 指定的URL路徑下不存在與定義的首頁面資源相符的資源檔案時,返 回索引清單給使用者
Attention:測試Indexes功能時,務必要把/etc/httpd/conf.d/welcome.conf裡面的Option選項後面的“-”去掉,否則測試時隻會加載預設歡迎頁面而不會列出Indexes
FollowSymLinks (跟蹤符号連結) : 允許跟蹤符号連結檔案所指向的源檔案
None :全部關閉
All:全部開啟
2. AllowOverride :
與通路控制相關的哪些指令可以放在.htaccess檔案(每一個目錄下都可以有一個)中;
All : 表示所有都可以放進去
None : 否上
3. Order和allow、deny
order: 定義生效次序,寫在後面的表示預設法則;
Allow from, Deny from
來源位址:
IP:
NetAddr:三種格式:172.18
172.18.0.0
172.18.0.0/16
172.18.0.0/255.255.0.0
定義站點首頁面:
DirectoryIndex index,html index.html.var
定義路徑别名:
Alias /URL/ “/PATH/TO/SOMEDIR”
設定預設字元集:
AddDefaultCharset UTF-8
中文字元集:GBK/GB2312/GB18030
日志設定:
日志類型:通路日志 和 錯誤日志
錯誤日志:
ErrorLog logs/error_log
LogLevel warn
日志級别:debug/info/notice/warn/error/alert/emerg
通路日志:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustonLog logs/access_log combined
LogFormat formatrr string:
%h : 用戶端IP位址
%l :RemoteUser 通常為一個減号(“-”)
%u : 非登入通路時,為減号
%t : 服務收到請求的時間
%r : First line of request 表示請求封包的首行,記錄此次請求的方法,url以及協定版本
%>s : 響應狀态碼;
%b : 響應封包的大小,機關是位元組,但是不包括響應封包的HTTP首部
%{referer}i : 請求封包中首部“referer”的值,即從哪個頁面中的超連結跳轉至目前頁面的,
%{User-Agent}i : 請求封包中首部“User-Agent”的值,即送出請求的應用程式;
基于使用者的通路控制:
認證質詢:響應碼為401,拒絕用戶端請求,并說明要求用戶端提供賬号和密碼
認證:用戶端使用者填入賬号和密碼後再次發送請求封包、認證通過時,則伺服器發送響應的資源
認證方式有兩種:
basic:明文
digest : 消息摘要認證
安全域:需要使用者認證後方能通路的路徑,應該䚒名稱對其進行辨別,一遍告知使用者認證的原因
使用者的賬号和密碼存放位置:
虛拟賬号:僅用于通路某服務時用到的認證辨別
存儲:
文本檔案:
SQL資料庫
ldap目錄存儲
basic認證配置示例:
定義安全域
<Directory””>
Option None
AllowOverride None
AuthType Basic
AuthName “String”
AuthUserFile “/PATH/TO/HTTPF_USER_PASSWD_FILE”
Require User username1 username2 ……
允許賬号檔案中的所有使用者登入通路
Require vaild-user
提供賬号和密碼存儲(文本檔案)
使用專用指令完成此類檔案的建立以及使用者管理
htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username
-c 自動建立此處指定的檔案,是以,僅應該在此檔案不存在時使用
-m MD5加密
-s sha 格式加密
-D 删除指定使用者
基于組賬号進行認證:
Option None
AllowOverride None
AuthType Basic
AuthName “String”
AuthUserFile “/PATH/TO/HTTPF_USER_PASSWD_FILE”
AuthGroupFile “/PATH/TO/HTTPD_GROUP_FILE”
Require group gropname1 gropname2 ……
建立使用者賬号群組賬号檔案:
組檔案:每一行定義一個組
GRP_NAME: username1 username2 ……
虛拟主機:不建議直接在/etc/httpd/conf/httpd.conf 中配置,建議單獨一個檔案配置虛拟主機
站點辨別:socket
IP相同,但端口不同
IP不同,但是端口均為預設端口
FQDN不同:
請求封包首部實作
Host:www.zhangwentao.com
三種實作方案:
基于IP:為每一個虛拟主機準備至少一個IP位址
基于PORT:為每一個虛拟主機使用至少一個獨立的PORT
基于FQDN:為每一個虛拟主機使用至少一個FQDN
Attention: 一般的虛拟你不要與中心主機混用,是以,需要使用虛拟主機,要先禁用‘main’主機
禁用方法:注釋中心主機的DocumentRoot指令即可
虛拟主機的配置方法:
<VirtualHost IP:PORT>
ServerName FQND
DocumentRoot “” 虛拟主機站點那檔案路徑
</VirtualHost>
其它可用指令:
ServerAlias: 虛拟主機的别名,可以多次使用
ErrorLog:
CutomLog:
1.基于IP的虛拟主機示例:通過IP變化來實作虛拟主機
<VirtualHost 192.168.9.128:80>
ServerName www.zhangwentao.com
DocumentRoot “/www/zhangwentao.com/httpdocs”
<VirtualHost 192.168.9.129:80>
ServerName www.zhangwentao.net
DocumentRoot “/www/zhangwentao.net/httpdocs”
<VirtualHost 192.168.9.130:80>
ServerName www.zhangwentao.org
DocumentRoot “/www/zhangwentao.org/httpdocs”
2.基于端口的虛拟主機配置示例:
Listen 808
<VirtualHost 192.168.9.128:808>
<VirtualHost 192.168.9.128:8080>
ServerName www.zhangwentao.org
3.基于FQDN的虛拟主機:http-2.2版本中,虛拟主機要基于主機名需要加NameVirtualHost
NameVirtualHost 192.168.9.128:80
ServerName www.zhangwentao.com
ServerName www.zhangwentao.net
status狀态頁面:
LoadModule status_module modules/mod_status.so
<Location /server-status>
SetHandler server-status
Order allow.deny
Allow from all #Allow from all 是極其危險的操作
測試httpd服務時,注意SElinux 的問題
常見報錯:SELinux is preventing /usr/sbin/httpd from name_bind access on the tcp_socket port 808. For complete SELinux messages run: sealert -l
http協定和httpd的配置:
URL:Unifrom Resource Locator
http:// :預設端口為80
https:// : 預設端口為443
基本文法:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
params: 參數
query:
frag: 網站目錄定位
相對URL:同一個站點内
絕對URL:跨站點
http協定:
http/0.9 ,http/1.0 ,http/1.1 ,http/2.0
http協定:statuless
伺服器無法持續追蹤通路者來源
cookie session
http事務:
請求:request
響應:response
封包文法格式:
request封包:
<method><request-URL><version>
<headers>
<entity-body>
response封包
<version><status><reason-phrase>
<header>
method: 請求方法,标明用戶端希望伺服器對資源執行的動作
GET 、HEAD 、POST
version:
HTTP/<major>.<minor>
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:成功,請求的所有資料通過響應封包的entitu-body:OK
301:請求的URL資源已經被删除;但在響應封包中通過首部Location指 明了資源現在所知的新位置(永久重定向)
302:與301相似,但在響應封包中通過Location指明資源現在所處臨時新 位置(臨時重定向)
304:用戶端發出了條件式請求:但伺服器上的資源未曾發生改變,通過 響應此狀态碼通知用戶端
401:需要輸入賬号和密碼認證之後方能通路資源
403:請求被禁止,Forbidden
404:伺服器無法找到用戶端請求的資源:Not Found
500: 伺服器内部錯誤:Internal Server Error
502:代理伺服器從後端伺服器收到了一條僞響應:Bad Gateway
Headers :
格式:
通用首部(既可以應用在請求封包首部也可以用在響應封包首部):
Date:封包的建立時間
Connection: 連接配接方式,如KeepAlive,Close
Via:顯示封包經過的節點
Catche-Control:控制緩存
請求首部:
Accept:通過伺服器自己可以接受的媒體類型
Accept-Charset:
Accept-Encoding:接受編碼格式,如gzip
Accept-Language:接受的語言
Client-IP:
Host:請求的伺服器名稱和端口号
Referer:包含目前正在請求的資源的上一級資源
User-Agent:用戶端代理
條件式去請求首部:
Expect:
If-Modified-Since:自從指定的時間後,請求的資源是否發生過修改
If-Unmodified-Since:自從指定時間之後,是否沒發生過修改
If-None-Match:本地緩存中存儲的文檔的ETag标簽是否與伺服器文檔的ETag不比對
If-Match:
安全請求首部:
Authorization:向伺服器發送認證資訊。賬号密碼
Cookie:用戶端向伺服器發送cookie
cookie2:
代理請求首部:
Proxy-Authorization:向代理伺服器認證
響應首部:
資訊性:
Age:響應持續時長
Server:伺服器程式軟體名稱和版本
協商首部:某資源有多重表示方法時使用
Accept-Ranges:伺服器可接受的請求範圍類型
Vary:伺服器檢視的其他首部清單
安全響應首部:
Set-Cookie:向用戶端設定Cookie
Set-Cookie2:
WWW-Authenticate:來自伺服器的對用戶端的質詢認證表單
實體首部:
Allow:列出對此實體可以使用的請求方法
Lcation:告訴用戶端真正的實體位于何處
Content-Encoding:内容的編碼格式
Content-Language:内容的語言
Content-Length:主體的長度
Content-Location:實體真正所處的位置
ontent-Type:主體對象類型
緩存相關:
ETag:實體的擴充标簽
Expires:實體的過期時間
Last-Modified:最後一次修改的時間
HTTPD-2.2的常見配置:
curl指令:
curl是基于URL文法在指令行方式下工作的檔案傳輸工具,它支援FTP/FTPS/HTTP/HTTPS/GOPHER/TELNET/DICT/FILE以及LDAP等協定
curl [options] URL
常用選項:
-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 使用HTTP 1.0
elinks [options] url
-dump :不進入互動式模式,而是直接将URL的内容全部列出
user/group:
指定以哪個使用者的身份運作httpd服務程序
User apache
Group apache
使用mod_deflate子產品壓縮頁面優化傳輸速度
适用場景:
1. 節約帶寬,額外消耗CPU,可能較老的浏覽器不支援
2. 壓縮适用于壓縮的資源,例如文本檔案
https , http over ssl
SSL會話過程:
1. 用戶端發送可供選擇的加密方式,并想伺服器請求證書
2. 伺服器端發送證書以及標明的加密方式給用戶端
3. 用戶端取得證書并進行證書驗證
a) 如果信任給其頒發的證書CA
1. 驗證證書來源的合法性:用CA的公鑰解密證書上數字簽名
2. 驗證證書的内容的合法性:完整性驗證
3. 檢查證書的有效期限
4. 檢查證書是否被吊銷
5. 證書中擁有者的名字,與通路的目标主機要一緻
b) 用戶端生成臨時會話密鑰(對稱密鑰),并使用伺服器端的公鑰加密此資料發送給伺服器,完成密鑰交換
c) 伺服器用此密鑰加密使用者請求的資源,響應給用戶端
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
SSLCertificatKeyFile
3. 測試基于https通路相應的主機