magelinux(0111)

Web Servicephp

應用層: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;

若是rpm包安裝的,默認的位置是/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
時間:
數量:
非保持鏈接(短鏈接):css

三次握手是,第一次客戶端請求鏈接,第二次服務器端相應並請求鏈接,第三次客戶端請求。四次揮手是,第一次客戶端請求,第二次服務器端響應,第三次服務器端請求,第四次客戶端響應。第二次握手是把請求和響應合二爲一了,而四次揮手確分開了,有的服務器會阻塞在第二次服務器響應這個階段,就是不想分手,不想斷開,以保證若是客戶端在請求斷開的過程當中又要請求數據了,還能夠傳數據,不用再從新創建鏈接html

一次完整的鏈接不必定僅僅發送一個資源。若是就這樣一個資源耗費一次鏈接,那這叫短鏈接。好比一個網頁有5個圖片,5個圖片就是5個資源,客戶要訪問這個網頁,就要走5次這樣的三次握手-傳輸數據-4此揮手的過程。linux

還有一種模式叫長鏈接,或者叫保持鏈接(keep alive),好比一次鏈接最多能發送5個資源,或者最多能保持幾秒鐘,時間一到,鏈接斷開。第一條說的情景其實就是這樣的模型http服務器程序:httpd (apache)nginxlighttpnginx

應用程序服務器:
IIS: .Net
tomcat: .jsp
web

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(不支持支持MPM的動態切換)
程序環境:
配置文件:
/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.serviceapache


0111-3     
回顧:
併發服務響應模型:
單進程模型;
多進程模型;
複用的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:爲路徑時,是否區分字符大小寫,取決於文件系統;

經常使用配置:
一、修改監聽的IP和PORT
Listen [IP:]PORT

(1) 省略IP表示爲0.0.0.0;
(2) Listen指令可重複出現屢次;
Listen 80
Listen 8080
(3) 修改監聽socket,重啓服務進程方可生效;

二、持久連續
Persistent Connection:tcp連續創建後,每一個資源獲取完成後不全斷開鏈接,而是繼續等待其它資源請求的進行;
如何斷開?
數量限制
時間限制

反作用:對併發訪問量較大的服務器,長鏈接機制會使得後續某些請求沒法獲得正常 響應;
折衷:使用較短的持久鏈接時長,以及較少的請求數量;

KeepAlive On|Off
KeepAliveTimeout 15
MaxKeepAliveRequests 100

測試:
telnet WEB_SERVER_IP PORT
GET /URL HTTP/1.1
Host: WEB_SERVER_IP
輸入以上後連續輸入回車兩次編程



若是是短鏈接的話,獲取到了一個資源之後就當即斷開,若是是長鏈接就不會當即斷開,只有等到數量或時間限制之後纔會斷開

三、MPM

httpd-2.2不支持同時編譯多個MPM模塊,因此只能編譯選定要使用的那個;CentOS 6的rpm包爲此專門提供了三個應用程序文件,httpd(prefork), httpd.worker, httpd.event,

分別用於實現對不一樣的MPM機制的支持;確認如今使用的是哪下程序文件的方法:
ps aux | grep httpd

上圖可看到是prefork模式,而且剛開機會啓動八個子進程

默認使用的爲/usr/sbin/httpd,其爲prefork的MPM模塊 ;
查看httpd程序的模塊列表:
查看靜態編譯的模塊:
# httpd -l
查看靜態編譯及動態編譯的模塊:
# httpd -M

更換使用httpd程序,以支持其它MPM機制;
編輯腳本配置文件/etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.{worker,event}



注意:重啓服務進程方可生效
對於linux來說,用線程模式取代進程模式所帶來性能方面的提高是很是有限的,也就是用worker取代prefork
而對於centos6的apache2.2來說,event仍是測試階段,不建議在生產環境中使用

MPM配置:在主配置文件中
prefork的配置
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>


在這個配置文件中,maxrequestsperchild爲4000表示一個進程最多能處理4000個請求,處理到了上顯就
必須銷燬
maxclients能夠理解爲最大併發數量(最大請求數量),serverlimit是最多的進程,因此serverlimit要大於等於max
clients
pv 和uv。pv是頁面訪問數量
假設一個進程一秒鐘能發5個資源,那麼256個*5就是1280個,也就是一臺服務器一秒鐘能發1280個資源,而假設一個頁面
有100個資源,那麼這個服務器最大能支持每秒12.8的pv


worker的配置:
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
在這個配置文件中,maxrequestsperchild爲0表示無限,就是一個線程能夠無限制的處理請求,而不被銷燬

在worker和prefork模式,都是有惟一一個以root身份運行的主進程在運行,這個主進程負責把接收到的請求分配
給子進程或線程,而線程或進程都是以apache身份運行的。上述兩個配置中的startserver指的是子進程,
上面這個worker模式的服務器啓動時會打開4個子進程,每一個子進程啓動25個線程(threadsperchild)那麼一共啓動了
100個線程,可是他配置的maxsparethreads爲75個,這個是最大空閒線程,因此砍掉了一個子進程,也就是剛啓動有三個
子進程。爲何要這個配,馬哥也表示難以理解
PV,UV
PV:Page View
UV: User View

四、DSO
配置指令實現模塊加載
LoadModule <mod_name> <mod_path>

模塊文件路徑可以使用相對路徑:
相對於ServerRoot(默認/etc/httpd)

五、定義'Main' server的文檔頁面路徑
DocumentRoot ""

文檔路徑映射:
DoucmentRoot指向的路徑爲URL路徑的起始位置
其至關於站點URL的根路徑;

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

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

可基於兩種機制指明對哪些資源進行何種訪問控制,一種是文件系統路徑,一種是URL路徑

文件系統路徑:
<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
來源地址:
如下格式都是合法的而且都是相同的效果:
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

八、定義路徑別名
格式:
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


九、設定默認字符集
AddDefaultCharset UTF-8

中文字符集:GBK, GB2312, GB18030

0111-04

十、日誌設定 日誌類型:訪問日誌 和 錯誤日誌

相關文章
相關標籤/搜索