Web Service
傳輸層:提供進程地址
port number:
tcp:傳輸控制協議,面向連接的協議,通信前需要建立虛擬鏈路,結束后拆除鏈路;端口:0-65535
udp:user datagram protocol,無連接的協議;端口:0-65535
IANA:
0-1023:特權端口,永久分配給固定應用使用
1024-41951:注冊端口,但要求并不是特別嚴格,分配給程序員注冊為某應用使用。
41952+:客戶端程序隨機使用的端口;其范圍的定義:/proc/sys/net/ipv4/ip_local_port_range
socket:IPC(進程間通信)的一種實現,允許位于不同主機(甚至同一主機)上不同進程間進行通訊,數據交換;socket API(應用程序編程接口)
SOCK_STREAM:tcp套接字
SOCK_DGRAM:udp套接字
SOCK_RAW:裸套接字
IPv4分類:
A:1-127
B:128-191
C:192-223
D:224-239
E:240-254
私有地址:
A:10.0.0.0/8
B:172.16.0.0/16-172.31.0.0/16
C:192.168.0.0/24-192.168.255.0/24
TCP協議的特性:
建立連接,三次握手
將數據打包成段,校驗和(CRC-32)
確認、重傳以及超時
排序:邏輯序號
流量控制:滑動窗口算法
擁塞控制:慢啟動和擁塞避免算法
http:Hyper ? Text ? ?Transfer ? ?Protocol超文本傳輸協議,80/tcp
html:編程語言,Hyper ? ?Text ? ?Markup ? ?Language超文本標記語言
工作機制:
http請求
http響應
URL:統一資源定位符(uniform ?resource ? locator)
URL方案:scheme
服務器地址:ip:port
資源路徑:
基本語法:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<querry>#<frag>
params:參數;提示符為;
querry:查詢條件;提示符為?
frag:片段;提示符為#
http協議:stateless無狀態連接:
追蹤訪問者來源得借助其他手段:cookie、session。
web資源:web resource
靜態文件:.jpg,.gif,.html
動態文件:.jsp,.jsp
并發訪問響應模型:(web I/O)
一、單進程I/O結構:啟動一個進程處理用戶請求,而且一次只處理一個,多個請求被串行響應;
二、多進程I/O結構:并行啟動多個進程,每個進程響應一個請求;
三、復用I/O結構:一個進程響應n個請求;
1、多線程模型:一個進程生成N個線程,每個線程響應一個用戶請求;在linux效果不佳
2、事件驅動:event-driven
四、復用的多進程I/O結構:啟動多個(m)進程,每個進程響應n個請求;
http服務器程序:
httpd(apache)
nginx
lighttpd
應用程序服務器:IIS、tomcat、jetty、jboss、resin、webshpere、weblogic、oc4j
查看市場份額:www.netcraft.com
報文語法格式:
request報文:
<method> ? ? <request-URL> ? ?<version>
<headers>
<entity-body>
response報文:
<version> ? ?<status> ?<reason-phrase>
<headers>
<entity-body>
http方法:
GET:請求獲取一個資源,需要服務器發送
HEAD:跟GET近似,但其不需要服務響應請求的資源,而返回響應首部
POST:基于HTML表單向服務器提交數據,服務器通常需要存儲此數據;(位置:通常為關系型數據庫)
PUT:與GET相反,向服務器發送資源;服務器通常需要存儲此資源;(位置:通常為文件系統)
DELETE:刪除URL指向的資源
OPTIONS:探測服務器端對請求的URL所支持使用的請求方法
TRACE:跟一次請求中間所經過的代理服務器、防火墻或網關等
http狀態碼:
1XX:信息性狀態碼
2XX:成功狀態碼
200:OK
201:CREATED
3XX: 重定向類的狀態碼
301: Moved Permanently, 永久重定向
302: Found, 臨時重定向,會在響應報文中使用“Location: 新位置”;
304: Not Modified
4XX:客戶端類錯誤
403:Forbidden
404: Not Found
405: Method Not Allowed
5XX:服務器類的錯誤
500:Internal Server Error, 服務器內部錯誤
502:Bad Gateway, 代理服務器從上游服務器收到一條偽響應;
503:Service Unavailable, 服務暫時不可用
http協議首部:
通用首部
請求首部
響應首部
實體首部
擴展首部:非標準首部,可由程序員自行創建;X-Forward-For, X-Via
通用首部:
Date:報文的創建時間
Connection:連接狀態,如Keep-alive,close
Via:顯示報文經過的中間節點
Cache-Control:緩存控制
Pragma
請求首部:
Accept: 通知服務器自己可接受的媒體類型
Accept-Charset:接受的字符集
Accept-Encoding:接受編碼格式
Accept-Language:接受的語言
Client-IP:客戶端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的安裝配置和使用:
httpd:apache
特性:
高度模塊化:core + ?modules;
DSO:dynamic shared object:動態共享目標
MPM:Multi-Processing Modules:多處理模塊
(a)prefork:多進程模型,每個進程響應一個請求;一個主進程負責生成n個子進程,每個子進程處理一個請求;即便沒有用戶請求,也會預先生成多個空閑進程,隨時等待請求到達;最大不會超過1024個;
(b)worker:多線程模型(多進程生成,一個進程生成多個線程),啟動多個進程,每個進程生成多個線程,每個線程響應一個用戶請求;
(c)event:事件驅動模型;啟動多個線程,每個線程響應n個請求;
httpd的功能特性:
豐富用戶認證:基本認證和摘要認證
CGI:原生支持perl CGI
虛擬主機:
基于端口、IP、主機名
反向代理:
負載均衡
用戶站點:
路徑別名:
支持第三方模塊
安裝方式:
rpm包
源碼編譯
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
模塊目錄:
/etc/httpd/modules: 鏈接文件
/usr/lib64/httpd/modules
常用配置:
1、持久連接:persistence connection:連接建立,每個資源獲取完成后不會斷開連接,而是繼續等待其他請求的完成。httpd-2.4支持毫秒級的持久連接。
KeepAlive {On|Off}
MaxKeepAliveRequests #:最大持久請求數量
KeepAliveTimeout #:最大持久時長;
測試:
telnet HOST PORT
GET /URL ?HTTP/1.1
Host:HOSTNAME or IP
2、MPM參數:
確認方法:# ps aux | grep httpd
查看靜態編譯的模塊: # httpd -l
查看靜態編譯及動態裝載的模塊: ?# httpd -M
更換MPM的方法:編輯/etc/sysconfig/httpd中的HTTPD=,重啟服務生效;
<IfModule prefork.c>
StartServers ? ? ? 8 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? :啟動時啟動的進程數
MinSpareServers ? ?5 ? ? ? ? ? ? ? ? ? ? ? ? ?:最小空閑進程數
MaxSpareServers ? 20 ? ? ? ? ? ? ? ? ? ? ? ?:最大空閑進程數
ServerLimit ? ? ?256
MaxClients ? ? ? 256 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?:最大并發請求量
MaxRequestsPerChild ?4000
</IfModule>
<IfModule worker.c>
StartServers ? ? ? ? 4 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? :啟動時啟動的進程數
MaxClients ? ? ? ? 300 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?:最大并發請求量
MinSpareThreads ? ? 25 ? ? ? ? ? ? ? ? ? ? ? ? :最小空閑線程
MaxSpareThreads ? ? 75 ? ? ? ? ? ? ? ? ? ? ? ?:最大空閑線程
ThreadsPerChild ? ? 25 ? ? ? ? ? ? ? ? ? ? ? ? ? :每個進程啟動的線程數
MaxRequestsPerChild ?0
</IfModule>
3、指定監聽的地址和端口
Listen [IP:]PORT
此指令可重復指定多次;
4、DSO(動態共享對象)機制裝載的模塊
查看靜態編譯及動態裝載的模塊
# httpd -M
?模塊路徑可使用相對路徑:相對于ServerRoot(/etc/httpd)指向的路徑而言;/etc/httpd/modules/;
LoadModule Module_Name /path/to/Module_File
5、定義“Main” server的文檔頁面路徑
DocumentRoot “/path/to/somewhere”
6、站點路徑訪問控制
基于本地文件系統路徑:
<Directory “/path/to/somewhere”> ? </Directory>
<File ?“”> ? </File>
<DirectoryMatch ?“”> ? </DirectoryMatch>
<FileMatch ?“”> ? </FileMatch>
基于URL訪問路徑做訪問控制
<Location “/path/to/URL”> ? </Location>
<LocationMatch “/path/to/URL”> ? </LocationMatch>
7、于Directory中可用的訪問控制
(1) Options
Indexes:索引;當訪問的路徑下無默認的主頁面,將所有資源以列表形式呈現給用戶;危險,慎用;
FollowSymlinks:允許跟蹤符號鏈接文件;
(2) AllowOverride
支持在每個頁面目錄下創建.htaccess用于實現對此目錄中資源訪問時的訪問控制功能。
(3)基于來源地址的訪問控制機制
Order:檢查次序,后者為默認法則;
Allow ? from
Deny ? ?from
8、定義默認主頁面:DirectoryIndex
9、日志設定:
錯誤日志:
ErrorLog “/path/to/error_log”
LogLevel {debug|info|notice|warn|error|crit|alert|emerg}
訪問日志:
CustomLog “/path/to/access_log” LogFormat_Name
LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined
? ? %h: 客戶端ip地址
? ? %l: 遠程登錄名,通常為-
? ? %u: 認證時輸入用戶名,沒有認證時為-
? ? %t: 服務器收到 用戶請求時的時間
? ? %r:請求報文的首行信息
? ? %>s: 響應狀態碼
? ? %b: 響應報文的大小,單位是字節,不包含響應報文首部
? ? %{Referer}i:請求報文當中“Referer”首部的值;當前資源的訪問入口,即從哪個頁面中的超鏈接跳轉而來;
? ? %{User-Agent}i:請求報文當中“User-Agent”首部的值;即發出請求用到的應用程序;
? ? %{HEADER_NAME}i: 記錄指定首部對應的值
10、路徑別名:
實現URL路徑的映射,從而所訪問的資源不再依賴于站點根目錄;
Alias /URL/ “/path/to/somewhere/”
11、設定默認字符集
AddDefaultCharset ? ? UTF-8
國標中文編碼:GB2312, GB18030, GBK
12、基于用戶的訪問控制
認證質詢:WWW-Authenticate:響應碼為401,拒絕客戶端請求,并說明要求客戶端提供賬號密碼;
認證:Authenrization:客戶端用戶填入賬號密碼后再次發送請求報文,認證通過,則服務器發送響應資源;
認證類型:
basic:明文
digest:消息摘要,通過md5加密發送;
?安全域:需要用戶認證后方能訪問的路徑;應該通過名稱對其進行標識,并用于告知用戶認證的原因;
用戶的賬號密碼存儲于何處?
虛擬賬號:僅用于訪問某服務時用到的認證標識;
存儲:
1、文本文件:
2、SQL數據庫
3、ldap輕量目錄訪問協議
4、nis
basic認證:
(1)定義安全域
<Directory ?“”>
Options None
AllowOverride None
AuthType ? Basic
AuthName ? ? “”
AuthUserFile ? “”
Require user ?username1 ?username2…
</Directory>
允許賬號文件中的所有用戶登錄訪問:Require ?valid-user
(2)提供賬號密碼存儲(文本文件)
使用htpasswd命令進行管理
htpasswd ? [options] ?passwordfile ? username
-c:自動創建passwordfile,因此,僅應該在添加第一個用戶時使用;
-m:md5加密用戶密碼;
-s:sha1加密用戶密碼;
-D:刪除指定用戶
(3)實現基于組進行認證:
<Directory ?“”>
Options None
AllowOverride None
AuthType ? Basic
AuthName ? ? “”
AuthGroupFile ? “”
Require group ?group1 ?group2…
</Directory>
需提供用戶文件和組文件
組文件:每一行定義一個組
GRP_NAME:user1 ? user2 user3…
?13、虛擬主機
配置文件語法檢查:
httpd -t
service httpd configtest
三種實現方案:
1、基于ip:為每個虛擬主機準備至少一個ip地址;
2、基于port:為每個虛擬主機準備至少一個專用port;
3、基于hostname:為每個虛擬主機準備至少一個專用hostname;需開啟NameVirtualHost *:80
注意:一般虛擬主機不要與中心主機混用,所以,要使用虛擬主機,先禁用中心主機:注釋DocumentRoot;
每個虛擬主機都有專用配置:
<VirtualHost ? “IP:PORT”>
ServerName
DocumentRoot
</VirtualHost>
ServerAlias:虛擬主機的別名
ErrorLog:錯誤日志
CustomLog:訪問日志
<Directory ? “”> ? ? ? ?</Directory>
<Location ? ?“”> ? ? ? ? </Location>
14、內置的status頁面
ExtendedStatus On:顯示擴展的詳細信息
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 172.20
</Location>
?15、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服務器等等,功能十分強大。
curl [options] [URL…]
curl的常用選項:
? ?-A/–user-agent <string> 設置用戶代理發送給服務器
? ? –basic 使用HTTP基本認證
? ?-u/–user <user[:password]>設置服務器的用戶和密碼
? ?–tcp-nodelay 使用TCP_NODELAY選項
? ?-e/–referer <URL> 來源網址
? ?–cacert <file> CA證書 (SSL)
? ?–compressed 要求返回是壓縮的格式
? ?-H/–header <line>自定義頭信息傳遞給服務器
? ?-I/–head 只顯示響應報文首部信息
? ?–limit-rate <rate> 設置傳輸速度
? ?-0/–http1.0 使用HTTP 1.0
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
httpd: ssl
ssl模塊
單獨成包
ssl握手要完成的工作:
交換協議版本號
選擇雙方都支持的加密方式
客戶端對服務器端實現身份驗正
密鑰交換
SSL會話的簡化過程:
(1)客戶端發送可供選擇的加密方式,并向服務器請求證書;
(2)服務器端發送證書以及選定的加密方式給客戶端;
(3)客戶端取得證書并進行證書驗證;
如果信任給其發證書的CA:
(a)驗證證書來源的合法性:用CA的公鑰解密證書上數字簽名;
(b)驗證證書的內容的合法性:完整性驗證;
(c)檢查證書的有效期限;
(d)檢查證書是否被吊銷;
(e)證書中擁有者的名字,與訪問的目標主機要一致;
(4)客戶端生成臨時會話密鑰(對稱密鑰),并使用服務器端的公鑰加密此數據發送給服務器,完成密鑰交換;
(5)服務器用此密鑰加密用戶請求的資源,響應給客戶端;
?注意:ssl會話基于IP地址創建,所以,每一個IP僅創建一個SSL會話;單IP的主機上,僅可以使用一個https虛擬主機;
配置httpd支持https:
(1)為服務器申請數字證書;
測試:通過私建CA發證書
(a)創建私有CA
# cd /etc/pki/CA/
# touch index.txt
# echo 01 > serial
# (umask 077;openssl genrsa -out private/cakey.pem 2048)
# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655
# mkdir -pv /etc/httpd/ssl
# cd?/etc/httpd/ssl
# (umask 077; openssl genrsa -out httpd.key 1024)
# openssl req -new -key httpd.key -out httpd.csr -days 3655
# openssl ca -in httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 3655
# scp
(2) 配置httpd支持使用ssl,及使用的證書:
# yum install mod_ssl
配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile
SSLCertificateKeyFile
(3) 測試基于https訪問相應的主機:
# openssl s_client [-connect IP:PORT] [-cert filename] [-CApath filename] [-CAfile filename]
18、httpd自帶的工具程序
htpasswd:basic認證基于文件實現時,用到的賬號密碼生成工具;
apachectl:httpd自帶的服務控制腳本,支持start、stop、restart;
apxs:有httpd-devel包提供的,擴展httpd使用第三方模塊的工具;
rotatelogs:日志滾動工具;
suexec:訪問某些有特殊權限配置的資源時,臨時切換至指定用戶運行;
ab:apache benchmark:自帶的http壓力測試工具
19、http壓力測試工具
ab
webbench
http_load
jmeter
loadrunner
tcpcopy
ab [options] ?URL
-n:總的請求數
-c:模擬的并發數
-k:以持久連接模式測試
ulimit -n ?#:調整當前用戶所同時打開的文件數;
httpd-2.4的新特性:
1)MPM支持在運行時裝載(即DSO機制);
2)支持event mpm
3)異步讀寫
4)支持每模塊及每目錄分別使用不同的日志級別
5)每請求的配置;<If>
6)增強版的表達式分析器
7)毫秒級的keep alive的timeout
8)基于FQDN的虛擬主機不再需要NameVirtualHost指令;
9)支持用戶使用自定義變量
新模塊:
(1)mod_proxy_fcgi
(2)mod_ratelimit
(3)mod_remoteip
修改了一些配置機制:
不再支持使用order, allow, deny定義基于ip的訪問控制;改為require
安裝httpd-2.4
centos 6:apr-1.3
httpd程序依賴于apr-1.4+和apr-util-1.4+、[apr-icon]
apr: apache portable runtime
centos6安裝httpd-2.4編譯安裝步驟:
安裝1.4+的apr和1.4+的apr-util
前提:安裝開發環境,pcre-devel
# yum groupinstall “development tools” “server plantform development”
# yum install pcre-devel
# yum install expat-devel
# yum install openssl-devel
(1)apr
# ./configure –prefix=/usr/local/apr
# make && make install
(2)apr-util
# ./configure –prefix=/usr/local/apr-util –with-apr=/usr/local/apr
# make && make install
(3)編譯安裝httpd-2.4
# useradd -r apache
# cp -r /root/apr-1.6.3 /root/httpd-2.4.33/srclib/apr
# cp -r /root/apr-util-1.6.1 /root/httpd-2.4.33/srclib/apr-util
./configure –prefix=/usr/local/apache –sysconfdir=/etc/httpd24 –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-mpms-shared=all –with-mpm=event –enable-modules=most?–with-included-apr
# make && make install
centos 7:httpd-2.4
主配置文件:/etc/httpd/conf/httpd.conf
模塊配置文件:/etc/httpd/conf.modules.d/*.conf
輔助配置文件:/etc/httpd/conf.d/*.conf
mpm:以DSO機制提供,配置文件/etc/httpd/conf.modules.d/00-mpm.conf
服務控制:systemctl {start|stop|restart|status} httpd.service
配置:
(1)切換使用MPM;編輯/etc/httpd/conf.modules.d/00-mpm.conf
LoadModule mpm_NAME_module modules/mod_mpm_NAME.so
NAME:prefork、event、worker
(2)修改‘Main’server的DocumentRoot
(3)基于IP的訪問控制法則
允許所有主機訪問:Require all granted
拒絕所有主機訪問:Require all deny
控制指定ip訪問:
Require ip IPADDR:授權指定ip訪問
Require not ip IPADDR:拒絕指定ip訪問
控制指定hostname訪問:
Require host HOSTNAME:授權
Require not host ?HOSTNAME:拒絕
示例:
<RequireAll>
Require all granted
Require not ip 127.0.0.1
</RequireAll>
(4)虛擬主機
?基于IP、PORT、FQDN都支持
基于FQDN的不再需要NameVirtualHost指令;
(5)ssl
安裝mod_ssl:yum ?install mod_ssl
啟用模塊:編輯/etc/httpd/conf.modules.d/00-ssl.conf
LoadModule ssl_module modules/mod_ssl.so
(6)centos6的httpd-2.4腳本;參考rpm安裝后的腳本修改
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/96964