Web Servicephp
應用層:http, httpscss
實現某類具體應用:html
傳輸層協議:TCP, UDP, SCTPnginx
IANA:web
0-1023:衆所周知,永久地分配給固定的應用使用,特權端口;算法
1024-41951:亦爲註冊端口,但要求不是特別嚴格,分配給程序註冊爲某應用使用;3306/tcp, 11211/tcp;數據庫
41952+:客戶端程序隨機使用的端口,動態端口,或私有端口;其範圍定義在/proc/sys/net/ipv4/ip_local_port_range;apache
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/:
p_w_picpaths/logo.jgp
http://www.magedu.com/p_w_picpaths/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:爲路徑時,是否區分字符大小寫,取決於文件系統;
經常使用配置:
一、修改監聽的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
默認使用的爲/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
四、DSO
配置指定實現模塊加載
LoadModule <mod_name> <mod_path>
模塊文件路徑可以使用相對路徑:
相對於ServerRoot(默認/etc/httpd)
五、定義'Main' server的文檔頁面路徑
DocumentRoot ""
文檔路徑映射:
DoucmentRoot指向的路徑爲URL路徑的起始位置
其至關於站點URL的根路徑;
(FileSystem) /web/host1/index.html --> (URL) /index.html
六、站點訪問控制常見機制
可基於兩種機制指明對哪些資源進行何種訪問控制
文件系統路徑:
<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
七、定義站點主頁面:
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
http://www.magedu.com/p_w_picpaths/logo.png
/www/htdocs/p_w_picpaths/logo.png
九、設定默認字符集
AddDefaultCharset UTF-8
中文字符集:GBK, GB2312, GB18030
十、日誌設定
日誌類型:訪問日誌 和 錯誤日誌
錯誤日誌:
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」的值;即發出請求的應用程序;
十一、基於用戶的訪問控制
認證質詢:
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 ...
十二、虛擬主機
站點標識: 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>
1三、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