http理論之1

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通信相關的系統調用)

SOCK_STREAM: tcp套接字

SOCK_DGRAM: UDP套接字

SOCK_RAW:raw套按字

根據套按字所使用的地址格式,Socket Domain:

AF_INET:Address Family,IPv4

AF_INET6:ipv6

AF_UNIX:同一主機上的不同進程間基於socket套接字通信使用的一種地址;Unix_SOCK

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 language, 編程語言,超文本標記語言;

<html>

<head>

<title>TITLE</title>

</head>

<body>

<h1></h1>

<p> blabla... <a href="http://www.magedu.com/download.html"> bla... </a> </p>

<h2> </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資源的主機,負責向請求者提供對方請求的靜態資源,或動態資源運行生成的結果;這些資源通常應該放置於本地文件系統某路徑下;此路徑稱爲DocRoot;

/var/www/html/:

images/logo.jgp

http://www.magedu.com/images/logo.jpg

web服務器的資源路徑映射方式:

(a) docroot 

(b) alias

(c) 虛擬主機的docroot

(d) 用戶家目錄的docroot 

http請求處理中的連接模式:

保持連接(長連接):keep-alive

時間:

數量:

非保持連接(短連接):

http服務器程序:

httpd (apache)

nginx

lighttpd

應用程序服務器:

IIS: .Net 

tomcat: .jsp

www.netcraft.com 

httpd的安裝和使用:

ASF: apache software foundation

httpd:apache

a patchy server = apache

httpd

httpd的特性:

高度模塊化: core + 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的程序版本:

httpd 1.3:官方已經停止維護;

httpd 2.0:

httpd 2.2: 

httpd 2.4:目前最新穩定版;

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.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|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

httpd-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}  httpd.service


回顧:

併發服務響應模型:

單進程模型;

多進程模型;

複用的I/O的模型;

多線程模式

事件驅動;

複用的多進程多線程模型

MPM:

prefork:多進程模型,一個進程響應一個請求;

worker:多進程多線程模型,一個線程響應一個請求;

event:事件驅動模型,一個進程響應n個請求;

Web service(2)

httpd-2.2的常用配置

主配置文件:/etc/httpd/conf/httpd.conf

### Section 1: Global Environment

### Section 2: 'Main' server configuration

### Section 3: Virtual Hosts

配置格式:

directive  value

directive:不區分字符大小寫;

value:爲路徑時,是否區分字符大小寫,取決於文件系統; 

常用配置:

1、修改監聽的IP和PORT

Listen  [IP:]PORT

(1) 省略IP表示爲0.0.0.0;

(2) Listen指令可重複出現多次;

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 

httpd-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

更換使用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       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

4、DSO

配置指定實現模塊加載

LoadModule  <mod_name>  <mod_path>

模塊文件路徑可使用相對路徑:

相對於ServerRoot(默認/etc/httpd)

5、定義'Main' server的文檔頁面路徑

DocumentRoot  ""

文檔路徑映射:

DoucmentRoot指向的路徑爲URL路徑的起始位置

其相當於站點URL的根路徑;

(FileSystem) /web/host1/index.html  -->  (URL)  /index.html

6、站點訪問控制常見機制

可基於兩種機制指明對哪些資源進行何種訪問控制

文件系統路徑:

<Directory  "">

...

</Directory>

<File  "">

...

</File>

<FileMatch  "PATTERN">

...

</FileMatch>

URL路徑:

<Location  "">

...

</Location>

<LocationMatch "">

...

</LocationMatch>

<Directory>中“基於源地址”實現訪問控制:

(1) Options

後跟1個或多個以空白字符分隔的“選項”列表;

Indexes:指明的URL路徑下不存在與定義的主頁面資源相符的資源文件時,返回索引列表給用戶;

FollowSymLinks:允許跟蹤符號鏈接文件所指向的源文件;

None:

All:

(2)  AllowOverride

與訪問控制相關的哪些指令可以放在.htaccess文件(每個目錄下都可以有一個)中;

All: 

None:

(3) order和allow、deny

order:定義生效次序;寫在後面的表示默認法則;

Allow from, Deny from

來源地址:

IP

NetAddr:

172.16

172.16.0.0

172.16.0.0/16

172.16.0.0/255.255.0.0

7、定義站點主頁面:

DirectoryIndex  index.html  index.html.var

8、定義路徑別名

格式:

Alias  /URL/  "/PATH/TO/SOMEDIR/"

DocumentRoot "/www/htdocs"

http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm 

/www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm 

Alias  /download/  "/rpms/pub/"

http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm 

/rpms/pub/bash-4.4.2-3.el6.x86_64.rpm

http://www.magedu.com/images/logo.png

