1. 程式人生 > >Apache系列:Apache的全局配置

Apache系列:Apache的全局配置

優點 任務 綁定 信息 per 長連接 sed class 不同的


配置文件組成:
整個配置文件由3段組成:

(1)全局配置:對主服務器或虛擬機都有效,且有些功能是服務器自身工作屬性;

(2)主服務器:主站屬性;

(3)虛擬主機:虛擬主機及屬性定義

註:第二段和第三段(即主機和虛擬主機)不能同時使用;

 

全局配置

一、配置監聽的地址和端口

Listen  [IP:]PORT    //Listen可重復使用多次
默認監聽80端口,不加ip,默認監聽服務器上的多個ip地址上的80端口,你可以配置多個網卡,在不同的網卡上配置不同的IP,不管從哪個ip訪問都能被監聽

Listen 192.168.1.22:80:只監聽這個ip地址的80端口

  

二、DSO與MPM

Apache DSO

apache是一個模塊化設計的服務,核心只包含主要功能,擴展功能通過模塊實現。
不同的模塊的功能和特性都是獨立分開的,這樣擴展性更好,模塊之間依賴性小,利於維護升級和擴展。
不同模塊可以被靜態的編譯進程序,也可以動態加載。
模塊的動態加載通過DSO(Dysnamic Shared Object)實現。

httpd -l :用於查看核心模塊(靜態編譯入程序的模塊)

httpd -M:用於查看當前apache安裝的模塊

MPM(Multi Process Modules)

意為多路處理模塊,也就是我們所說的apache的工作模式。

MPM負責實現網絡監聽,請求的處理等功能、MPM有很多種,目的是為了在不同平臺下實現最優化的性能及穩定性。

共有3種工作模式

prefork:一個主進程產生多個子進程,一個子進程響應一個請求;
worker:一個進程生成多個線程,一個線程響應一個請求;
event:基於事件驅動;

  

不同系統下可以使用的MPM:

技術分享圖片

說明

技術分享圖片
event在apache2.4版本之前是以測試狀態提供,網上並沒有太多的資料,在更新至2.4版本之後正式上線。

先來說prefork:當httpd啟動起來之後,會生成一個主進程,它負責監聽用戶的請求,一旦請求進來後,它不負責自己響應,而是讓其生成的子進程來響應,而主進程繼續監聽請求。
prefork是非線程,預生成進程型MPM、prefork會預先啟動一些子進程,每個子進程一個時間點只能處理一個請求,並且會根據並發請求數量動態生成更多子進程。
通過子進程對外提供服務,處理請求,但是每個子進程在同時間內只能處理一個任務,這個可以在配置文件中設置。
如果有更多的請求,會自動生成更多的子進程來處理。

worker是線程化,多進程的MPM,每個進程可以生成多個線程,每個線程處理一個請求。
優點:節省資源,每多一個子進程就會多占用系統資源,使用線程處理請求。

apache默認prefork:現在的計算機系統資源還是比較夠用的,使用prefork效率更高,但是如果要修改為 worker,則要重新靜態編譯模塊。

需要考慮的是:剛啟動服務的時候需要創建幾個空閑進程,太多不好太少也不好。最少保證有幾個空閑進程來響應請求進來,這是必須的。 最多設定多少個空閑進程,多余的空閑進程需要回收回來。
所以其有如下幾個關鍵作用:
(
1)啟動服務時綁定特權端口:Linux系統中,只有管理員有權限使用小於1024的特權端口;但運行一些公共可用的服務,一定不能以管理員身份運行 (2)派發或回收子進程 (3)讀取分析主配置文件 (4)監聽每個用戶請求並且派發子進程
View Code

配置prefork模型

apache服務默認就是以Prefork模式啟動,無須更改啟動模式。

參數說明:

<IfModule prefork.c>            #如果存在這個模塊,那麽提供以下屬性
StartServers           8        #剛啟動web服務時啟動幾個空閑子進程
MinSpareServers        5        #最少空閑進程數
MaxSpareServers        20       #最大空閑進程數
ServerLimit            256      #限定最多允許並發進來的活動用戶連接個數
MaxClients 256 #服務器所允許同時所連接進來的鏈接數,一般來說與上面保持一致,或者大於上面的數。 
MaxRequestsPerChild 4000 #一個服務器進程最多可以處理多少個進程,一旦超出請求後無論如何將進程結束並新啟動新進程
 </IfModule> #最後以IfModule結尾



註意:為什麽不能一直用子進程處理去處理請求?
技術分享圖片
為什麽不能一直用這個子進程處理請求?
1.擔心子進程有內存泄漏,長期工作下會出現bug等問題,持續工作會一直吃系統資源
2.子進程假死狀態,不能正常處理請求
為了保險起見,為了讓apache更穩定,更安全的運行
View Code

配置worker模型

更改apache當前工作模式為worker模式

編輯文件/etc/sysconfig/httpd,將以下參數的註釋信息去掉:

HTTPD=/usr/sbin/httpd.worker
更改模式後必須重新啟動服務

[root@Centos ~]# service httpd restart
啟動完畢後,查看其進程狀態:

[root@Centos ~]# ps -ef | grep http
root      1667    1  0 23:43 ?        00:00:00 /usr/sbin/httpd.worker              #以root用戶身份生成的父進程(用於派發工作進程)
apache    1671 1667  0 23:44 ?        00:00:00 /usr/sbin/httpd.worker              #以apache用戶身份運行的工作進程(該工作進程派發線程)
apache    1672 1667  0 23:44 ?        00:00:00 /usr/sbin/httpd.worker
apache    1673 1667  0 23:44 ?        00:00:00 /usr/sbin/httpd.worker
apache    1676 1667  0 23:44 ?        00:00:00 /usr/sbin/httpd.worker

參數說明:

<IfModuleworker.c>
StartServers           4        #配置啟動多少個用於監聽的服務,註意:這裏並不是服務器進程,而是線程
MaxClients             300      #最大支持的用戶連接數
MinSpareThreads        25       #最小的空閑線程數
MaxSpareThreads        75       #最大的空閑線程數
ThreadsPerChild        25       #允許每個進程最多生成多少個線程
MaxRequestsPerChild    0        #設置一個獨立的子進程將能處理的請求數量
</IfModule>

  

3、配置服務器支持keep-alived

KeepAlive {On|Off} :啟用之後支持一次連接可以發多個請求(對於非常繁忙的服務器建議off
KeepAliveTimeout  15 : 15秒之後斷開長連接
MaxKeepAliveRequests 50:一次長連接之內最多允許50個請求

  

4、配置加載的模塊

#LoadModule指令  模塊名稱   模塊所在的路徑(相對於ServerRoot的路徑)
LoadModule foo_module modules/mod_foo.so

 

5、其他常用配置

ServerTokens OS:返回服務器頁腳信息的詳細程度,盡量選擇小信息量(full、major)
ServerRoot "/etc/httpd":服務器的配置文件所在
PidFile run/httpd.pid :服務器主進程pid的保存位置
Timeout 60:超時設置,設置短一點好
Include conf.d/*.conf:默認加載模塊的配置文件

  

Apache系列:Apache的全局配置