從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...