1. 程式人生 > >http 工作模式與模塊

http 工作模式與模塊

視頻 rac 服務器端 nvi 連接 src 毫秒級 idle service

目錄

  • http 工作模式與模塊
    • http 服務器應用
    • MPM工作模式
      • prefork
      • worker
      • event
      • 進程角色
      • httpd功能特性
    • http 安裝
      • centos6配置目錄
    • http 2.2 常見配置
      • 持久連接
    • MPM 多路處理模塊
      • 詳細常見配置

http 工作模式與模塊

http 服務器應用

http服務器常用程序

  • httpd apache
  • nginx
  • lighttpd

應用程序服務器

  • IIS .asp
  • tomcat .jsp
  • jetty 開源的servlet容器,基於Java的web容器
  • Resin CAUCHO公司,支持servlets和jsp的引擎
  • webshpere(IBM), weblogic(BEA), jboss,oc4j(Oracle)

市場占有率統計
www.netcraft.com

特性:
高度模塊化:core + modules 功能已模塊形式存放,方便加載卸載。
DSO: Dynamic Shared Object 支持動態加/卸載

MPM:multi-processing module多路處理模塊

MPM工作模式

表示了當前http服務的請求響應工作模式。

prefork

prefork:多進程I/O模型,每個進程響應一個請求,默認模型
一個主進程:生成和回收n個子進程,創建套接字,不響應請求
多個子進程:工作work進程,每個子進程處理一個請求;系統初始時,預先生成多個空閑進程,等待請求,最大不超過1024個(最大限制可以修改,但是還是會存在c10k問題。)

技術分享圖片

worker

worker:復用的多進程I/O模型,多進程多線程,IIS使用此模型一個主進程:生成m個子進程,每個子進程負責生個n個線程,每個線程響應一個請求,並發響應請求:m*n

技術分享圖片

event

event:事件驅動模型(worker模型的變種)
一個主進程:生成m個子進程,每個進程直接響應n個請求,並發響應請求:m*n,有專門的線程來管理這些keep-alive類型的線程,當有真實請求時,將請求傳遞給服務線程,執行完畢後,又允許釋放。這樣增強了高並發場景下的請求處理能力

技術分享圖片

httpd-2.2: event 測試版,centos6默認
httpd-2.4:event 穩定版,centos7默認

http2.2 默認使用 prefork 工作模式 http2.2 有三個運行主程序,分別對應三個模式
http2.4 集成在一個主程序中,通過模塊切換來切換模式

進程角色

如果有一個用戶發起請求,需要一個處於監聽狀態的線程,該線程會切換為work狀態,來響應該請求,處理完後,該線程會進入idle worker 空閑線程隊列 ,這個時候就會有一個空閑線程隊列中的進程變為監聽狀態。

線程或者進程,就會在這三種狀態中切換。
工作一段時間後 可以將線程回收,然後提供一個新的線程來使用,保證系統的穩定性。讓線程不要“過勞”

httpd功能特性

虛擬主機 : 在一臺物理機上開辟多個虛擬機,有多種模式可以開啟多個虛擬主機:IP、Port、FQDN
CGI:Common Gateway Interface,通用網關接口

正向代理 離客戶端近
反向代理 離服務器端近

代理案例:
client --- proxy --- reverse proxy --- websrv1 websrv2 websrv3 鏈路方式
正向代理:比如我們訪問一個視頻站,大家都在看同一個視頻,那麽如果,所有人都從這一個服務器來拉取這個視頻,那麽走的都是重復流量,而且負載過大,這時候就需要一個代理服務器,把視頻緩存到這個代理服務器上,讓一部分的用戶連接這個代理服務器,來獲取這個視頻
反向代理:對於收到的訪問請求做調度,決定該請求最後去哪個服務器
負載均衡
路徑別名
豐富的用戶認證機制

  • basic
  • digest

支持第三方模塊

http 安裝

推薦Centos安裝版本:

  • CentOS 6: 2.2
  • CentOS 7: 2.4

安裝方式:
rpm:centos發行版,穩定,建議使用
編譯:定制或特殊需求

