深入Apache229Event模式續

2021-04-20 14:19:59 字數 1417 閱讀 5202

從2.2x開始,apache使用了event模式,在 linux,使用epoll+tcp 延遲觸發事件的方式來提高伺服器的高併發連線下的效能. event模式是在原有的worker模式基礎上改進,因此event模式的引數與worker模式基本一致.

每個程序啟動乙個單獨的處理網路事件的執行緒,叫做

listener_thread;

他負責監控

listen_fd

和其他所有的已經建立連線的

fd的事件,使用

epoll

監孔網路事件

當檢測到

listen_fd

有讀事件(

client

必須有資料傳送)發生時,首先呼叫

accept

函式建立連線,然後觸發工作執行緒去處理網路事件(一般情況下會執行

請求)

工作執行緒平時是使用

ap_queue

佇列處於等待狀態的,由

listen_thread

執行緒觸發(使用

ap_queue_push

觸發),工作執行緒被啟用後,呼叫

process_socket

處理socket

事件,若是資料讀事件,則讀取請求資料,

apache

2.2.9

對連線做了特殊處理,只在有資料傳送的時候才開始建立連線,連線請求才會觸發工作執行緒,即使用了

tcp的乙個選項,叫做延遲接受連線

tcp_defer_accept

,加了這個選項後,若客戶端只進行

tcp連線,不傳送請求,則不會觸發

accept

操作,也就不會觸發工作執行緒去幹活,進行了簡單的防攻擊(

tcp連線)。可以使用

telnet

進行測試驗證:

主機10.2.224.63

為客戶端機器;

10.2.226.7

為apache

伺服器機器

telnet 10.2.226.7 80

然後在10.2.224.63

客戶端機器上使用

netstat

檢視,發現連線已經建立,處於

established

狀態然後再到

apache

伺服器上使用

netstat

檢視,發現是處於

syn_recv

狀態。雖然該模式解決了keepalive問題,即連線數過多問題,但還是有點缺陷,就是若有人故意緩慢傳送請求給apache,還是會占用工作執行緒,因為當有連線上網路事件傳送後,會交給乙個單獨的執行緒處理請求,若請求緩慢傳送的話,工作執行緒就一直被占用了.

另外apache2.2.9版本引入了一條指定執行緒堆疊的指令 threadstacksize , 該指令可以指定工作執行緒的堆疊,避免執行緒過多而耗盡記憶體.

修改apache2 2主頁

方法 一 進入apache的conf目錄 修改httpd.conf 1 找到 documentroot d program files apache software foundation apache2.2 htdocs 這一行,意思是預設專案目錄,修改為自己專案所在目錄 2 改了上面的配置是訪問...

apache2 2 盜鏈問題

先來介紹乙個http請求頭 叫 b referer b 通過下面這句可以取到他的值 code string referer request.getheader referer code referer是幹什麼的呢?referer可簡單的理解為記錄了上乙個頁面的url,直接從url訪問乙個頁面時它的r...

Apache2 2快取配置

參見原文 url mod expires可以減少10 左右的重複請求,讓重複的使用者對指定的頁面請求結果都cache在本地,根本不向伺服器發出請求。loadmodule expires module modules mod expires.so expiresactive on expiresbyt...