http的工作模式:
http請求報文:http request
http響應報文:http response
一次http事務:請求 <-->響應
web資源:web resource
靜態資源(無須服務端做出額外處理):.jpg .png .gif .html .txt .js .css .mp3 .avi
動態資源(服務端需要通過執行程序做出處理,發送給客戶端的是程序的運行結果): .php .jsp
注意:一個頁面中展示的資源肯有多個;每個資源都需要單獨請求;
一次完整的http請求處理過程:
1.建立或處理連接:接收請求或拒絕請求;
2.接收請求:接收來自於網絡上的主機請求報文中對某特點資源的一次請求的過程;
3.處理請求:對請求報文進行解析,獲取客戶端請求的資源及請求方法等相關信息;
4.訪問資源:獲取請求報文中請求的資源;
5.構建響應報文;
6.發送響應報文;
7.記錄日誌:可以做用戶分析
2.接收請求
接收請求的模型:
併發訪問響應模型:
單進程I/O模型:啓動一個進程處理用戶請求;這意味着,一次只能處理一個請求,多個請求被串行響應;
多進程I/O結構:併發啓動多個進程,每個進程響應一個請求;
複用的I/O結構:一個進程響應n個請求;
多線程模式:一個進程生成n個線程,一個線程處理一個請求;
事件驅動(event-driven):一個進程直接響應n個請求;
複用的多進程I/O結構:啓動多個(m)個進程,每個進程生成(n)個線程;
響應的請求的數量:m*n;
3.處理請求 :分析請求報文的http請求報文首部
http協議:
http請求報文首部
http響應報文首部
請求報文首部的格式:
<method><URL><VERSION>
HEADERS:(name:value)
<request body>
4.訪問資源:獲取請求報文中請求的資源
web服務器,即存放了web資源的主機,負責向請求者提供對方請求的靜態資源,或動態資源運行生成的結果; 這些資源通常應該放置於本地文件系統某路徑下;此路徑稱爲DocRoot;
web服務器的資源路徑映射方式:
1. DocRoot
2. alias
3. 虛擬主機的DocRoot
4. 用戶家目錄的DocRoot
http請求處理中的連接模式:
保持連接(長連接):kepp-alive
時間:
數量:
非保持連接(短連接):
http服務器程序:
httpd (apache)
nginx
lighttpd
應用程序服務器:
IIS: .Net
tomcat: .jsp
httpd的安裝和使用:
ASF: apache software foundation # Apache軟件基金會
httpd : apache
httpd的特性:
高度模塊化:core + modules
DSO:dynamlc shared object
MPM:Multipath processing Modules (多路處理模塊)
prefork:多進程模型,每個進程響應一個請求;
一個主進程:負責生成子進程及回收子進程;負責創建套接字;負責接收請求,並將其派發給某子進程進行處理;
n個子進程:每個子進程處理一個請求;
工作模型:會預先生成幾個空閒進程,隨時等待用於響應用戶請求;最大空閒和最小空閒;
worker:多進程多線程模型,每線程處理一個用戶請求;
一個主進程:負責生成子進程;負責創建套接字;負責接收請求,並將其派發給某子進程進行處理;
多個子進程:每個子進程負責生成多個線程;
每個線程:負責響應用戶請求;
併發響應數量:m*n
m:子進程數量
n:每個子進程所能創建的最大線程數量;
event:事件驅動模型,多進程模型,每個進程響應多個請求;
一個主進程,負責生成子進程;負責創建套接字;負責接收請求,並將其派發給某子進程進行處理;
子進程:基於事件驅動機制直接響應多個請求;
httpd-2.2: 仍爲測試使用模型;
httpd-2.4:event可生產環境中使用;
httpd的功能特性:
CGI: Common Gateway Interface
虛擬主機:ip, port, FQDN
反向代理:
負載均衡:
路徑別名:
豐富的用戶認證機制
basic
digest
支持第三方模塊
安裝httpd:
rpm包: centos發行版中直接提供;
編譯安裝:定製新功能,或其它原因;
centos 6:
程序環境:
/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/
centos 6服務控制和啓動:
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
httpd-2.2的常用配置:
httpd-2.2的常用配置:
主配置文件:/etc/httpd/conf/httpd.conf
### Section 1: Global Environment # 第1節:全局環境
### Section 2: 'Main' server configuration # 第2節:主服務器配置
### Section 3: Virtual Hosts # 第三節:虛擬主機
配置格式:
directive value
directive #指令 :不區分字符大小寫;
value #值 :爲路徑時,是否區分字符大小寫 ,取決於文件系統;
常用配置: /etc/httpd/conf/httpd.conf
1.修改監聽的IP和port
Listen 12.34.56.78:80
Listen 80
(1)省略IP表示爲0.0.0.0
(2)Listen 指令可重複出現多次;
Listen 80
Listen 8080
(3)修改監聽socket, 啓動服務進程方可生效;
2.持久連接
Persistent Connection: tcp連接建立後,每個資源獲取完成後不全斷開連接,而是繼續等待其它資源請求的進行;
如何斷開?
數量限制
時間限制
副作用:對併發訪問量較大的服務器,長連接機制會使得後續某些請求無法得到正常響應;
折衷:使用較短的持久連接時長,以及較少的請求數量;
KeepAlive On | Off #開啓持久連接時長
KeepAliveTimeout 15 #持久連接時長保持15秒
MaxKeepAliveRequests 100 #表示這個鏈接請求不能超過100次(一般長連接模式用到),如果設置爲0表示永遠可用,但爲了服務器性能最好還是設置一個較大的值
測試:
[root@Centos7ip11 ~]# telnet 192.168.0.7 80
Trying 192.168.0.7...
Connected to 192.168.0.7.
Escape character is '^]'.
GET /index.html HTTP/1.1
Host:192.168.0.7
HTTP/1.1 200 OK
Date: Sun, 31 Mar 2019 12:47:01 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Sun, 31 Mar 2019 11:53:23 GMT
ETag: "122db2-16-585628d0bde6a"
Accept-Ranges: bytes
Content-Length: 22
Content-Type: text/html; charset=UTF-8
<h1>hello word! </h1>
Connection closed by foreign host.
3.MPM
httpd-2.2不支持同時編譯多個MPM模塊,所以只能編譯選定要使用的那個; CentOS 6的rpm包爲此專門提供了三個應用程序文件, httpd(prefork), httpd.worker, httpd.event, 分別用於實現對不同的MPM機制的支持;
確認現在使用的是哪個程序文件的方法:
~]# ps aux | grep httpd
~]# /usr/sbin/httpd -l
Compiled in modules:
core.c
mod_so.c
http_core.c
默認使用的爲/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>
#StartServers:要啓動的服務器進程數
#minspareservers:保留備用的服務器進程的最小數目
#MaxSpareServers:保留備用的服務器進程的最大數目
#ServerLimit:服務器生存期內MaxClients的最大值
#maxclients:允許啓動的最大服務器進程數
#maxrequestsperschild:服務器進程服務的最大請求數
worker的配置
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
#StartServers:要啓動的服務器進程的初始數目
#maxclients:同時進行的最大客戶端連接數
#minspareThreads:保留備用的最小工作線程數
#maxsparethreads:保留備用的最大工作線程數
#threadsperchild:每個服務器進程中的工作線程數保持不變
#maxrequestsperschild:服務器進程服務的最大請求數
PV, UV
page view 頁面瀏覽量
user view
4.DSO
配置指定實現模塊加載
LoadModule <mod_name> <mod_path>
模塊文件路徑可使用相對路徑:
相對於ServerRoot (默認/etc/httpd)
5.定義“Main”server 的文檔頁面路徑 Main server #主服務器
DocumentRoot "/var/www/html"
文檔路徑映射:
DocumentRoot 指向的路徑爲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:定義生效次序;寫在後面的表示默認法則;
7.定義站點主頁面:
DirectoryIndex index.html index.html.var