Web Service
傳輸層:提供進程地址
Port number
tcp:傳輸控制協議,面向連接,通信前需建立虛擬鏈路,結束后拆除;0-65535
udp:用戶數據報協議,無連接;0-65535
IANA
0-1023:眾所周知,永久分配給固定應用使用;22/tcp(ssh)、80/tcp(http)、443/tcp(https)
1024-41951:注冊端口,分配給程序員注冊為某服務使用;11211/udp、tcp(memcached)、3306/tcp(mysql)
41952+:客戶端程序隨機使用的端口;動態端口、私有端口;其范圍定義:/proc/sys/net/ipv4/ip_local_port_range
Socket:IPC的一種實現,允許位于不同主機(甚至同一主機)上的不同進程之間進行通信;數據交換;Socket API
SOCK_STREAM:tcp套接字
SOCK_DGRAM:udp套接字
SOCK_RAM:裸套接字
TCP協議的特性
建立連接,三次握手
將數據打包成段,校驗和(CRC-32)
確認、重傳、超時
排序、邏輯序號
流量控制,滑動窗口算法
擁塞控制:慢啟動,擁塞避免算法
Socket Domain(根據其所使用的地址)
AF_INET:Address Family,IPv4
AF_INET6:IPv6
AF_UNIX:同一主機上不同進程通信時使用
每類套接字都至少提供了兩種Socket,流、數據報
流:可靠地傳遞,面向連接,無邊界
數據報:不可靠地傳遞,有邊界
套接字相關的系統調用
socket():創建一個套接字
bind():綁定
listen():監聽
accept():接收請求
connect():請求連接建立
write():發送數據
read():接收數據
send()、recv()、sendto()、recvfrom()
http:hyper text transfer protocol
html:編程語言,超文本標記語言
CSS:Cascading Style Sheet
js:javascript
MIME:Multipurpose Internet Mail Extension
工作機制
http請求
http響應
Web資源,web resource
靜態文件:jpg、gif、html、txt、js、css、mp3、avi
動態文件:php、jsp
媒體
媒體類型(MIME類型):major/minor
text/html
text/plain
image/jpeg
image/gif
URI:Uniform Resource Identifier
URL:Uniform Resource Locator,用于描述某服務器上某特定資源的位置
Scheme://Server:Port/path/to/resource
URN:Uniform Resource Naming
http協議版本
HTTP/0.9:原型版本,功能簡陋
HTTP/1.0:第一個廣泛使用的版本,支持MIME
HTTP/1.1:增強了緩存功能
HTTP/2.0:
一次完整的http請求過程
- 建立或處理連接,接收請求或拒絕請求
-
接收請求
接收來自于網絡的請求報文中對某資源的一次請求的過程
并發訪問響應模型(Web I/O)
單進程I/O結構:只啟動一個進程處理用戶請求,且一次只處理一個,多個請求串行響應
多進程I/O結構:并行啟動多個進程,每個進程響應一個請求
復用I/O結構:一個進程響應多個請求
多線程模型:一個進程生成多個線程,每個線程響應一個用戶請求
事件驅動:event-driven
復用的多進程I/O結構:啟動多個進程,每個進程響應多個請求
-
處理請求:對請求報文進行解析,并獲取請求的資源及請求方法等相關信息
元數據:請求數據首部
<method><URL><VERSION>
Host:請求的主機名稱
Connection
-
訪問資源:獲取請求報文中請求的資源
web服務器,即存放了web資源的服務器,負責向請求者提供對方請求的靜態資源,或動態運行后生成的資源,這些資源放置于本地文件系統某路徑下,稱為DocRoot
web服務器資源路徑映射方式
docroot
alias
虛擬主機docroot
用戶家目錄docroot
-
構建響應報文
資源的MIME類型
顯式分類
魔法分類
協商分類
URL重定向
web服務構建的響應并非客戶端請求的資源,而是資源另外一個訪問路徑
- 發送響應報文
- 記錄日志
http服務器程序
httpd(apache)
nginx
lighttpd
應用程序服務器
IIS
tomcat,jetty,jboss,resin
webshpere,weblogic,oc4j
httpd的安裝配置和使用
httpd:apache
httpd的特性
高度模塊化,core+modules
DSO:Dynamic Shared Object
MPM:Multipath Processing Modules
prefork:多進程模型,每個進程響應一個請求
一個主進程負責生成多個子進程,子進程稱為工作進程,主進程負責監聽套接字,每個子進程處理一個用戶請求,即便沒有用戶請求,也會預先生成多個空閑進程(≤1024),隨時等待請求到達
worker:多線程模型(多進程生成,一個進程生成多個線程),一個線程響應一個請求
event:事件驅動模型,一個線程響應多個請求
安裝方式
rpm
編譯安裝
CentOS6
程序環境
配置文件
/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
配置文件的組成
Section 1:Global Environment
Section 2:”Main” server configuration
Section 3:Virtual Hosts
配置格式:directive value
directive:不區分大小寫
value:為路徑時,取決于文件系統
常用配置
-
修改監聽的IP和端口
Listen [IP:]PORT
省略IP表示監聽本機的所有IP,Listen可重復出現多次
-
持久連接
Persistent Connection:連接建立,每個資源獲取完成后不會斷開連接,而是繼續等待其他的請求完成
如何斷開?
數量限制:100
時間限制:可配置
副作用:對并發訪問量較大的服務器,持久連接功能會使有些請求得不到響應
折中:使用較短的持久連接時間
httpd-2.4支持ms級持久時間
非持久連接
KeepAlive On|Off
MaxKeepAliveRequests n
KeepAliveTimeout n
測試:telnet HOST PORT
GET /URL HTTP/1.1
Host:HOSTNAME or IP
-
MPM,Multipath Process Modules,多道處理模塊
prefork、worker、event
httpd-2.2不支持同時編譯多個模塊,所以只能編譯時選定一個,rpm安裝的包提供三個二進制程序文件,分別用于實現不同MPM機制的支持
確認方法:ps aux | grep httpd
默認為/usr/sbin/httpd,其使用prefork
查看模塊列表
查看靜態編譯的模塊
httpd -l
查看靜態編譯及動態裝載的模塊
httpd -M
更換使用的httpd程序
/etc/sysconfig/httpd
HTTPD=
重啟服務生效
prefork的配置
<IfModule prefork.c>
StartServers 8
服務器進程啟動時啟動的進程數MinSpareServers 5
最小空閑進程數MaxSpareServers 20
最大ServerLimit 256
為MaxClients指定的在其生命周期內的最大值MaxClients 256
最大并發請求數MaxRequestsPerChild 4000
一個服務器進程能響應的最大請求數</IfModule>
worker的配置
<IfModule worker.c>
StartServers 4
服務器進程啟動時啟動的進程數MaxClients 300
服務器端最大啟動的線程數MinSpareThreads 25
最小空閑線程數MaxSpareThreads 75
最大ThreadsPerChild 25
MaxRequestsPerChild 0
一個服務器進程能響應的最大請求數</IfModule>
PV、UV
PV:Page View
UV:User View
獨立IP量
-
DSO
配置指令實現模塊加載
LoadModule <mod_name> <mod_path>
模塊路徑可使用相對地址,相對于ServerRoot(/etc/httpd)而言,/etc/httpd/modules
-
定義”Main” server的文檔頁面路徑
DocumentRoot
文檔路徑映射
DocumentRoot指向的路徑為URL路徑的起始位置
DocumentRoot “/var/www/html”
test/index.html –> http://HOST:PORT/test/index.html
-
站點訪問控制
可基于兩種類型的路徑指明對哪些資源進行訪問控制
文件系統路徑
<Directory “”> </Directory>
<File “”> </File>
<FileMatch “正則表達式”> </FileMatch>
URL路徑
<Location “”> </Location>
<LocationMatch “”> </Location>
訪問控制機制
基于來源地址
基于用戶賬號密碼
-
Directory中基于來源地址實現訪問控制
-
Options
可用值:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews None All
Indexes:索引
FollowSymLinks:允許跟蹤符號鏈接文件
- AllowOverride
-
基于來源地址的訪問控制機制
Order allow,deny
檢查次序,前為例外,后為默認機制Order deny,allow
Allow from all
Deny from all
來源地址
?
?IP地址
NetAddr
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
-
-
定義默認主頁面
DirectoryIndex index.html index.html.var
-
日志設定
錯誤日志
ErrorLog logs/error_log
LogLevel warn
debug, info, notice, warn, error, crit,
alert, emerg.訪問日志
CustomLog logs/access_log combined
LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined
%h:客戶端IP地址
%l:Remote logname (from identd, if supplied). -表示為空
%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,請求報文的首行信息
%s:響應狀態碼
%b:響應報文的大小,單位為byte,不包含響應報文首部
%{Referer}i:請求報文中”referer”首部的值,當前資源的訪問入口,及從哪個頁面中的超鏈接跳轉而來
%{User-Agent}i:請求報文中”User-Agent”首部的值,及發出請求用到的應用程序
詳情: http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
-
路徑別名
Alias /URL/ “PATH/TO/SOMEDIR/”
Alias /bbs/ “/forum/htdocs”
http: //www.123.com/bbs/index.html
–> /forum/htdocs/bbs/
-
設定默認字符集
AddDefaultCharset UTF-8
GBK、GB2312、GB18030
-
基于用戶的訪問控制
認證質詢
WWW-Authenticate:響應碼為401,拒絕客戶端請求,并說明要求客戶端提供賬號和密碼
認證
Authorization:客戶端用戶填入賬號和密碼后再次發送請求報文,認證通過,則服務器發送響應的資源
認證方法
basic:明文
digest:消息摘要
安全域:需要用戶通過認證后才能訪問的路徑
應該通過名稱對其進行標識,并用于告知用戶認證的原因
用戶的賬號和密碼存儲于何處
虛擬賬號:僅用于訪問某服務時用到的認證標識
存儲
文本文件
SQL數據庫
ldap
nis
basic認證
-
定義安全域
<Directory “”>
Options None
AllowOverride None
AuthType Basic
AuthName “STRING”
AuthUserFile “/PATH/TO/HTTPD_USER_PASSWD_FILE”
Require user username1 username2 …
</Directory>
允許賬號文件中的所有用戶登錄訪問
Require valid-user
-
提供賬號和密碼存儲
使用htpasswd命令進行管理
htpasswd [options] passwordfile username
-c:自動創建passwordfile,因此,僅應該在添加第一個用戶時使用
-m:md5加密用戶密碼
-s:sha1加密用戶密碼
-D:刪除指定用戶
-
實現基于組進行認證
<Directory “”>
Options None
AllowOverride None
AuthType Basic
AuthName “STRING”
AuthUserFile “/PATH/TO/HTTPD_USER_PASSWD_FILE”
AuthGroupFile “/PATH/TO/HTTPD_GROUP_PASSWD_FILE”
Require group group1 group2…
</Directory>
要提供用戶賬號文件和組文件
組文件:每行定義一個組
GRP_NAME:user1 user2…
?
?
-
-
虛擬主機
三種實現方案
基于IP
為每個虛擬主機準備至少一個IP地址
基于port
為每個虛擬主機準備至少一個專用port,實踐中少用
基于hostname
為每個虛擬主機準備至少一個專用hostname
可混合使用三種方式中任意方式
一般虛擬主機不要與中心主機混用,要使用虛擬主機,先禁用中心主機
禁用中心主機:注釋DocumentRoot
每個虛擬主機都有專用配置
<VirtualHost “IP:PORT”>
ServerName
DocumentRoot “”
<Directory “”>
</Directory>
</VirtualHost>
ServerAlias:虛擬主機的別名
ErrorLog
CustomLog
-
內置的status頁面
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from .example.com
</Location>
http協議和httpd的配置
URL:Uniform Resource Locator
URL方案:scheme
服務器地址:ip:port
資源路徑
<Scheme>://<user>:<password>@<Server>:<Port>/<path/to/resource>;<params>?<query>#<frag>
params:參數
query:查詢
frag:錨定符
相對URL
絕對URL
http協議
http/0.9,http/1.0,http/1.1,http/2.0
http協議:stateless
服務器無法持續追蹤訪問者來源
cookie,session
http事務
請求:request
響應:response
報文語法格式
request報文
<method> <request-URL> <version>
<headers>
?
?
<entity-body>
response報文
<version> <status> <reason-phrase>
<headers>
?
?
<entity-body>
method:請求方法,標明客戶端希望服務器對資源執行的動作
GET、HEAD、POST、PUT、DELETE、OPTIONS、TRACE
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:成功響應,請求的所有數據通過響應報文的entity-body部分發送,OK
301:請求的URL指向的資源已經被刪除,但在響應報文中通過首部Location指明了資源現在所處的新位置;Moved Permanently
302:與301相似,但在響應報文中指定的為資源現在所處的臨時新位置;Found
304:客戶端發出了條件式請求,但服務器上的資源未曾發生變化,則通過響應此響應狀態碼通知客戶端;Not Modified
401:需要輸入賬號和密碼才能訪問資源,Unauthorized
403:請求被禁止;Forbidden
404:服務器無法找到客戶端請求的資源;Not Found
500:服務器內部錯誤;Internal Server Error
502:代理服務器從后端服務器收到一條偽響應;Bad Gateway
headers
格式
Name: Value
首部的分類
通用首部
Date:報文的創建時間
Connection:連接狀態,keepalive、close
Via:顯示報文經過的中間節點
Cache-Control:控制緩存
Pragma
請求首部
Accept:通知服務器自己能夠接受的媒體類型
Accept-Charset:接受的字符集
Accept-Encoding:接受的編碼格式
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:列出對此實體可使用的請求方法
Location:告知客戶端真正的實體位于何處
Content-Encoding
Content-Language
Content-Length:實體的長度
Content-Location:實體真正所處位置
Content-Type:實體的對象類型
緩存相關
Etag:實體的擴展標簽
Expires:實體的過期時間
Last-Modified:最后一次修改的時間
擴展首部
httpd-2.2
curl命令
curl是基于URL語法在命令行方式下工作的文件傳輸工具,支持FTP、SFTP、HTTP、HTTPS、GOPHER、TELNET、DICT、FILE、LDAP等協議,支持HTTPS認證,支持HTTP的POST、PUT等方法、FTP上傳
kerberos認證,HTTP上傳,代理服務器,Cookie,用戶名/密碼認證
上傳下載斷點續傳,http代理服務器管道,IPv6
socks5代理服務器,通過http代理服務器上傳文件到FTP服務器等
curl [option] URL
-A/–user-agent:設置用戶代理發送給服務器
–basic:使用http基本認證
-e/–referer URL:來源地址
–cacert FILE:CA證書
–compressed:要求返回的壓縮格式
-H/–header <line>:自定義頭部信息傳遞給服務器
-I/–head:只顯示響應報文首部信息
–limit-rate:設置傳輸速度
-u/–user <user[:password]>:設置服務器的用戶名和密碼
-0/–http1.0:使用HTTP1.0
elinks
elinks [option] URL
-dump:不進入交互模式,而直接將URL的內容輸出至標準輸出
使用mod_deflate模塊壓縮頁面優化傳輸速度
適用場景
節約帶寬,額外消耗CPU,較老瀏覽器可能不支持
壓縮適于壓縮的資源,如文本文件
https
http over ssl = https 443/tcp
SSL會話的簡化過程
- 客戶端發送可供選擇的加密方式,并向服務器請求證書
- 服務器端發送證書以及選定的加密方式給客戶端
-
客戶端取得證書并進行證書驗證
如果信任給其發證書的CA
a、驗證證書來源的合法性,用CA的公鑰解密證書上的數字簽名
b、驗證證書內容的合法性,完整性校驗
c、檢查證書的有效期限
d、檢查證書是否被吊銷
e、證書擁有者的名字,與訪問的目標主機要一致
- 客戶端生成臨時會話密鑰(對稱密鑰),并使用服務器端的公鑰加密此數據發送給服務器,完成密鑰交換
-
服務器用此密鑰加密用戶請求的資源,響應給客戶端
SSL會話是基于IP地址創建,所以單IP的主機上,僅可以使用一個https虛擬主機
配置httpd支持https
-
測試:通過私建CA發證書
a、創建私有CA
b、在服務器創建證書簽署請求
c、CA簽證
-
配置httpd支持使用ssl及使用的證書
yum install mod_ssl
配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile
SSLCertificateKeyFile
-
測試基于https訪問響應的主機
openssl s_client [-connect host:port] [-cert filename] [CApath directory] [-CAfile filename]
httpd自帶的工具程序
htpasswd:basic認證基于文件實現時,用到的賬號密碼文件生成工具
apachectl:httpd自帶的服務控制腳本,支持start、stop
apxs:由httpd-devel包提供的,擴展httpd使用第三方模塊的工具
rotatelogs:日志滾動工具
access.log –>
access.log,access.1.log
access.log,access.1.log,access.2.log
suexec:訪問某些有特殊權限設置的資源時,臨時切換至指定用戶進行
ab:apache benchmark
httpd壓力測試工具
ab
ab [options] URL
-n:總的請求數
-c:模擬的并發數
-k:以持久連接模式測試
ulimit -n:調整當前用戶所同時打開的文件數
webbench
http_load
jmeter
loadrunner
tcpcopy
httpd-2.4
新特性
- MPM支持運行DSO機制,以模塊形式按需加載
- 支持event MPM
- 支持異步讀寫
- 支持每模塊及每個目錄分別使用各自的日志級別
- 每請求配置:<If>
- 增強版的表達式分析器
- 支持ms級的keepalive timeout
- 基于FQDN的虛擬主機不再需要NameVirtualHost指令
- 支持用戶自定義變量
新模塊
mod_proxy_fcgi
mod_ratelimit
mod_remoteip
修改了一些配置機制
不再支持使用Order,Deny,Allow來做基于IP的訪問控制機制
安裝httpd-2.4
-
CentOS6
httpd依賴于apr,apr-util,[apr-icon]
apr:apache portable runtime
編譯安裝步驟
1.4+版的apr和apr-util
前提:安裝開發環境,安裝pcre-devel
yum groupinstall “Development Tools” “Server Platform Development”
-
apr
./configure –prefix=/usr/local/apr
make && make install
-
apr-util
./configure –prefix=/usr/local/apr-util –with=/usr/local/apr
make && make install
-
groupadd -r apache
useradd -r -g apache apache
./configure –prefix=/usr/local/apache –sysconf=/etc/httpd2.4 –enable-so –enable-ssl –enable-cgi –enable-rewrite –with-zlib –with-pcre –with-apr=/usr/local/apr –with-apr-util=/usr/local/apr-util –enable-modules=most –enable-mpms-shared=all –with-mpm=prefork
make && make install
-
啟動服務
apachectl
-
-
CentOS7
配置文件
主配置文件:/etc/httpd/conf/httpd.conf
模塊配置文件:/etc/httpd/conf.modules.d/*.conf
輔助配置文件:/etc/httpd/conf.d/*.conf
mpm:以DSO機制提供,配置文件00-mpm.conf
服務控制:systemctl {start|stop|restart|status|reload} httpd.service
配置
-
切換使用MPM
LoadModule mpm_NAME_module modules/mod_mpm_NAME.so
NAME:prefork、event、worker
- 修改”Main”Server的DocumentRoot
-
基于IP的訪問控制法則
允許所有主機訪問:Require all granted
拒絕所有主機訪問:Require all deny
控制特定IP訪問
Require ip IPADDR:授權指定來源地址的主機訪問
Require not ip IPADDR:拒絕指定來源地址的主機訪問
IPADDR
IP:192.168.100.100
Net/Mask:192.168.100.0/255.255.255.0
Net/Length:192.168.100.0/24
Net:192.168.100
控制特定主機訪問
Require host HOSTNAME
Require not host HOSTNAME
HOSTNAME
FQDN:特定主機
DOMAIN:指定域內的所有主機
<RequireAll>
Require all granted
Require not ip IPADDR
</RequireAll>
-
虛擬主機
基于IP、Port和FQDN都支持
基于FQDN的不再需要NameVirtualHost指令
-
ssl
啟用模塊:LoadModule ssl_module modules/mod_ssl.so
-
服務腳本
/etc/rc.d/init.d/httpd
?
?
-
?
?
?
?
原創文章,作者:ZBD20,如若轉載,請注明出處:http://www.www58058.com/100298