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/httpd.conf
/etc/httpd/conf/*.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 httpd.service
systemctl start/stop/restart/status httpd.service
Web Server :
httpd-2.2的常用配置:
主配置文件:
/etc/httpd/conf/httpd.conf
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機制
/etc/sysconfig/httpd
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 #永久存在不執行銷燬
</IfModule>
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 ……
</Directory>
允許賬號文件中的所有用戶登錄訪問
Require vaild-user
提供賬號和密碼存儲(文本文件)
使用專用命令完成此類文件的創建以及用戶管理
htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username
-c 自動創建此處指定的文件,因此,僅應該在此文件不存在時使用
-m MD5加密
-s sha 格式加密
-D 刪除指定用戶
基於組賬號進行認證:
定義安全域
<Directory””>
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 ……
</Directory>
創建用戶賬號和組賬號文件:
組文件:每一行定義一個組
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>
<VirtualHost 192.168.9.129:80>
ServerName www.zhangwentao.net
DocumentRoot “/www/zhangwentao.net/httpdocs”
</VirtualHost>
<VirtualHost 192.168.9.130:80>
ServerName www.zhangwentao.org
DocumentRoot “/www/zhangwentao.org/httpdocs”
</VirtualHost>
2.基於端口的虛擬主機配置示例:
Listen 808
<VirtualHost 192.168.9.128:80>
ServerName www.zhangwentao.com
DocumentRoot “/www/zhangwentao.com/httpdocs”
</VirtualHost>
<VirtualHost 192.168.9.128:808>
ServerName www.zhangwentao.net
DocumentRoot “/www/zhangwentao.net/httpdocs”
</VirtualHost>
<VirtualHost 192.168.9.128:8080>
ServerName www.zhangwentao.org
DocumentRoot “/www/zhangwentao.org/httpdocs”
</VirtualHost>
3.基於FQDN的虛擬主機:http-2.2版本中,虛擬主機要基於主機名需要加NameVirtualHost
NameVirtualHost 192.168.9.128:80
<VirtualHost 192.168.9.128:80>
ServerName www.zhangwentao.com
DocumentRoot “/www/zhangwentao.com/httpdocs”
</VirtualHost>
<VirtualHost 192.168.9.128:80>
ServerName www.zhangwentao.net
DocumentRoot “/www/zhangwentao.net/httpdocs”
</VirtualHost>
<VirtualHost 192.168.9.128:80>
ServerName www.zhangwentao.org
DocumentRoot “/www/zhangwentao.org/httpdocs”
</VirtualHost>
status狀態頁面:
LoadModule status_module modules/mod_status.so
<Location /server-status>
SetHandler server-status
Order allow.deny
Allow from all #Allow from all 是極其危險的操作
</Location>
測試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>
<entity-body>
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訪問相應的主機
# openssl s_client [connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]