Web Service
應用層:http,https
實現某類具體應用
傳輸層協議:TCP,UDP,SCTP
IANA:
0-1023:從所周知的端口,永久的分配給固定應用使用,特權端口
1024-41951:亦為注冊端口,但要求不是特別嚴格,分配給程序注冊為某應用使用;3306/tcp,11211/tcp
41952+:客戶端程序隨機使用的端口動態端口,或私私有端口;其范圍定義在/proc/sys/net/ipv4/ip_local_port_range
BSD Socket:IPC的一種實現,運行不同主機(也可以是同一主機)上的進程之間進行通信
Socket API(封裝了內核中的socket通信相關的系統調用)
TCP FSM:
CLOSED,LISTEN,SYN_SENT,SYN_RECV,ESTABLISHED,FIN_WAIT1,CLOSE_WAIT,FIN_WAIT2,LAST_ACK,TIMEWAIT,CLOSED
TCP協議的特性:
建立鏈接:三次握手
將數據打包成段:校驗和(CRC32)
確認、重傳及超時
排序:邏輯序號
流量控制:滑動窗口算法
擁塞控制:慢啟動和擁塞避免算法
http:hyper text transfer protocol,應用層協議,80/tcp
html:hyper text mark languge,編程語言,超文本標記語言
<html>
<head>
<title>TITLE</title>
</head>
<body>
<h1>TEST</h1>
<p>blabla…<a href="http://www.gm.com/download.html">bla….</a></p>
<h2>TEST</h2>
</body>
</html>
css:Cascading Style Sheet
js:javaScript客戶端腳本
協議版本:
http/0.9:原型版本,功能簡陋,只在實驗室中
http/1.0:cache,MIME,method
MIME:Multipurpose Internet Mail Extesion
method:GET,POST,HEAD,PUT,DELETE,TRACE,OPTIONS
http/1.1:增強了緩存功能
spdy
http/2.0:
rfc
工作模式:
http請求報文:http request
http響應報文:http response
一次http事務:請求 <–> 響應
web資源:web resource
靜態資源(無須服務端做出額外處理):.jpg .png .gif .html .txt .js .css .mp3 .avi
動態資源(服務端需要通過執行程序做出處理,發送給客戶端的是程序的運行結果):.php .jsp
注意:一個頁面中展示的資源可能有多個,每個資源都需要單獨請求
資源的標識機制:URL
Uniform Resource Locator:用于描述服務器某特定資源的位置
例如:http://www.sina.com.cn/index.html
Scheme://Server[:Port][/PATH/TO/SOME_RESOURCE]
一次完整的http請求處理過程:
(1)建立或處理連接:接收請求或拒絕
(2)接收請求:接收來自于網絡上的主機請求報文中對某特定資源的一次請求的過程
(3)處理請求:對請求報文進行解析,獲取客戶端請求的資源及請求方法等相關信息
(4)訪問資源:獲取請求報文中請求的資源
(5)構建響應報文
(6)發送響應報文
(7)記錄日志<可以用于后期分析>
請求接收的模型:
并發訪問響應模型:
單進程I/O結構:啟動一個進程處理用戶請求;一次只能處理一個請求,多個請求被串行響應
多進程I/O結構:并行啟動多個進程,每個進程響應一個請求
復用的I/O結構:一個進程響應n個請求
多線程模式:一個進程生成n個線程,一個線程處理一個請求
事件驅動(event-driven):一個進程處理n個請求
復用的多進程I/O結構:啟動多個(m)個進程,每個進程生成(n)個線程
響應的請求數量:m*n
處理請求:分析請求報文的http請求報文首部
http協議:
http請求報文首部
http響應報文首部
請求報文首部的格式:
<method><URL><VERSION>
HEADERS:(name:value)
<request body>
訪問資源:獲取請求報文中請求的資源
web服務器,即存放了web資源的主機,負責向請求者提供對方請求的靜態資源,或動態資源運行生成的結果;這些資源通常應該放置于本地文件系統某路徑下,此路徑稱為DocumentRoot
web服務器的資源路徑映射方式:
(a)docroot
(b)alias
(c)虛擬主機的docroot
(d)用戶家目錄的docroot
http請求處理中的連接模式:
保持連接(長連接):keep-alive
通過2個資源進行限制:
時間,數量<空間>
非保存連接(短連接):close
http服務器程序:
httpd(apache)
nginx
lighttpd
應用程序服務器:
IIS:.Net
tomcat:.jsp
httpd的安裝和使用:
ASF:apache software foundation
httpd:apache
a patchy server = apache
httpd的特性;
高度模塊化:core+modules
DSO:dynamic shared object
MPM:Multipath processing Modules(多路處理模塊)
prefork:多進程模型,每個進程響應一個請求
一個主進程:負責生成子進程及回收子進程;負責創建套接字;負責接收請求,并將其派發給某子進程處理
n個子進程:每個子進程處理一個請求
工作模型:會預先生成幾個空閑進程,隨時等待用于響應用戶請求;最大空閑和最小空閑
worker:多線程模型:每個進程生成多個線程
一個主進程:負責生成子進程及回收子進程;負責創建套接字;負責接收請求,并將其派發給某子進程處理
n個子進程:每個子進程內部生成多個線程
每個線程:負責響應一個請求
并發響應數量:m*n
m;子進程數量
n:每個子進程所能創建的最大線程數量
event:基于事件驅動模型,多進程模型,每個進程響應多個請求
一個主進程:負責生成子進程及回收子進程;負責創建套接字;負責接收請求,并將其派發給某子進程處理
n個子進程:基于事件驅動機制直接響應多個請求
httpd-2.2:仍為測試使用模型
httpd-2.4:event可生產環境中使用
httpd的程序版本:
httpd 1.3:官方已經停止維護
httpd 2.0:
httpd 2.2:CentOS6系列上的默認http版本
httpd 2.4:CentoS7系列上的默認http版本
httpd的功能特性:
CGI:Common Gateway Interface
虛擬主機:IP,PORT,FQDN
反向代理
負載均衡
路徑別名
豐富的用戶認證機制
basic
digest
支持第三方模塊
……
安裝httpd:
rpm包:CentOS發行版中直接提供
編譯安裝:定制新功能,或其他原因
CentOS 6:httpd-2.2
程序環境:
配置文件:
/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.worker
/usr/sbin/httpd.event
日志文件:
/var/log/httpd/:
access_log:訪問日志
error_log:錯誤日志
站點文檔:
/var/www/html
模塊文件路徑:
/usr/lib64/httpd/modules
服務控制和啟動:
chkconfig httpd on|off
service {start|stop|status|restart|configtest|reload} httpd
CentOS 7:httpd-2.4
程序環境:
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
模塊相關的配置文件:
/etc/httpd/conf.modules.d/*.conf
Systemd Unit file:
/usr/lib/systemd/system/httpd.service
主程序文件:
/usr/sbin/httpd
http-2.4支持MPM的動態切換
日志文件:
/var/log/httpd/:
access_log:訪問日志
error_log:錯誤日志
站點文檔:
/var/www/html
模塊文件路徑:
/usr/lib64/httpd/modules
服務啟動和控制:
systemctl enable|disable httpd.service
systemctl {start|stop|restart|status|reload} httpd.service
httpd-2.2的常用配置:
主配置文件;/etc/httpd/conf/httpd.conf
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts
注意:第2段和第3段不能同時生效
配置格式:
directive value
directive:不區分字符大小寫
value:為路徑時,是否區分字符大小寫,取決于文件系統;其他的不區分大小寫
常用配置:
1、修改監聽的IP和PORT
Listen [IP:]PORT
(1)省略IP表示監聽在所有可用的IP上
(2)Listen指令可重復出現多次,表示監聽在多個socket上
Listen 80;
Listen 8080;
(3)修改監聽socket,需重啟服務進程方可生效
2、持久連接
Persistent Connection:tcp連接建立后,每個資源獲取完成后不會斷開連接,而是等待其他資源請求的進行
數量限制
時間限制
壞處:對并發訪問量較大的服務器,長連接機制會使的后續某些請求無法得到正常響應
折中:使用較短的持久連接時長,以及較小的請求數量
KeepAlive On|Off
KeepAliveTimeout 15
MaxKeepAliveRequests 100
測試:
telnet WEB_SERVER_IP PORT
GET /URL HTTP/1.1
Host:WEB_SERVER_IP
3、MPM
http-2.2不支持同時編譯多個MPM模塊,所有只能編譯選定要使用的那個;CentOS 6的rpm包為此專門提供了三個應用程序文件,httpd(prefork),httpd.worker,httpd.event。分別用于實現對不同的MPM機制的支持;確認現在使用的是那個程序文件的方法:
ps aux | grep httpd
默認使用的為/usr/sbin/httpd,其為prefork的MPM模塊
查看httpd程序的模塊列表:
查看靜態編譯的模塊:
# httpd -l
查看靜態編譯及動態編譯的模塊:
# httpd -M
更換使用http程序,以支持其他MPM機制
/etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.{worker.event}
注意:重啟服務進程方可生效
MPM配置:
prefork的配置:
<IfModule prefork.c>
StartService 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClient 256
MaxRequestPerChild 4000
</IfModule>
worker的配置:
<IfModule worker>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestPerChild 0
</IfModule>
PV ,MV
PV:Page View
MV:User View
4、DSO
配置指定實現模塊加載
LoadModule <mod_name> <mod_path>
模塊文件路徑可使用相對路徑
相對于ServerRoot(默認/etc/httpd)
5、定義'Main'server的文檔網頁路徑
DocumentRoot ""
文檔路徑映射:
DocumentRoot指向的路徑為URL路徑的起始位置
相當于站點URL的根路徑
eg:(FileSystem)/var/httpd/web/index.html –> (URL)/index.html
6、站點訪問控制
可基于兩種機制指明對那些資源進行何種訪問控制
文件系統路徑:
<Directory "">
…
</Directory>
<File "">
…
</File>
<FileMatch "PATTERN">
…
</FileMatch>
URL路徑:
<Location "">
…
</Location>
<LocationMatch "">
…
</LocationMatch>
<Direcroty>中“基于源地址”實現訪問控制
(1)Options
后跟1個或多個空白字符分隔的“選項”列表
Indexes:指明的URL路徑下不存在與定義的頁面資源相符的資源文件時,返回索引列表給用戶
FollowSymLinks:運行跟蹤符號連接文件所指向的源文件
None
All
(2)AllowOverride
與訪問控制相關的那些指令可以放在.htaccess文件(每個目錄下都可以有一個)中
All
None
(3)order和allow、deny
order:定義生效次序;寫在后面的表示默認法則;多條命令有重復,以最后一次出現問準
Allow form
Deny form
來源地址:
IP
NetAddr
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
以上4中表達式等價
7、定義站點主頁面:
DirecrotyIndex index.html index.php
8、定義路徑別名
格式:
Alias /URL/ "/PATH/TO/SOMEDIR/"
Alias:中前后必須匹配,前面文件名后有/后面“”中文件名后面也的有/
DocumentRoot "/www/htdocs"
http://www.gm.com/download/file
/www/htdocs/download/file
Alias /download "/test/"
http://www.gm.com/download/file
/test/file
http://www.gm.com/images/file.png
/www/htdocs/images/file.png
9、設定默認字符集
AddDefaultCharset UTF-8
中文字符集:GBK、GB2312、GB18030
10、日志設定
日志類型:訪問日志和錯誤日志
錯誤日志:
ErrorLog logs/error_log
LogLevel warn
Possible values include:debug,info,notice,warn,error,crit,alert,emerg
訪問日志:
LogFormat "%h %i %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog logs/access_log combined
LogFormat format strings:
http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
%h:客戶端IP地址
%i:Remote User,通常為一個減號("-")
%u:Remote user (from auth; may be bogus if return status (%s) is 401):非為登錄訪問時,其為一個減號
%t:服務器收到請求時的時間
%r:First line of request,即表示請求報文的首行;記錄了此次請求的“方法”,“URL”以及協議版本
%>s:響應狀態碼
%b:響應報文的大小,單位是字節;不包括響應報文的http首部
%{Referer}i:請求報文中首部"referer"的值;即從那個頁面中的超鏈接跳轉至當前頁面的
%{User-Agent}i:請求報文中首部"User-Agent"的值;即發出請求的應用程序
11、基于用戶的訪問控制
認證質詢:
WWW-Authenticate:響應碼為401,拒絕客戶端請求,并說明要求客戶端提供帳號和密碼
認證:
Authorization:客戶端用戶填入帳號和密碼后再次發送請求報文;認證通過時,則服務器發送響應的資源
認證方式有兩種:
basic:明文
digest:消息摘要認證
安全域:需要用戶認證后方能訪問的路徑;應該通過名稱對其進行標識,以便于告知用戶認證的原因
用戶的帳號和密碼存放于何處?
虛擬帳號:僅用于訪問某服務器時用到的認證標識
存儲:
文本文件
SQL數據庫
ldap目錄存儲
basic認證配置示例:
(1)定義安全域
<Directory "">
Options None
AllowOverride None
AuthType Basic
AuthName "String"
AuthUserFile "/PAHT/TO/HTTPD_USER_PASSWD_FILE"
Require user username1 username2
</Directory>
允許帳號文件中的所有用戶登錄訪問:
Require valid-user
(2)提供帳號和密碼存儲(文本文件)
使用專門命令完成此類文件的創建以及用戶管理
htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username
-c:自動創建此處指定的文件,因此,僅應該在此文件不存在時使用
-m:md5格式加密
-s:sha格式加密
-D:刪除指定用戶
-b:可以指定用戶密碼,不用交互式
另外:基于組帳號進行認證
(1)定義安全域
<Directory "">
Options None
AllowOverride None
AuthType Basic
AuthName "String"
AuthUserFile "/PAHT/TO/HTTPD_USER_PASSWD_FILE"
AuthGroupFile "/PAHT/TO/HTTPD_GROUP_FILE"
Require group grpname1 grpname2
</Directory>
(2)提供帳號和密碼存儲(文本文件)
組文件:每一行定義一個組
GRP_NAME:username1 username2 …
12、虛擬主機
站點標識:socket
IP相同,但端口不同
IP不同,但端口均為默認端口
FQDN不同:
請求報文中首部
Host:www.gm.com
有三種實現方案:
基于IP:
為每個虛擬主機準備至少一個ip地址
基于port:
為每個虛擬主機使用至少一個獨立的port
基于FQDN:
為每個虛擬主機使用至少一個FQDN
注意:一般虛擬機不要與中心主機混用;因此,要使用虛擬主機,得先禁用'main'主機
禁用方法:注釋中心主機的DocumentRoot指令即可
虛擬主機的配置方法:
<VirtualHost IP:FQDN>
ServerName FQDN
DocumentRoot ""
</VirtualHost>
其他可用指令:
ServerAlias:虛擬主機的別名;可多次使用
ErrorLog:
Customlog:
<Directory "">
…
</Direcroty>
Alias
…
基于IP的虛擬主機示例:
<VirtualHost 10.1.43.3:80>
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost 10.1.43.4:80>
ServerName www.b.com
DocumentRoot "/www/b.com/htdocs"
</VirtualHost>
<VirtualHost 10.1.43.5:80>
ServerName www.c.com
DocumentRoot "/www/c.com/htdocs"
</VirtualHost>
基于端口的虛擬主機示例:
<VirtualHost 10.1.43.3:80>
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost 10.1.43.3:808>
ServerName www.b.com
DocumentRoot "/www/b.com/htdocs"
</VirtualHost>
<VirtualHost 10.1.43.3:8080>
ServerName www.c.com
DocumentRoot "/www/c.com/htdocs"
</VirtualHost>
基于FQDN的虛擬主機示例:
NameVirtualHost 10.1.43.3
<VirtualHost 10.1.43.3:80>
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost 10.1.43.3:80>
ServerName www.b.com
DocumentRoot "/www/b.com/htdocs"
</VirtualHost>
<VirtualHost 10.1.43.3:80>
ServerName www.c.com
DocumentRoot "/www/c.com/htdocs"
</VirtualHost>
13、status頁面
LoadModule status_module modules/mod_status.so
<Location /server-status>
SetHandler server-status
Order allow,deny
allow from 10.1.43
</Location>
14、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, socks5代理服務器,,通過http代理服務器上傳文件到FTP服務器等等,功能十分強大。
MIME:major/minor,image/png,image/gif
curl [options] [URL…]
curl的常用選項:
-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
用法:curl [options] [URL…]
另一個工具:elinks
elinks [OPTION]… [URL]…
-dump: 不進入交互式模式,而直接將URL的內容輸出至標準輸出;
15、user/group
指定以哪個用戶的身份運行http服務進程
User apache
Group apache
SUexec
16、使用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
17、https, http over ssl
SSL會話的簡化過程
(1) 客戶端發送可供選擇的加密方式,并向服務器請求證書;
(2) 服務器端發送證書以及選定的加密方式給客戶端;
(3) 客戶端取得證書并進行證書驗正:
如果信任給其發證書的CA:
(a) 驗正證書來源的合法性;用CA的公鑰解密證書上數字簽名;
(b) 驗正證書的內容的合法性:完整性驗正
(c) 檢查證書的有效期限;
(d) 檢查證書是否被吊銷;
(e) 證書中擁有者的名字,與訪問的目標主機要一致;
(4) 客戶端生成臨時會話密鑰(對稱密鑰),并使用服務器端的公鑰加密此數據發送給服務器,完成密鑰交換;
(5) 服務用此密鑰加密用戶請求的資源,響應給客戶端;
注意:SSL會話是基于IP地址創建;所以單IP的主機上,僅可以使用一個https虛擬主機;
回顧幾個術語:PKI,CA,CRL,X.509 (v1, v2, v3)
配置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
SSLCertificateKeyFile
(3) 測試基于https訪問相應的主機;
# openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]
18、httpd自帶的應用程序
htpasswd:basic認證基于文件實現,用于生成賬號和密碼的程序;
htdbm
htdigest
apachectl:httpd自帶的服務控制腳本,支持start和stop等子命令;
apxs:- APache eXtenSion tool
rotatelogs:日志滾動工具
access.log –>
access.log ,access.1.log –>
access.log ,access.1.log ,access.2.log
suexec:訪問某些有特殊權限的資源時,臨時切換至指定用戶身份運行
ab:apache benchmark web服務器的壓力測試工具
webbench, httpload, …
loadrunner, jmeter (ASF)
tcpcopy:網易,復制生產環境中的真實請求,并將之保存下來
19、ab – web service的壓力測試工具
命令行工具:ab, webbench, httpload, seige, …
GUI:loadrunner, jmeter
tcpcopy
ab [options] [http[s]://]hostname[:port]/path
請求數:-n requests
并發數:-c concurrency
長連接模式測試:-k
原創文章,作者:megedugao,如若轉載,請注明出處:http://www.www58058.com/50426