web 服務介紹
web服務時一種應用程序的服務,它所提供的最主要的信息是一種超文本標記語言(HTML)、多媒體資源(如:視頻、圖片、音樂等)。HTML是一種純文字的文本信息,通過所謂的標籤來規範所要顯示的內容格式,在客戶端通過瀏覽器的形式對HTML及多媒體資源進行解析,然後呈現在終端上。主要由http和https協議實現
http協議
HTTP是一個屬於應用層的面向對象的協議,B/S架構,由於其簡單、快速的方式,適用於分佈式超媒體信息系統。它於1990年提出,經過幾年的使用與發展,得到不斷的完善和擴展。
http協議版本
HTTP/0.9
HTTP/1.0:cache,MIME,method
MIME:Multiurpose Internet Mail Extesion
method:GET HEAD POST PUT DELETE TRACE OPTIONS
HTTP/1.1:增強了緩存功能
HTTP/2.0:採用二進制格式 完全多路複用 報頭壓縮 響應主動“推送”到客戶端緩存
http協議的特點
1.c/s
2.簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與服務器練習的類型不同。由於HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快
3.靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型有Centent-Type加以標記。
4.無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開連接。採用這種方式可以節省傳輸時間。
5.無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事物處理沒有記憶能力。缺少狀態意味着如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。
http端口
服務所使用的端口信息,http服務默認爲80端口,https默認爲443端口,而這些默認的端口是可省略的,協議自身會去識別,只有當認爲更改服務器服務監聽端口時需要在客戶端手動指定端口,否則會指向默認端口。
默認端口
IANA(The Internet Assigned Numbers Authority,互聯網數字分配機構)是負責協調一些使Internet正常運作的機構。同時,由於Internet已經成爲一個全球範圍的不受集權控制的全球網絡,爲了使網絡在全球範圍內協調,存在對互聯網一些關鍵的部分達成技術共識的需要,而這就是IANA的任務。
0-1023:衆所周知,永久地址分配給固定的應用使用,特權端口;
1024-41951:爲註冊端口,但要求不是特別嚴格,分配給程序註冊爲某應用使用; 3306/tcp, 11211/tcp
41952+:客戶端程序隨機使用的端口,動態端口,或私有端口;其範圍定義在/proc/sys/net/ipv4/ip_local_port_range
socket
源IP地址和目的IP地址以及源端口號和目的端口號的組合稱爲套接字。其用於標識客戶端請求的服務器和服務。它是網絡通信過程中端點的抽象表示,包含進行網絡通信必須的五種信息:連接使用的協議,本地主機的IP地址,本地進程的協議端口,遠地主機的IP地址,遠地進程的協議端口。
socket類型
BSD Socket:IPC的一種實現,允許位於不同主機(也可以使同一主機)上的進程之間進行通信
Socket API(封裝了內核中的socket通信相關的系統調用)
SOCK_STREAM: tcp套接字
SOCK_DGRAM: UDP套接字
SOCK_RAW: raw套接字
根據套接字所使用的地址格式,Socket Domain
AF_INET:Address Family,IPv4
AF_INET6:IPv6
AF_UNIX:同一主機上的不同進程間基於socket套接字通信使用的一種地址
TCP協議的特性
1.建立連接:三次握手
2.將數據打包成段:校驗和(CRC32)
3.確認、重傳及超時
4.排序:邏輯序號
5.流量控制:滑動窗口算法
6.擁塞控制:慢啓動和擁塞避免算法
TCP協議狀態類型
CLOSED:關閉連接
LISTEN:監聽
SYN_SENT:請求建立連接
SYN_RECV:接收請求連接
ESTABLISHED:已建立的連接
FIN_WAIT1:主動關閉tcp連接,等待對方響應
CLOSE_WAIT:在關閉連接之前還有數據要發送或其它事物
FIN_WAIT2:被動關閉tcp連接
LAST_ACK:等待對方確認關閉連接
TIMEWAIT:當主動發起關閉連接請求後,則進入TIME_WAIT
接收請求的模型
併發訪問響應模型:
單進程I/O模型:啓動一個進程處理用戶請求; 這意味着,一次只能處理一個請求,多個請求被串行響應
多進程I/O結構:並行啓動多個進程,每個進程響應一個請求
複用的I/O結構:一個進程響應n個請求
多線程模式:一個進程生成n個線程,一個線程處理一個請求
事件驅動(event-driven):一個進程直接n個請求
複用的多進程I/O結構:啓動多個(m)個進程,每個進程生成(n)個線程
響應的請求的數量:m*n
http完整請求處理過程
(1)建立或處理連接:接收請求或拒絕請求
(2)接收請求:接收來自於網絡上的主機請求報文中對某特定資源的一次請求的過程
(3)處理請求:對請求報文進行解析,獲取客戶端請求的資源及請求方法等相關信息
(4)訪問資源:獲取請求報文中請求的資源
(5)構建響應報文
(6)發送響應報文
(7)記錄日誌
http事務
http請求報文首部
http響應報文首部
請求報文首部的格式:request
<method> <URL> <VERSION>
HEADERS(name value)
<request body>
響應報文首部的格式:response
<version> <status> <reason-phrase>
HEADERS(name value)
<entity-body>
method:請求方法,標明客戶端希望服務器對資源執行的動作
GET, HEAD, POST
version:
HTTP/<major>.<minor>
status:
三位數字:如200, 301, 302, 404, 502; 標記請求處理過程中發生的情況
reason-phrase:
狀態碼所標記的狀態的簡要描述
headers:
每個請求或響應報文可包含任意個首部;每個首部都有首部名稱,後面跟一個冒號,而後跟上一個可選空格,接着是一個value
entity-body:請求時附加的數據或響應時附加的數據
method
GET:從服務器獲取一個資源
HEAD:只獲取一個資源的首部,而不是內容
POST:向服務器發送要處理的數據
PUT:將請求的主體部分存儲在服務器上
DELETE:請求刪除服務器上指定的文檔
TRACE:追蹤請求到達服務器中間經過的代理服務器
OPTIONS:請求服務器返回對指定資源支持使用的請求方法;
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:客戶端發出了條件是請求,但在服務器上的資源未曾發生改變,則通過響應此響應狀態碼通知客戶端:Not Modified
401:需要輸入賬號和密碼認證方能訪問資源:Unauthorized
403:請求被禁止;Forbidden
404:服務器無法找到客戶端請求的資源:Not Found
500:服務器內部錯誤;Internet Server Error
502:代理服務器從後端服務器收到了一條僞響應;Bod Gateway
點此查看:狀態碼大全
headers
格式:
name:value
首部的分類:
通用首部
請求首部
響應首部
實體首部
擴展首部
通用首部:
Date:報文的創建時間
Connection:連接狀態,如keep-alive,close
Via:顯示報文經過的中間節點
Cache-Control:控制緩存
Pragma:
請求首部:
Accept:通知服務器自己可接收的媒體類型
Accept-Charset:聲明自己可接收的字符集
Accept-Encoding:可接收的編碼格式,如gzip
Accept-Language:接收的語言
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
Cookie2
代理請求首部:
Proxy-Authorization:向代理服務器認證
響應首部:
信息性:
Age:響應持續時長
Server:服務器程序軟件名稱版本
協商首部:某資源有多種表示方法時使用
Accept-Ranges:服務器可接受的請求範圍類型
Vary:服務器查看的其它首部列表
安全響應首部:
Set-Cookie:向客戶端設置cookie
Set-Cookie2
WWW-Authentication:來自服務器的對客戶端的質詢認證表單
實體首部:
Allow:列出對此實體可使用的請求方法
Location:告訴客戶端真正的實體位於何處
Content-Encoding:服務器表明了自己的壓縮方法
Content-Language:服務器告訴客戶端自己響應的語言
Content-Length:主體的長度
Content-Location:實體真正所處的位置
Content-Type:主體的對象類型
緩存相關:
ETag:實體的擴展標籤
Expires:實體的過期時間
Last-Modified:最後一次修改的時間
web資源
靜態資源(無須服務端做出額外處理):.jpg, .png, .gif, .html, .txt, .js, .css, .mp3, avi
動態資源(服務端需要通過執行程序做出處理,發送給客戶端的是程序的運行結果):.php, .jsp
注意:一個頁面中展示的資源可能有多個;每個資源都需要單獨請求
URL
Uniform Resouce Locator:用於描述服務器某特定資源的位置
scheme://host[:port]/URL
URL的根通常要映射爲文件系統上的某路徑
DocumentRoot /var/www/html
/index.html --> /var/www/html/index.html
/p_w_picpaths/logo.jpg --> /var/www/html/p_w_picpaths/logo.jpg
Alias /p_w_picpaths/ /data/imgs/
/p_w_picpaths/logo.jpg --> /data/imgs/logo.jpg
/p_w_picpaths/a/3.gif --> /data/imgs/a/3.gif
基本語法:<scheme>://<user>:<password>@<host>:<port></path>;<params>?<query>#<frag>
params:參數
http://www.luyubo.com/bbs/hello;gender=f
query:查詢
http://www.luyubo.com/bbs/item.php?username=tom&title=abc
frag:標記
httpd的特性
高度模塊化:core modules + standard modules + 3rd party modules
DSO:dynamic shared object
MPM:Multipath Processing Modules(多路處理模塊)
prefork:多進程模型,每個進程響應一個請求
一個主進程:負責生成子進程及回收子進程; 負責創建套接字; 負責接收請求,並將其派發給某子進程進行處理
n個子進程:每個子進程處理一個請求
工作模型:會預先生成幾個空閒進程,隨時等待用於響應用戶請求; 最大空閒和最小空閒
worker:多進程多線程模型,每線程處理一個用戶請求
一個主進程:負責生成子進程
多個子進程:每個子進程負責生成多個線程
每個線程:負責響應用戶請求
併發響應數量:m*n
m:子進程數量
n:每個子進程所能創建的最大線程數量
event:事件驅動模型,多進程模型,每個進程響應多個請求
一個主進程:負責生成子進程; 負責創建套接字; 負責接收請求,並將其派發給某子進程進行處理
子進程:基於事件驅動機制直接響應多個請求
httpd-2.2:仍爲測試使用模型
httpd-2.4:event可生產環境中使用
httpd 安裝
1.我們這裏使用yum來安裝httpd程序(以centos 6.8爲例)
[root@localhost ~]# yum -y install httpd
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.event
/usr/sbin/httpd.worker
日誌文件:
/var/log/httpd:
access_log:訪問日誌
error_log:錯誤日誌
站點文檔:
/var/www/html
模塊文件:
/usr/lib64/httpd/modules
設置開機啓動:
chkconfig httpd on | off
管理選項:
service {start|stop|restart|status|reload|configtest} httpd
centos7:
模塊相關配置文件:/etc/httpd/conf.modules.d/*.conf
systemctl unit file:/usr/lib/systemd/system/httpd.service
設置開機啓動:
systemctl enable|disable httpd.service
管理選項:
systemctl {start|stop|restart|status} httpd.service
httpd配置
ServerRoot "/etc/httpd" 配置文件存放路徑
PidFile run/httpd.pid pid存放路徑
Listen 80 設置監聽端口
Include conf.d/*.conf 定義conf.d下面以.conf的配置文件
DocumentRoot "/var/www/html" 程序默認存放目錄
DirectoryIndex index.html 程序默認首頁
AddDefaultCharset UTF-8 設置默認編碼 中文字符集:GBK, GB2312, GB18030
服務重載
配置完成之後一定要測試語法是否正確使用命令 httpd -t
確定語法沒有任何問題之後直接重載服務即可 service httpd reload
centos 7:
測試語法命令:httpd -t
重載程序命令:systemctl reload httpd
保持鏈接
persistent connection:tcp連接建立後,資源獲取完成之後不會斷開連接,而是繼續等待請求其它資源;
可以通過數量限制或者時間限制來斷開鏈接
KeepAlive On|Off #開啓或關閉保持鏈接
MaxKeepAliveRequests 100 #設置超時時間限制,秒
KeepAliveTimeout 10 #設置鏈接請求數限制
測試命令
telnet 192.168.88.1 80
GET /index.html HTTP/1.1
host:192.168.88.1
回車
MPM
httpd-2.2不支持同時編譯多個MPM模塊,所以只能編譯選定; CentOS 6的rpm包爲此專門提供了三個應用程序文件,http(prefork),http.worker
httpd.event,分別用於實現對不同的MPM機制的支持;
prefork:進程模型,兩級結構,master/worker,每worker處理一個請求;
worker:線程模型,三級結構,master/worker/thread,每thread處理一個請求;
event:事件驅動線程模型,兩級結構,master/worker,每worker響應多個請求;
默認使用的爲/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 #保持空閒的服務器進程的最少數量
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>
訪問控制
基於IP的訪問控制機制:
httpd-2.4:
require ip, require not ip, require host, require not host
httpd-2.2:
allow from, deny from
order allow,deny, order deny,allow
基於主機名的虛擬主機:
httpd-2.2:須使用NameVirtualHost;
httpd-2.4:無須使用;
各映射的本地文件系統路徑內的資源:
httpd-2.4:須做顯式授權
httpd-2.2:無須顯式授權
訪問控制案例
1.限制year.html文件不能訪問
<Virtualhost 192.168.88.1:80 >
ServerName www.luyubo.com
DocumentRoot "/home/httpd/"
<files ~ year.html>
order allow,deny
deny from all
</files>
</Virtualhost>
<Directory "/home/httpd">
AllowOverride All
Order allow,deny
Allow from all
</Directory>
2.限制192.168.88.88不能訪問www.luyubo.com
<Virtualhost 192.168.88.1:80 >
ServerName www.luyubo.com
DocumentRoot "/home/httpd/"
</Virtualhost>
<Directory "/home/httpd">
AllowOverride All
Order allow,deny
deny from 192.168.88.88
allow from all
</Directory>
###如果限制一個網段直接把192.168.88.88替換爲192.168.88.0/24即可 顯示多個直接以空格分割
3.以正則表達式匹配方式限制文件訪問
<Virtualhost 192.168.88.1:80 >
ServerName www.luyubo.com
DocumentRoot "/home/httpd/"
<FilesMatch "^year.*$">
order allow,deny
deny from all
</FilesMatch>
</Virtualhost>
<Directory "/home/httpd">
AllowOverride All
Order allow,deny
allow from all
</Directory>
4.以URI限制訪問
<Virtualhost 192.168.88.1:80 >
ServerName www.luyubo.com
DocumentRoot "/home/httpd/"
<location "/year.html">
order allow,deny
deny from all
</location>
</Virtualhost>
<Directory "/home/httpd">
AllowOverride All
Order allow,deny
allow from all
</Directory>
5.以正則表達式匹配方式限制URI訪問
<Virtualhost 192.168.88.1:80 >
ServerName www.luyubo.com
DocumentRoot "/home/httpd/"
<locationMatch "^/year.*$">
order allow,deny
deny from all
</locationMatch>
</Virtualhost>
<Directory "/home/httpd">
AllowOverride All
Order allow,deny
allow from all
</Directory>
centos 7控制
<Directory>中"基於源地址"實現訪問控制
(1)Options
後跟1個或多個以空白字符分隔的"選項"列表
Indexes:指明的URL路徑下不存在與定義的主頁面資源相符的資源文件時,返回索引列表給用戶
FollowSymLinks:允許跟蹤符號鏈接文件所指向的源文件
ExecCGI:是否允許運行CGI腳本
None:
All:
(2)AllowOverride
與訪問控制相關的哪些指令可以放在.htaccess文件(每個目錄下都可以有一個)中
AllowOverride表示是否允許目錄中.htaccess文件中的配置來覆蓋當前配置段中的配置
All:
None:
Options FileInfo AuthConfig Limit
日誌設置
日誌類型:訪問日誌和錯誤日誌
錯誤日誌:
ErrorLog logs/error_log
LogLevel warn
Possible values include: debug, info, notice, warn, error, crit,alert, emerg.
訪問日誌:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog logs/access_log combined
%h:客戶端的IP地址
%l: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"的值; 即發出請求的應用程序
訪問驗證控制
認證質詢:
WWW-Authenticate:響應嗎爲401,拒絕客戶端請求,並說明要求客戶端提供賬號和密碼
認證:
Authorization:客戶端用戶填入賬號和密碼後再次發送請求報文; 認證通過時,則服務器發送響應的資源
認證方式有兩種:
basic:明文
digest:消息摘要認證
安全域:需要用戶認證後方能訪問的路徑; 應該通過名稱對其進行標識,以便於告知用戶認證的原因
用戶賬號和密碼存放於何處?
虛擬賬號:僅用於訪問某服務時用到的賬號
存儲:
文本文件
SQL數據庫
LDAP目錄存儲
basic認證配置示例:
(1)定義安全域
<Directory "/home/httpd">
Options None
AllowOverride None
AuthType Basic
AuthName "STRING"
AuthUserFile "/etc/httpd/.passwd"
Require user luyubo
#Require valid-user #允許賬號文件中所有用戶訪問
</Directory>
(2)提供賬號和密碼存儲(文本文件)
使用專用命令完成此類文件的創建及用戶管理
#第一次需要使用-c創建指定的文件,第二次無須使用-c選項
htpasswd -c -m /etc/httpd/.passwd luyubo
htpasswd -m /etc/httpd/.passswd laozhai
-c:自動創建此處指定的文件,因此,僅應該在此文件不存在時使用
-m:md5格式加密
-s:sha格式加密
-D: 刪除指定用戶
另外:基於組賬號進行認證
(1)定義安全域
<Directory "/home/httpd">
Options None
AllowOverride None
AuthType Basic
AuthName "String"
AuthUserFile "/etc/httpd/conf/.htpasswd"
AuthGroupFile "/etc/httpd/.passwd_group" #編輯.passwd_group文件格式爲每一行定義一個組
Require group groupluyubo
</Directory>
定義網站別名
格式:
alias /URL/ "/PATH/TO/SOMEDIR"
定義alias:
alias /laozhai "/var/www/html/R2/download/soft"
訪問測試(下載/download/soft/qq.exe)
http://www.luyubo.com/laozhai/qq.exe
使用上面定義的alias可以正常打開,說明我們的配置是正確的,下面貼出配置
<Virtualhost 192.168.88.1:80 >
ServerName www.luyubo.com
DocumentRoot "/home/httpd/"
Alias /laozhai "/home/httpd/download/soft"
</Virtualhost>
<Directory "/home/httpd">
AllowOverride All
Order allow,deny
allow from all
</Directory>
#centos 7 格式一樣