目錄html
http服務器經常使用程序nginx
應用程序服務器web
市場佔有率統計
www.netcraft.comapache
特性:
高度模塊化:core + modules 功能已模塊形式存放,方便加載卸載。
DSO: Dynamic Shared Object 支持動態加/卸載
MPM:multi-processing module多路處理模塊vim
表示了當前http服務的請求響應工做模式。centos
prefork:多進程I/O模型,每一個進程響應一個請求,默認模型
一個主進程:生成和回收n個子進程,建立套接字,不響應請求
多個子進程:工做work進程,每一個子進程處理一個請求;系統初始時,預先生成多個空閒進程,等待請求,最大不超過1024個(最大限制能夠修改,可是仍是會存在c10k問題。)緩存
worker:複用的多進程I/O模型,多進程多線程,IIS使用此模型一個主進程:生成m個子進程,每一個子進程負責生個n個線程,每一個線程響應一個請求,併發響應請求:m*ntomcat
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 空閒線程隊列 ,這個時候就會有一個空閒線程隊列中的進程變爲監聽狀態。
線程或者進程,就會在這三種狀態中切換。
工做一段時間後 能夠將線程回收,而後提供一個新的線程來使用,保證系統的穩定性。讓線程不要「過勞」
虛擬主機 : 在一臺物理機上開闢多個虛擬機,有多種模式能夠開啓多個虛擬主機:IP、Port、FQDN
CGI:Common Gateway Interface,通用網關接口
正向代理 離客戶端近
反向代理 離服務器端近
代理案例:
client --- proxy --- reverse proxy --- websrv1 websrv2 websrv3 鏈路方式
正向代理:好比咱們訪問一個視頻站,你們都在看同一個視頻,那麼若是,全部人都從這一個服務器來拉取這個視頻,那麼走的都是重複流量,並且負載過大,這時候就須要一個代理服務器,把視頻緩存到這個代理服務器上,讓一部分的用戶鏈接這個代理服務器,來獲取這個視頻
反向代理:對於收到的訪問請求作調度,決定該請求最後去哪一個服務器
負載均衡
路徑別名
豐富的用戶認證機制
支持第三方模塊
推薦Centos安裝版本:
安裝方式:
rpm:centos發行版,穩定,建議使用
編譯:定製或特殊需求
CentOS 6程序環境:httpd-2.2
配置文件:
檢查配置語法:
服務腳本 /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
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
長鏈接要看具體的業務,而後來進行持續時間的更改。
若是是遊戲的話,那麼須要設置長一點,若是是官網或者電商網站,能夠短一些。
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個,那麼系統就只能再一個一個打開進程,而後來接收多餘的併發請求,因此若是併發大的話,能夠在服務啓動的時候就開啓多個子進程