/www/htdocs/images/logo.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 %l %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地址;

%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”的值;即發出請求的應用程序;

11、基於用戶的訪問控制

認證質詢:

WWW-Authenticate:響應碼爲401,拒絕客戶端請求,並說明要求客戶端提供賬號和密碼;

認證:

Authorization:客戶端用戶填入賬號和密碼後再次發送請求報文;認證通過時,則服務器發送響應的資源;

認證方式有兩種:

basic:明文 

digest:消息摘要認證

安全域:需要用戶認證後方能訪問的路徑;應該通過名稱對其進行標識,以便於告知用戶認證的原因;

用戶的賬號和密碼存放於何處?

虛擬賬號:僅用於訪問某服務時用到的認證標識

存儲:

文本文件;

SQL數據庫;

ldap目錄存儲;

basic認證配置示例:

(1) 定義安全域

<Directory "">

Options None

AllowOverride None

AuthType Basic

AuthName "String“

AuthUserFile  "/PATH/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:刪除指定用戶

另外:基於組賬號進行認證;

(1) 定義安全域

<Directory "">

Options None

AllowOverride None

AuthType Basic

AuthName "String“

AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"

AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"

Require  group  grpname1  grpname2 ...

</Directory>

(2) 創建用戶賬號和組賬號文件;

組文件:每一行定義一個組

GRP_NAME: username1  username2  ...

12、虛擬主機

站點標識: socket

IP相同,但端口不同;

IP不同,但端口均爲默認端口;

FQDN不同;

請求報文中首部

Host: www.magedu.com 

有三種實現方案:

基於ip:

爲每個虛擬主機準備至少一個ip地址;

基於port:

爲每個虛擬主機使用至少一個獨立的port;

基於FQDN:

爲每個虛擬主機使用至少一個FQDN;

注意:一般虛擬機不要與中心主機混用;因此,要使用虛擬主機,得先禁用'main'主機;

禁用方法:註釋中心主機的DocumentRoot指令即可;

虛擬主機的配置方法:

<VirtualHost  IP:PORT>

ServerName FQDN

DocumentRoot  ""

</VirtualHost>

其它可用指令:

ServerAlias:虛擬主機的別名;可多次使用;

ErrorLog:

CustomLog:

<Directory "">

...

</Directory>

Alias

...

基於IP的虛擬主機示例:

<VirtualHost 172.16.100.6:80>

ServerName www.a.com

DocumentRoot "/www/a.com/htdocs"

</VirtualHost>


<VirtualHost 172.16.100.7:80>

ServerName www.b.net

DocumentRoot "/www/b.net/htdocs"

</VirtualHost>


<VirtualHost 172.16.100.8:80>

ServerName www.c.org

DocumentRoot "/www/c.org/htdocs"

</VirtualHost>

基於端口的虛擬主機:

<VirtualHost 172.16.100.6:80>

ServerName www.a.com

DocumentRoot "/www/a.com/htdocs"

</VirtualHost>


<VirtualHost 172.16.100.6:808>

ServerName www.b.net

DocumentRoot "/www/b.net/htdocs"

</VirtualHost>


<VirtualHost 172.16.100.6:8080>

ServerName www.c.org

DocumentRoot "/www/c.org/htdocs"

</VirtualHost>

基於FQDN的虛擬主機:

NameVirtualHost 172.16.100.6:80


<VirtualHost 172.16.100.6:80>

ServerName www.a.com

DocumentRoot "/www/a.com/htdocs"

</VirtualHost>


<VirtualHost 172.16.100.6:80>

ServerName www.b.net

DocumentRoot "/www/b.net/htdocs"

</VirtualHost>


<VirtualHost 172.16.100.6:80>

ServerName www.c.org

DocumentRoot "/www/c.org/htdocs"

</VirtualHost>

13、status頁面

LoadModule  status_module  modules/mod_status.so

<Location /server-status>

SetHandler server-status

Order allow,deny

Allow from 172.16

</Location>




回顧:

httpd的配置:

Listen [IP:]PORT

KeepAlived {ON|Off}

MPM:

prefork, worker, event

DSO:

LoadModule

httpd -M

DocumentRoot

<Directory>

Options Indexes FollowSymLinks

Order 

Allow from

Deny from

</Directory>

<Location>


DirectoryIndex

ErrorLog

CustomLog

LogFormat

%{Referer}i: 引用Referer首部的值;

Alias /URL/ "/path/to/somedir/"

基於用戶訪問控制:

認證方式:basic, digest

AuthType Basic

AuthName ""

AuthUserFile 

AuthGroupFile

Require user

Require group

Require valid-user


.htpasswd:

htpasswd

虛擬主機:IP, Port, FQDN


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章