Web Service
傳輸層:提供進程地址
Portnumber:
tcp:傳輸控制協議,面向連接的協議;通信前需要建立虛擬鏈路;結束後拆除鏈路;
0-65535
udp:User DatagramProtocol,無連接的協議;
0-65535
IANA:
0-1023:衆所周知,永久的分配給固定的應用使用,特權端口,22/tcp(ssh), 80/tcp(http), 443/tcp(https)
1024-41951:亦爲註冊端口,但要求並不是特別嚴格,分配給程序註冊爲某應用使用,11211/tcp, 11211/udp (memcached),3306/tcp(mysql)
41952+:客戶端程序隨機使用的端口;動態端口,或私有端口;其範圍的定義:/proc/sys/net/ipv4/ip_local_port_range
Socket: IPC的一種實現,允許位於不同主機(甚至同一主機)上不同進程之間進行通信;數據交換;Socket API, 1983年,4.2 BSD
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)
確認、重傳以及超時:
排序:邏輯序號
流量控制:滑動窗口算法
擁塞控制:慢啓動和擁塞避免算法
Socket Domain(根據其所使用的地址):
AF_INET:AddressFamily,IPv4
AF_INET6:IPv6
AF_UNIX:同一主機上不同進程之間通信時使用;
每類套接字都至少提供了兩種socket:流,數據報
流:可靠地傳遞、面向連接、無邊界;
數據報:不可靠地傳遞、有邊界、無連接;
套接字相關的系統調用:
socket(): 創建一個套接字;
bind():綁定
listen():監聽
accept():接收請求
connect():請求連接建立
write():發送
read():接收
send(),recv(), sendto(), recvfrom()
MIME:Multipurpose Internet Mail Extesion
工作機制:
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 Resorce Locator,用於描述某服務器某特定資源的位置;
Scheme://Server:Port/path/to/resource
URN:Uniform Resource Naming
http協議版本:
HTTP/0.9:原型版本,功能簡陋
HTTP/1.0:第一個廣泛使用的版本,支持MIME
HTTP/1.1: 增強了緩存功能
spdy
HTTP/2.0:
一次完整的http請求處理過程:
(1) 建立或處理連接:接收請求或拒絕請求
(2) 接收請求:
接收來自於網絡的請求報文中對某資源的一次請求的過程;
併發訪問響應模型(Web I/O):
單進程I/O結構:啓動一個進程處理用戶請求,而且一次只處理一個;多個請求被串行響應;
多進程I/O結構:並行啓動多個進程,每個進程響應一個請求;
複用I/O結構:一個進程響應N個請求;
多線程模型:一個進程生成N個線程,每個線程響應一個用戶請求;
事件驅動機制:event-driven 一個進程可以與多個進程通信
複用的多進程I/O結構:啓動多個(m)進程,每個進程響應n個請求;即並行響應
(3) 處理請求:對請求報文進行解析,並獲取請求的資源及請求方法等相關信息
(4) 訪問資源:獲取請求報文中請求的資源
web服務器,即存放了web資源的服務器,負責向請求者提供對方請求的靜態資源,或動態運行後生成的資源;這些資源放置於本地文件系統某路徑下,此路徑通常稱爲DocRoot
web服務器資源路徑映射方式:
(a)docroot
(b)alias
(c) 虛擬主機docroot
(d) 用戶家目錄docroot
(5) 構建響應報文
資源的MIME類型:
顯式分類
魔法分類
協商分類
URL重定向:
web服務構建的響應並非客戶端請求的資源,而是資源另外一個訪問路徑;
(6) 發送響應報文
(7) 記錄日誌
http服務器程序:
httpd (apache)、nginx 、lighttpd
應用程序服務器:
IIS
tomcat,jetty, jboss, resin
webshpere,weblogic, oc4j
http協議:
http協議版本:
http/0.9,http/1.0, http/1.1, http/2.0
協議查看或分析的工具:
tcpdump,tshark, wireshark
報文語法格式:
request請求報文[Client發給Server]
<method><request-URL> <version>
<headers>
…
<entity-body>
response響應報文[Server發給Client]
<version><status> <reason-phrase>
<headers>
<entity-body>
method: 請求方法,標明客戶端希望服務器對資源執行的動作
method(方法):
GET | 從服務器獲取一個資源; |
HEAD | 只從服務器獲取文檔的響應首部; |
POST | 向服務器發送要處理的數據; |
PUT | 將請求的主體部分存儲在服務器上; |
DELETE | 請求刪除服務器上指定的文檔; |
TRACE | 追蹤請求到達服務器中間經過的代理服務器; |
OPTIONS | 請求服務器返回對指定資源支持使用的請求方法; |
version:
HTTP/版本號
status:
三位數字,如200,301, 302, 404, 502; 標記請求處理過程中發生的情況;
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相似,但在響應報文中通過Location指明資源現在所處臨時新位置; Found |
304 | 客戶端發出了條件式請求詢問[Server本地緩存和Server內容是否不一致],但服務器上的資源未曾發生改變,則通過響應此響應狀態碼通知客戶端;Not Modified |
401 | 需要輸入賬號和密碼認證方能訪問資源;Unauthorized |
403 | 請求被禁止;Forbidden |
404 | 服務器無法找到客戶端請求的資源;Not Found |
500 | 服務器內部錯誤;Internal Server Error |
502 | 代理服務器從後端服務器[即代理服務器,保存真正Server的緩存,若無緩存則去找上級服務器…]收到了一條僞響應;Bad Gateway |
reason-phrase:
對狀態碼的簡要描述;
headers:
每個請求或響應報文可包含任意個首部;每個首部都有首部名稱,後面跟一個冒號,而後跟上一個可選空格,接着是一個值;
headers格式:
例:
GET /test/hello.html HTTP/1.1 | 發送GET請求,請求資源/test/hello.html 協議版本HTTP/1.1 |
Accept: */* | 客戶端可以接收任何數據 |
Rerferer: http://localhost:80/test/abc.html | 請求來自哪裏,即從哪個頁面跳轉過來的 |
Accept-Language: zh-cn | 頁面支持什麼語言 |
User-Agent: Moziala/4.0 | 告訴服務器客戶端的瀏覽器內核/版本 |
Accept-Encoding: gzip,defate | 表示接收什麼樣的數據壓縮格式 |
Host: localhost:80 | 主機 |
Connection: Keep-Alive | 表示長連接,即不立即斷開 |
首部的分類:
通用首部、請求首部、響應首部、實體首部、擴展首部
通用首部:[請求和響應都可以使用]
Date: 報文的創建時間
Connection:連接狀態,如keep-alive,close
Via:顯示報文經過的中間節點,即經過幾個代理
Cache-Control:控制緩存的生效方法 [ 例:cache-control: max-age=100 緩存在100s後失效 ]
請求首部:[專用於請求]
Accept:通過服務器自己可接受的媒體類型;
Accept-Charset: 接受的字符編碼格式 UTF-8
Accept-Encoding:接受的壓縮編碼格式,如gzip
Accept-Language:接受的語言格式 zh-cn
Client-IP: 客戶端IP
Host: 請求的服務器名稱和端口號
Referer:包含當前正在請求的資源的上一級資源[ 即從哪個頁面跳轉過來的 ]
User-Agent:客戶端代理[ 客戶端瀏覽器的內核/版本 ]
條件式請求首部:
Expect:用於指出客戶端要求的特殊服務器行爲。
If-Modified-Since:自從指定的時間之後,請求的資源是否發生過修改;
If-Unmodified-Since:自從指定的時間之後,請求的資源是否沒發生過修改;
If-None-Match:本地緩存中存儲的文檔的ETag標籤是否與服務器文檔的Etag不匹配;
If-Match:本地緩存中存儲的文檔的ETag標籤是否與服務器文檔的Etag匹配;
安全請求首部:
Authorization:向服務器發送認證信息,如賬號和密碼;
Cookie: 客戶端向服務器發送cookie
代理請求首部:
Proxy-Authorization: 向代理服務器認證
響應首部:[專用於響應]
信息性:
Age:響應持續時長
Server:服務器程序軟件名稱和版本
協商首部:某資源有多種表示方法時使用
Accept-Ranges:服務器可接受的請求範圍類型
Vary:服務器查看的其它首部列表;
安全響應首部:
Set-Cookie:向客戶端設置cookie;
WWW-Authenticate:來自服務器的對客戶端的質詢認證表單
實體首部:[專用於描述entity-body即附加數據]
Allow: 列出對此實體可使用的請求方法[GET POST…]
Location:告訴客戶端真正的實體位於何處[重定向時使用]
Content-Encoding:內容壓縮編碼格式
Content-Language:內容語言
Content-Length: 主體的長度
Content-Location: 實體真正所處位置;
Content-Type:主體的對象類型[text/html …]
緩存相關:
ETag:實體的擴展標籤;
Expires:實體的過期時間;
Last-Modified:最後一次修改的時間
entity-body:實體主體;請求時附加的數據或響應時附加的數據;
httpd程序環境:
rpm包安裝的httpd的默認工作目錄(根目錄):/etc/httpd
配置文件:
主配置文件:/etc/httpd/conf/httpd.conf
分段配置文件:/etc/httpd/conf.d/*.conf
服務腳本:
/etc/rc.d/init.d/httpd
腳本的配置文件:/etc/sysconfig/httpd
模塊文件目錄:
/etc/httpd/modules -->/usr/lib64/httpd/modules
主程序文件:
/usr/sbin/httpd (prefork)
/usr/sbin/httpd.worker (worker)
/usr/sbin/httpd.event (event)
日誌文件目錄:
/var/log/httpd
access_log: 訪問日誌文件
error_log:錯誤日誌[ httpd服務啓動和關閉的信息也在這裏 ]
站點文檔目錄:
/var/www/html
/etc/httpd/conf/httpd.conf配置文件:
由三部分組成
### Section 1:Global Environment [全局有效配置]
### Section 2: 'Main' serverconfiguration [Main server有效配置]
### Section 3: Virtual Hosts [虛擬主機有效配置]
'Main'server和Virtual Hosts不能同時啓用;默認啓用的是'Main'server [即全局的DocumentRoot 指令];
1、指定監聽地址和端口
Listen [IP:]80
(1) IP省略時表示監聽本機上所有可用的IP地址;
(2) Listen指令可以出現多次,用於指明多個不同的監聽端口或套接字:
Listen172.16.100.11:80
Listen172.16.100.11:8080
2、持久連接相關
KeepAlive Off|On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
持久連接:一次TCP三次握手連接建立後,每個資源獲取結束不會立即四次斷開連接,而繼續等待其它資源請求並完成傳輸;
斷開要求:
數量限制:如100個
時間限制:如15秒
劣勢:對併發訪問量較大的服務器,開持久連接會有些請求得不到服務;
改進:減短時間,httpd-2.4支持毫秒級
非持久連接:每個資源都是單獨通過專用的連接進行獲取
測試:
#telnet Server 80
GET/URL HTTP/1.1
Host:Server
3、MPM
多路處理模塊:併發請求響應的不同實現
prefork,worker, event
MPM:MultipathProcessing Modules 多路處理模塊機制
prefork:多進程模型,每個進程響應一個請求;
啓動一個主進程,用來監聽套接字和負責生成子進程 [ 子進程也稱爲工作進程 ],每個子進程處理一個用戶請求;即便沒有用戶請求,也會預先生成多個空閒進程,隨時等待請求到達;最大不會超過1024個;
即一個請求到來時,主進程不會響應這個請求,而是讓一個預先生成的子進程去處理,主進程再去監聽套接字;
worker:多線程模型,每個線程響應一個請求;
啓動一個主進程用來生成多個子進程,每個子進程負責生個多個線程,每個線程響應一個請求;
例:若有m子進程,n個線程,可以同時處理m*n請求
即一個請求到來時,主進程不會響應這個請求,而是讓一個預先創建的空閒子進程去找一個預先生成的線程去處理;且預先生成的空閒進程和線程數量是有上下限的
event:事件驅動模型,每個線程響應多個請求;
一個主進程:生成多個子進程,每個子進程直接響應多個請求;
httpd-2.2: event爲測試使用
httpd-2.4: event可生產使用
httpd-2.2 不支持同時編譯多個不同的MPM,rpm安裝的httpd-2.2提供了三個文件分別用於實現提供對不同的MPM的支持;確認方法:
# ps aux | grep httpd
默認爲/usr/sbin/httpd,其爲prefork;
查看模塊列表:
httpd -l: 查看靜態編譯的模塊
httpd -M: 查看所有模塊,包括靜態編譯和DSO模塊[動態裝卸載模塊]
httpd-worker -M|-l
httpd-event -M|-l
更換支持不同的MPM的主程序:
編輯/etc/sysconfig/httpd
啓用變量:HTTPD [取消註釋即可]
修改其配置屬性在/etc/httpd/conf/http.conf
注意:MaxRequsetPerChild不是越大越好,而是根據實際情況,內存較大的服務器設大些,內存較小設小些;即設定一個獨立的子進程能處理的請求數,到達這個數量時,子進程會被父進程終止,這時就會釋放佔用的內存。所以越大時佔用內存越大。
# worker MPM
#StartServers: initial number of server processes to start
#MaxClients: maximum number of simultaneous client connections
#MinSpareThreads: minimum number of worker threads which are kept spare
#MaxSpareThreads: maximum number of worker threads which are kept spare
#ThreadsPerChild: constant number of worker threads in each server process
#MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule worker.c>
StartServers 4 [服務器啓動時啓動多少子進程]
MaxClients 300 [最多允許多少個併發連接,不超過1024]
MinSpareThreads 25 [最少總空閒線程]
MaxSpareThreads 75 [最多總空閒線程]
ThreadsPerChild 25 [每一個子進程可以生成多少個線程]
MaxRequestsPerChild 0 [不限制]
</IfModule>
4、配置指令模塊加載:
LoadModule<module_name> <module_path>
模塊路徑:可使用相對路徑;相對於ServerRoot[/etc/httpd]指令指向的位置而言;
注意:建議使用service httpd reload重新裝載配置文件
5、定義'Main'server的文檔頁面路徑
DocumentRoot指令 指定網站頁面位置[路徑要事先存在]
6、站點路徑訪問控制
訪問控制機制:
基於來源地址
基於賬號
定義的方式有兩種:
文件系統路徑:
<Directory"/PATH/TO/SOMEDIR">
...
</Directory>
URL路徑:
<Location"/URL">
...
</Location>
7、Directory中的訪問控制定義
(1) Options
Indexes: 當訪問的路徑下無默認主頁面文件存在,且沒有指定具體要訪問的資源時,會將此路徑下的所有資源以列表呈現給用戶;非常危險,不建議使用;
FollowSymLinks:如果某頁面文件爲鏈接文件,指向DocumentRoot之外路徑上的其它文件時,將直接顯示目標文件的內容;
None: 都不啓用
All:所有的都啓用;
(2) AllowOverride None
是否允許路徑下的.htaccess文件覆蓋定義的訪問控制權限
(3) 基於來源地址訪問控制
Order: 檢查次序
Order Allow Deny:以Allow優先處理,但沒有寫入規則的則默認爲Deny。常用於:開放所有,拒絕特定
Order Deny Allow: 以Deny優先處理,但沒有寫入規則的則默認爲Allow。常用於:拒絕所有,開放特定
注意:當Allow和Deny的規則當中有重複的,則以Order先後順序爲主。
Allow from:允許訪問的來源地址
Deny from:拒絕訪問的來源地址
from後可跟上的地址格式:
IP地址;
網絡地址:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
例:
<Directory /var/www>
Options None
AllowOverride None
Order Allow Deny
Allow from all
Deny from 192.168.1.110
</Directory>
8、定義默認的主頁面
DirectoryIndex index.htmlindex.html.var
自左而右,找到首次匹配到的文件;就將其做爲默認主頁面返回。
9、配置日誌
錯誤日誌:
訪問日誌:要定義日誌格式
先定義日誌格式
日誌內容
%h | 記錄客戶端主機的IP地址 |
%l | 客戶用戶通過identd登錄時使用名稱;一般爲- [ - 爲空 ]; |
%u | 用戶認證登錄的名字[基於.htpasswd的密碼認證纔有];無登錄機制一般爲-; |
%t | 收到客戶端請求時的時間; |
\" | 顯示引號本身,而不作爲引用符號;\爲轉意符 |
%r | 請求報文的首行 <method> <url> <version> |
%>s | 響應狀態狀態碼 |
%b | 響應報文的大小,單位爲字節;不包含首部信息; |
%{Referer}i | 記錄Http首部Referer對應的值,即訪問入口,從哪個頁面跳轉至此頁面;[直接從瀏覽器進入爲空] |
%{User-Agent}i | 記錄http首部User-Agent對應的值;即瀏覽器內核類型; |
詳情:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
10、路徑別名
Alias/URL/ "/path/to/some_directory"
例如:Alias /bbs/ "/web/bbs/htdocs/"
DocumentRoot"/var/www/html"
注意:路徑最後一個斜線都要有或者都沒有
URL: http://www.lx.com/bbs/index.html --> 找的是/web/bbs/htdocs/index.html而不是/var/www/html下的文件
11、設定默認字符集
AddDefaultCharset UTF-8
常用字符集:GBK, GB2312, GB18030
12、基於用戶的訪問控制
質詢:
響應報文首部:WWW-Authenticate[ 服務器用401狀態拒絕客戶端請求,說明需要用戶提供用戶名和密碼;彈出對話框 ]
認證:
請求報文首部:Authorization[ 客戶端用戶填入賬號密碼後再次發請求至服務器;認證通過,則請求授權 ]
安全域:需要用戶認證後方能訪問的路徑,應該有其名稱,用於向用戶通知此認證的原因等;
http協議支持的認證方式:
basic:基本 BASE64 [ 只是編碼不是加密 ]
digest:摘要 [老的瀏覽器不支持]
basic認證機制的實現
(1) 定義安全域
<Directory"/data/web/html/employee">
Options None
AllowOverride None
AuthType Basic
AuthName "Employee Infomation, only for employee" [ "註釋顯示信息" ]
AuthUserFile /etc/httpd/users/.passwd [ htpasswd生成的基於Basic的密鑰文件 ]
Require user tom jerry [ 允許AuthUserFile文件中的那些用戶登錄 ]
</Directory>
Require valid-user: 所有位於AuthUserFile文件中定義的用戶都允許登錄;
Require user user1 user2 ...: 僅允許user1,user2等出現AuthUserFile文件中定義的特定幾個用戶登錄;
(2) 提供用戶的賬號文件
htpasswd命令用於維護此文件
htpasswd [ -c ] [ -m ] [ -D ] passwdfileusername
-c:添加第一用戶時創建此文件;若文件存在,則覆蓋文件
-m:以md5格式加密用戶密碼存放;
-s:以sha格式加密用戶密碼存放;
-D:刪除指定用戶
例:htpasswd -c .passwd lx
當添加第二個用戶時,不用-c 即 htpasswd .passwd abc
(3) 組認證
<Directory"/data/web/html/employee">
Options None
AllowOverride None
AuthType Basic
AuthName "Employee Infomation, onlyfor employee"
AuthUserFile /etc/httpd/users/.htpasswd
AuthGroupFile /etc/httpd/users/.htgroup
Require group GRP1 GRP2 ...
</Directory>
組文件:
每行定義一個組,格式
Grp_Name: USERNAME1 USERNAME2 ...
測試:組認證過程:
1.編輯/etc/httpd/conf/httpd.conf
2.mkdir -p /web/vhosts/test /web/vhosts/test/protect
3.創建測試database頁面 vim /web/vhosts/test/protect/database ; <h1>database test<h1>
4.用htpasswd命令創建密碼文件 htpasswd -c/web/vhosts/test/protect/.passwd lx ;
htpasswd /web/vhosts/test/protect/.passwd tom; htpasswd/web/vhosts/test/protect/.passwd jeery
5.創建組文件 vim/web/vhosts/test/protect/.group
注意:虛擬用戶一定要有密碼才能登錄,即必須用htpasswd命令創建進入AuthUserFile中
13、虛擬主機
一個物理器可以服務於多個站點,每個站點可通過一個或多個虛擬主機來實現;
httpd三種類型的虛擬主機:
基於IP
基於Port[端口]
基於FQDN[域名] 需有DNS解析
注意:得首先關閉'Main'server ;即註釋全局的DocumentRoot指令即可;
定義虛擬主機的方法:
<VirtualHost"IP:PORT">
ServerName 主機名[www.lx.com]
DocumentRoot網站頁面放置主目錄[/var/www/html]
注意:額外經常用於每個虛擬主機的配置有
ErrorLog錯誤日誌記錄文件位置,不存在會自動生成 [/var/log/httpd/lx.err]
CustomLog 訪問日誌文件位置,不存在會自動生成 [/var/log/httpd/lx.access] 日誌格式[ common|combined|agent|referer]
ServerAlias 定義路徑別名
<Directory></Directory>
<Location></Location>
</VirtualHost>
注意:大多數可用於全局或'main' server中的指令,都可以定義有VirtualHost中;
示例1:基於IP
<VirtualHost172.16.100.11:80>
ServerName www.a.com
DocumentRoot /vhost/a.com/htdocs/
</VirtualHost>
<VirtualHost172.16.100.21:80>
ServerName www.b.org
DocumentRoot /vhost/b.org/htdocs/
</VirtualHost>
<VirtualHost172.16.100.31:80>
ServerName www.c.net
DocumentRoot /vhost/c.net/htdocs/
</VirtualHost>
注意:本機要配置上所有IP地址並能夠用於通信;
示例2:基於Port
<VirtualHost172.16.100.11:80>
ServerName www.a.com
DocumentRoot /vhost/a.com/htdocs/
</VirtualHost>
<VirtualHost172.16.100.11:808>
ServerName www.b.org
DocumentRoot /vhost/b.org/htdocs/
</VirtualHost>
<VirtualHost172.16.100.11:8080>
ServerName www.c.net
DocumentRoot /vhost/c.net/htdocs/
</VirtualHost>
注意:httpd要監聽這裏指明的所有端口
Listen
示例3:混用IP和Port
<VirtualHost172.16.100.11:80>
ServerName www.a.com
DocumentRoot /vhost/a.com/htdocs/
</VirtualHost>
<VirtualHost172.16.100.21:80>
ServerName www.b.org
DocumentRoot /vhost/b.org/htdocs/
</VirtualHost>
<VirtualHost172.16.100.11:8080>
ServerName www.c.net
DocumentRoot /vhost/c.net/htdocs/
</VirtualHost>
示例4:基於FQDN
註釋全局的DocumentRoot指令
NameVirtualHost 172.16.100.11:80
<VirtualHost172.16.100.11:80>
ServerName www.a.com
DocumentRoot /vhost/a.com/htdocs/
</VirtualHost>
<VirtualHost172.16.100.11:80>
ServerName www.b.org
DocumentRoot /vhost/b.org/htdocs/
</VirtualHost>
<VirtualHost172.16.100.11:80>
ServerName www.c.net
DocumentRoot /vhost/c.net/htdocs/
</VirtualHost>
14、內置的status頁面
<Location/server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 172.16.0.0/16
</Location>
可以嵌套使用,Location相當於Directory
例:通過www1.stuX.com/server-status輸出httpd工作狀態相關信息,且只允許帳號lx通過密碼才能訪問,接可以查看www1.stuX.com的index.html;
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基本認證
--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 使用HTTP1.0
用法:curl [options] [URL...]
例: 1.僞裝成chrome瀏覽器
curl -A "chrome 4.0" http://192.168.1.110
另一個工具:elinks 全屏瀏覽器
elinks[OPTION]... [URL]...
-dump: 不進入交互式模式,而直接將URL的內容輸出至標準輸出;
16 使用mod_deflate模塊壓縮頁面優化傳輸速度
適用場景:
(1) 節約帶寬,額外消耗CPU;同時,可能有些較老瀏覽器不支持;
(2) 壓縮適於壓縮的資源,例如文件文件;
添加進/etc/httpd/conf/httpd.conf即可對壓縮格式做限定
SetOutputFilter DEFLATE 輸出過濾器
#mod_deflate configuration
# Restrict compression to these MIMEtypes 限制壓縮這些MIME類型
AddOutputFilterByTypeDEFLATE text/plain
AddOutputFilterByTypeDEFLATE text/html
AddOutputFilterByTypeDEFLATE application/xhtml+xml
AddOutputFilterByTypeDEFLATE text/xml
AddOutputFilterByTypeDEFLATE application/xml
AddOutputFilterByTypeDEFLATE application/x-javascript
AddOutputFilterByTypeDEFLATE text/javascript
AddOutputFilterByTypeDEFLATE text/css
# Level of compression (Highest 9 -Lowest 1) 壓縮級別
DeflateCompressionLevel9
# 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 = https 443/tcp 不再是文本格式傳輸而是二進制格式傳輸
ssl: v3 tls: v1
SSL會話的簡化過程
(1) 客戶端發送可供選擇的加密方式,並向服務器請求證書;
(2) 服務器端發送證書以及選定的加密方式給客戶端;
(3) 證書驗正:
如果信任給其發證書的CA:
(a) 驗正證書來源的合法性;用CA的公鑰解密證書上數字簽名;
(b) 驗正證書的內容的合法性:完整性驗正
(c) 檢查證書的有效期限;
(d) 檢查證書是否被吊銷;
(e) 證書中擁有者的名字,與訪問的目標主機要一致;
(4) 客戶端生成臨時會話密鑰(對稱密鑰),並使用服務器端的公鑰加密此數據發送給服務器,完成密鑰交換;
(5) 服務用此密鑰加密用戶請求的資源,響應給客戶端;
注意: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 [證書]
SSLCertificateKeyFile [私鑰]
(3) 測試基於https訪問相應的主機;
#openssl s_client [-connect host:port] [-cert filename] [-CApath directory][-CAfile filename]
例 openssl s_client -connect 192.168.1.115 -Cafile/etc/pki/CA/cacert.pem
基於windows的方法:把CA中自簽證書重命名爲cacert.crt導入到授信任的根證書即可
18、httpd自帶的工具程序
htpasswd: basic認證基於文件實現時,用到的賬號密碼文件生成工具;
apachectl:httpd自帶的服務控制腳本,支持start, stop;
例apachectl start
apxs:由httpd-devel包提供的,擴展httpd使用第三方模塊的工具;
rotatelogs:日誌滾動工具;
access.log-->
access.log, access.1.log-->
access.log,access.1.log, access.2.log
suexec:訪問某些有特殊權限配置的資源時,臨時切換至指定用戶運行;可以在配置文件中修改User和Group即用誰的身份運行httpd
19、http壓力測試工具
ab、webbench、http_load
jmeter、loadrunner
tcpcopy
ab[OPTIONS] URL
-n: 總的請求數
-c:模擬的併發數[不能超過1024,超過時用ulimit命令設置]
-k: 以持久連接模式測試
例 ab -n 1000 -c 100 -k http://www.lx.com [ulimit -n #: 調整當前用戶所同時打開的文件數;]
測試結果也一目瞭然,測試出的吞吐率爲:Requests per second: 2015.93 [#/sec](mean) 初次之外還有其他一些信息。
Server Software 表示被測試的Web服務器軟件名稱
Server Hostname 表示請求的URL主機名
Server Port 表示被測試的Web服務器軟件的監聽端口
Document Path 表示請求的URL中的根絕對路徑,通過該文件的後綴名,我們一般可以瞭解該請求的類型
Document Length 表示HTTP響應數據的正文長度
Concurrency Level 表示併發用戶數,這是我們設置的參數之一
Time taken for tests 表示所有這些請求被處理完成所花費的總時間
Complete requests 表示總請求數量,這是我們設置的參數之一
Failed requests 表示失敗的請求數量,這裏的失敗是指請求在連接服務器、發送數據等環節發生異常,以及無響應後超時的情況。如果接收到的HTTP響應數據的頭信息中含有2XX以外的狀態碼,則會在測試結果中顯示另一個名爲 “Non-2xx responses”的統計項,用於統計這部分請求數,這些請求並不算在失敗的請求中。
Total transferred 表示所有請求的響應數據長度總和,包括每個HTTP響應數據的頭信息和正文數據的長度。注意這裏不包括HTTP請求數據的長度,僅僅爲web服務器流向用戶PC的應用層數據總長度。
HTML transferred 表示所有請求的響應數據中正文數據的總和,也就是減去了Total transferred中HTTP響應數據中的頭信息的長度。
Requests per second 吞吐率,計算公式:Complete requests / Time taken for tests
Time per request 用戶平均請求等待時間,計算公式:Time token for tests/(Complete requests/Concurrency Level)
Time per requet(across all concurrentrequest) 服務器平均請求等待時間,計算公式:Time taken for tests/Complete requests,正好是吞吐率的倒數。也可以這麼統計:Time per request/Concurrency Level
Transfer rate 表示這些請求在單位時間內從服務器獲取的數據長度,計算公式:Total trnasferred/ Time taken for tests,這個統計很好的說明服務器的處理能力達到極限時,其出口寬帶的需求量。
Percentage of requests served within acertain time(ms)這部分數據用於描述每個請求處理時間的分佈情況,比如以上測試,80%的請求處理時間都不超過6ms,這個處理時間是指前面的Time per request,即對於單個用戶而言,平均每個請求的處理時間。
編譯安裝httpd-2.4
新特性:
(1) MPM支持運行DOS[動態模塊裝載]機制;
(2) 支持eventMPM;
(3) 支持異步讀寫;
(4) 支持每模塊及每個目錄分別使用各自的日誌級別;
(5) 每請求配置;<If>
(6) 增強版的表達式分析器;
(7) 支持毫秒級的keepalivetimeout;
(8) 基於FQDN的虛擬主機不再需要NameVirtualHost指令;
(9) 支持用戶自定義變量;
新模塊:
(1)mod_proxy_fcgi
(2)mod_ratelimit
(3)mod_remoteip
修改了一些配置機制:
不再支持使用Order, Deny, Allow來做基於IP的訪問控制;
httpd依賴於apr,apr-util, 可能還有apr-icon
apr:apache portable runtime
編譯安裝步驟:
前提:
下載1.4+版的apr、apr-util、httpd-2.4的源碼包
安裝開發環境,安裝pcre-devel、zib-devel
例:以apr-1.5.0.tar.bz2,apr-util-1.5.3.tar.bz2,httpd-2.4.10.tar.bz2爲例 [ 注意:源碼編譯有先後順序 apr->apr-util->httpd-2.4 ]
yum groupinstall "Development tools" "Server PlatformDevelopment"
yum install pcre-devel zib-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
#groupadd -r apache
#useradd -r -g apache apahce
# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd --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
注意:-with-包名[例pcre-devel]=路徑
都要先裝它的devel包,用rpm包裝的devel包不用指路徑,因爲默認就是找/usr/下的;而不在這個路徑下的要指明
-enable-so | 支持DSO動態裝卸載模塊機制 |
-enable-cgi | 支持CGI[通用網關接口]模式 |
-enable-ssl | 支持ssl |
-enable-rewrite | 支持url重寫,依賴pcre-devel包 |
-with-zilb | 可以基於zlib可以壓縮報文 |
-with-pcre | 支持使用pcre功能 |
-with-apr=/usr/local/apr | 支持apr功能 |
-with-apr-util=/usr/local/apr-util | 支持apr-util貢呢 |
--enable-modules=most | 開啓最多的模塊 |
--enable-mpms-share=all | 把所有的mpm都做成共享模塊 |
--with-mpm=prefork | 把prefork設爲默認的mpm |
#make && make install
先將/usr/local/apache/bin設爲開機啓動的環境變量
啓動服務:
apachectl start|stop
配置:
注意:主配置文件在/etc/http/httpd.conf 輔助配置文件在/etc/httpd/extra/下
(1) 切換使用MPM
LoadModulempm_NAME_module modules/mod_mpm_NAME.so
NAME:prefork, event, worker
用httpd -M查看模塊是否啓用
(2) 修改'Main'server的DocumentRoot
①修改DocumentRoot ②顯示授權編寫Directory
(3) 基於IP的訪問控制法則
允許所有主機訪問:Require all granted
拒絕所有主機訪問:Require all deny
控制特定IP訪問:
Require ip IPADDR:授權指定來源地址的主機訪問
Require not ip IPADDR:拒絕指定來源地址的主機訪問
IPADDR:
IP:172.16.100.2
Network/mask:172.16.0.0/255.255.0.0
Network/Length:172.16.0.0/16
Net:172.16
例:Require ip 192.168.1.110
控制特定主機(HOSTNAME)訪問
Requirehost HOSTNAME
Requirenot host HOSTNAME
HOSTNAME:
FQDN: 特定主機
DOMAIN:指定域內的所有主機
例:Require host www.baidu.com
(4) 虛擬主機
基於IP、Port和FQDN都支持;
基於FQDN的需要註釋'Main' Server即DocumentRoot,不再需要NameVirtualHost指令;
vim /etc/httpd/httpd.conf 開啓這一項
(5) ssl
啓用模塊:取消註釋
編輯配置vim /etc/httpd/extra/httpd-ssl.conf
(6) 服務腳本
①先複製一個之前用rpm包安裝的/etc/rc.d/init.d/httpd文件
例 scp [email protected]:/etc/rc.d/init.d/httpd/etc/rc.d/init.d/httpd
②vim /etc/rc.d/init.d/httpd 修改這三項
③用chkconfig命令增加httpd服務;在chkconfig工具服務列表中增加此服務,此時服務會被在/etc/rc.d/rc#.d中賦予K/S入口了
④測試使用service httpd start