CentOS 6程序環境:httpd-2.2
配置文件:

  • /etc/httpd/conf/httpd.conf
  • /etc/httpd/conf.d/*.conf

檢查配置語法:

  • httpd –t
  • service httpd configtest

centos6配置目錄

服務腳本
/etc/rc.d/init.d/httpd

主配置文件
/etc/sysconfig/httpd

服務控制和啟動:
chkconfig httpd on|off
service {start|stop|restart|status|configtest|reload} httpd

默認站點網頁文檔根目錄:
/var/www/html

模塊文件路徑:
/etc/httpd/modules
/usr/lib64/httpd/modules

主程序文件:分別對應三種不同的MPM工作模式
/usr/sbin/httpd
/usr/sbin/httpd.worker
/usr/sbin/httpd.event

主進程文件:
/etc/httpd/run/httpd.pid

日誌文件目錄:
/var/log/httpd

access_log: 訪問日誌
error_log:錯誤日誌

幫助文檔包:
httpd-manual

http 2.2 常見配置

httpd配置文件的組成:

# grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts

配置格式:directive value
directive: 不區分字符大小寫
value: 為路徑時,是否區分大小寫,取決於文件系統

echo servertokens prod >> /etc/httpd/conf/test.conf
修改http配置的時候,不建議在主配置文件中修改,可以新建自己的配置文件,來進行修改

常見配置詳解

vim /etc/httpd/conf/httpd.conf

#Apache服務器存在的主目錄
ServerRoot /etc/httpd 

#表示相對於/etc/httpd 下的路徑 說明只要我們把配置文件放到conf.d下,並且已.conf結尾,http都能識別並且加載
IncludeOptional conf.d/*.conf

#該配置文件存放著沒有默認index主頁的時候,所要顯示的頁面的配置。
/etc/httpd/conf.d/welcome.conf 

#該選項可以更改客戶端訪問web服務器時,頭文件所顯示的當前web信息,不建議使用默認的full,這樣會顯示所有的信息
ServerTokens ,建議使用:ServerTokens Prod

#修改監聽的IP和Port
Listen [IP:]PORT
(1) 省略IP表示為本機所有IP
(2) Listen指令至少一個,可重復出現多次 ,如果填寫多個監聽端口的話,那麽多個端口都會開啟監聽web服務
Listen 80
Listen 8080

#表示綁定該IP的80端口,這樣的話就只有同網段的允許訪問,其他內網網段的無法進行訪問
listen 192.168.30.1:80  

持久連接

Persistent Connection:連接建立,每個資源獲取完成後不會斷開連接,而是繼續等待其它的請求完成,默認關閉持久連接

斷開條件:數量限制:100
時間限制:以秒為單位, httpd-2.4 支持毫秒級
副作用:對並發訪問量較大的服務器,持久連接功能會使用有些請求得不到響應
折衷:使用較短的持久連接時間

#默認keeyalive 不存在與配置文件中,就是使用的默認值,是5秒 

#是否開啟持久化連接
KeepAlive On|Off

#持久化連接超時時間
KeepAliveTimeout 15

#持久化請求次數限制,如果單用戶請求滿100次也就斷開了,哪怕沒有到長連接設置的斷開時間
MaxKeepAliveRequests 100

#測試
telnet 192.168.30.1 80
GET /index.html HTTP/1.1
Host: 6.6.6.6

長連接要看具體的業務,然後來進行持續時間的更改。
如果是遊戲的話,那麽需要設置長一點,如果是官網或者電商網站,可以短一些。

MPM 多路處理模塊

httpd-2.2不支持同時編譯多個模塊,所以只能編譯時選定一個;rpm安裝的包提供三個二進制程序文件,分別用於實現對不同MPM機制的支持

確認方法:

ps aux | grep httpd

默認為/usr/sbin/httpd, 即prefork模式

2.2默認使用prefork 一主進程,其他為子進程,有多少用戶請求就開多少個子進程,子進程來響應用戶請求
worker 模式:一個主進程開啟多個子進程,每個子進程開啟多個子線程,每個子線程來響應用戶的請求

模塊相關命令

#查看靜態編譯的模塊
httpd -l

#查看靜態編譯及動態裝載的模塊
httpd –M

#動態模塊加載:不需重啟即生效
#動態模塊路徑
/usr/lib64/httpd/modules/

#更換使用的httpd程序:
/etc/sysconfig/httpd

HTTPD=/usr/sbin/httpd.worker
重啟服務生效
pstree -p|grep httpd 查看進程和線程

Httpd 2.4 與之不同,以動態模塊方式提供
配置文件:/etc/httpd/conf.modules.d/00-mpm.conf ,註釋不需要的模塊,取消註釋你需要的模塊行
httpd –M |grep mpm
重啟服務生效
pstree -p|grep httpd 查看進程和線程

詳細常見配置

<IfModule prefork.c>

#表示服務啟動的時候,開啟多少個子進程
StartServers 8 

#最小數量的服務器進程,保存備用
MinSpareServers 5 

# 最大數量的服務器進程,保存備用
MaxSpareServers 20

#最多進程數,最大20000
ServerLimit 256 

#最大並發
MaxClients 256 

 子進程最多能處理的請求數量。#
MaxRequestsPerChild 4000
在處理MaxRequestsPerChild 個請求之後,子進程將會被父進程
終止,這時候子進程占用的內存就會釋放(為0時永遠不釋放)
</IfModule> 

如果並發來了100個,進程只有20個,那麽系統就只能再一個一個打開進程,然後來接收多余的並發請求,所以如果並發大的話,可以在服務啟動的時候就開啟多個子進程

http 工作模式與模塊