Apache Web服務器資源使用限制配置
日期:2017/2/8 10:30:40   編輯:關於服務器
3.4.3 Apache Web服務器資源使用限制配置
“資源使用限制”就是要限制用戶對網站特定資源(如目錄、服務器硬件等)的訪問。相關指令包括:LimitRequestBody、LimitRequestFields、LimitRequestFieldSize、LimitRequestLine、RLimitCPU、RLimitMEM、RLimitNPROC和ThreadStackSize。
LimitRequest*系列指令用來限制Apache在讀取客戶端請求的過程中使用的資源數量。通過限制這些值,可以減輕某些拒絕服務(DOS)攻擊;RLimit*系列指令限制被Apache子進程所派生的進程使用的資源數量,通常這些指令用來控制CGI腳本和SSI exec命令所使用的資源;ThreadStackSize指令在某些平台上用來控制堆棧大小。
1.LimitRequestBody
LimitRequestBody指令限制客戶端發送的HTTP請求體的最大字節長度。其語法格式為:LimitRequestBody Bytes,Bytes在0(意味著無限制)到2 147 483 647(2GB)間限制了請求體所允許的字節數。默認值為“0”。
LimitRequestBody指令可以讓用戶在其作用范圍內(整個服務器、特定目錄、特定文件、特定位置)設置一個允許客戶端發送的HTTP請求體的最大字節長度的限制。如果客戶端的請求超出了這個限制,服務器會回應一個錯誤,而不是為這個請求繼續提供服務。一個普通請求的信息體在很大程度上取決於資源的自然屬性和這個資源允許的方法。CGI腳本經常用消息體把表單的信息傳遞給服務器。使用PUT方法至少能夠得到與服務器期望從這個資源得到的信息量差不多大小的值。
此指令給了服務器管理員更大的可控性,以控制客戶端不正常的請求行為。這有助於避免某些形式的拒絕服務攻擊。比如,如果允許文件上傳到某個位置,而且希望能將上傳文件的大小設置為100KB,可以使用下面的指令:
LimitRequestBody 102400
2.LimitRequestFields
LimitRequestFields用來限制接受客戶端請求中HTTP請求頭域的數量。其語法格式為:LimitRequestFields Number,Number是一個0(意味著不限)到32 767之間的整數。默認值為“100”。默認值為編譯時的常量DEFAULT_LIMIT_REQUEST_FIELDS(發布值為100)。
LimitRequestFields指令允許服務器管理員修改在一個HTTP請求中的請求頭域的數量限制。服務器需要此值大於一個普通客戶端請求中包含頭域的數量。一個客戶端請求頭域的數量很少大於20,但根據客戶端的不同這個數字有很大的差別,經常取決於用戶配置他們的浏覽器擴展以支持更詳細的內容協商。可選的HTTP擴展經常使用請求頭域來實現。
這個指令給了服務器管理員更大的可控性,以控制客戶端不正常的請求行為。這有助於避免某些形式的拒絕服務攻擊。如果正常使用的客戶端得到了服務器的錯誤應答,指出其在請求中發送了過多的頭域,你應該適當地增大此值。例如:
LimitRequestFields 50
3.LimitRequestFieldSize
LimitRequestFieldSize指令用來限制客戶端發送的請求頭的字節數。其語法格式為:LimitRequestFieldsize Bytes,Bytes指定了HTTP請求頭允許的字節大小。默認值為“8190”。
LimitRequestFieldSize指令允許服務器管理員增加,或減少HTTP請求頭域大小的限制。一般來說,服務器需要此值足夠大,以適應普通客戶端的任何請求的頭域大小。一個普通頭域的大小對於不同的客戶端來說是有很大差別的,一般與用戶配置他們的浏覽器以支持更多的內容協議密切相關。
這個指令給了服務器管理員更大的可控性,以控制客戶端不正常的請求行為。這有助於避免某些形式的拒絕服務攻擊。例如:
LimitRequestFieldSize 4094
一般情況下,請不要改變這個設置,而是保持其默認設置。
4.LimitRequestLine
LimitRequestLine指令用來限制接收客戶端發送的HTTP請求行的字節數。其語法格式為:LimitRequestLine Bytes,Bytes將設置HTTP請求行的字節數限制。默認值也為“8190”。
LimitRequestLine指令允許服務器管理員增加或減少客戶端HTTP請求行允許大小的限制。因為請求行包括HTTP方法、URI、協議版本,所以LimitRequestLine指令會限制請求URI的長度。服務器會需要這個值足夠大以裝載它所有的資源名,包括可能在GET請求中所傳遞的查詢部分的所有信息。
這個指令也給了服務器管理員更大的可控性,以控制客戶端不正常的請求行為。這有助於避免某些形式的拒絕服務攻擊。例如:
LimitRequestLine 4094
一般情況下,不需要改變此設置的默認值。
5.RLimitCPU
RLimitCPU指令用來限制Apache子進程派生的進程占用CPU的最大秒數。CPU資源限制表示為每進程占用的秒數。其語法格式為:RLimitCPU seconds|max [seconds|max],默認值未定義,使用操作系統默認值。
第一個參數設置了所有進程的軟資源限制,第二個參數設置了最大資源限制。兩個參數均可設置為一個數值,或是“max”,以表示設置為操作系統允許的最大值。增大此資源限制最大值需要以root運行服務器或是在初始化啟動語句中進行設置。
這個限制將作用於Apache子進程服務的請求所衍生出來的進程,而不是Apache子進程本身。這個范圍包括CGI腳本和SSI執行命令,但不包括所有從Apache父進程衍生出來的進程。比如,管道日志。
6.RLimitMEM
RLimitMEM指令用來限制由Apache子進程派生的進程占用的最大內存字節數。內存資源限制表示為每進程占用的字節數。其語法格式為:RLimitMEM Bytes|max [Bytes|max],也沒有定義默認值,使用操作系統默認值。
第一個參數設置了所有進程的軟資源限制,第二個參數設置了最大資源限制。兩個參數均可設置為一個數值,或是“max”,以表示設置為操作系統允許的最大值。增大此資源限制最大值需要以root運行服務器或是在初始化啟動語句中進行設置。
這個限制將作用於Apache子進程服務的請求所衍生出來的進程,而不是Apache子進程本身。這個范圍包括CGI腳本和SSI執行命令,但不包括所有從Apache父進程衍生出來的進程。比如,管道日志。
7.RLimitNPROC
RLimitNPROC指令用來限制由Apache子進程派生的進程所派生的進程數目。進程限制控制了每個用戶的進程數。其語法格式為:RLimitNPROC number|max [number|max],也沒有定義默認值,使用操作系統默認值。
第一個參數設置了所有進程的軟資源限制,第二個參數設置了最大資源限制。兩個參數均可設置為一個數值,或是“max”,以表示設置為操作系統允許的最大值。增大此資源限制最大值需要以administrator賬戶運行服務器或是在初始化啟動語句中進行設置。
這個限制將作用於Apache子進程服務的請求所衍生出來的進程,而不是Apache子進程本身。這個范圍包括CGI腳本和SSI執行命令,但不包括所有從Apache父進程衍生出來的進程。比如,管道日志。
如果CGI進程不是以Web服務器的uid啟動的,那麼這個指令將限制服務器自己能夠創建的進程數目。此種情況將在error_log中以“cannot fork”進行記錄。
8.ThreadStackSize
ThreadStackSize指令用來處理客戶端連接的線程使用的棧尺寸(字節)。其語法格式為:ThreadStackSize size,在NetWare系統中默認值為65 536;其他系統中等於操作系統默認值。
ThreadStackSize指令設置了處理客戶端連接(包括調用模塊以協助處理)的線程允許使用的最大棧尺寸(字節)。在大多數情況下,操作系統默認的棧尺寸很合理,但是在某些情況下,需要調整這個值。如,在默認棧尺寸較小的平台上(比如HP-UX),Apache可能會在使用一些需要較大棧尺寸的第三方模塊時崩潰。這樣的問題可以通過將ThreadStackSize設置為一個較大的值來解決。這種調整應當僅僅在第三方模塊提供者明確要求的情況下才需要,或者是通過診斷確定是由於棧空間太小而導致崩潰。 而在某些平台上,如果默認的棧空間大於服務器運行所需空間,那麼將ThreadStackSize值降低到小於操作系統默認值可以讓每個進程中允許生成的最大線程數量增加。這種類型的調整應該僅在測試環境中使用,並且對所有服務器進程進行充分的測試,因為處理某些罕見的請求需要較大的棧空間。一個很小的服務器配置變化就有可能使得當前的ThreadStackSize設置變得不合適。