apache服務器本質上說是一個TCP socket服務,socket模型如下:
下面以worker MPM來說明apache代碼中相應處理的位置在哪里:
(以apache httpd 2.2.23版本的代碼為基礎)
1) 在第一次啟動時驗證配置沒有異常時,創建了socket。
2) open_logs 掛鈎調用了 ap_setup_listeners() ,最終在listen.c的make_socket方法執行了apr_socket_bind/apr_socket_listen,進入通信的環節。
3) worker.c的監聽線程中負責接受請求,然后利用ap_queue_push把相應的請求放入隊列中。下面是接受請求accept_func的調用棧。
4)請求/響應的處理。
請求的處理是通過handler來實現,如果是讀取服務器上的靜態頁面,則由default_handler來處理。同時響應的內容需要通過filter修改之后,最終發送header和body。下面是發送header的調用棧。
暫時寫到這里,以后再繼續分析。