本文透過狀態機視角,詳細剖析 Lighttpd 處理靜態頁面請求的完整流程(核心插件 mod_staticfile 為預設載入)。

記錄連接建立時間等標記,進入 READ 狀態從連接讀取 HTTP Headers 存入 con->request.request。可能需多次讀取,狀態保持 READ 直到讀完,轉入 CON_STATE_REQUEST_END。
核心呼叫 http_request_parse 解析 Request:
http_method、http_version、urirequest.headers(array of data_string)CON_STATE_READ_POST,否則進入 CON_STATE_HANDLE_REQUEST邏輯與 READ 類似,但 connection_handle_read_state 後段分流。<64KB 存 buffer,>64KB 存臨時文件,每文件 1MB。POST 數據存入 request_content_queue(chunkqueue 鏈表),chunk 結構支援記憶體 (MEM_CHUNK) 與文件 (FILE_CHUNK + mmap) 兩種存儲,unused 棧池化管理提升效率。
呼叫 http_response_prepare(response.c),此函數為服務器與插件系統交互核心,密集呼叫 plugins_call_handle_xxxx 接口。流程:
若無插件接管且模式為 DIRECT,靜態文件檢查:stat_cache_get_entry 確認文件存在,否則嘗試 PATHINFO。最終若仍無插件處理,依方法設置狀態碼(OPTIONS→200,其他→403)。
| 接口 | 觸發時機 | 典型應用 |
|---|---|---|
| handle_uri_raw | 獲取原始 URL(未解碼,無 query) | Proxy 轉發 |
| handle_uri_clean | URL 解碼後 | Proxy 轉發 |
| handle_docroot | 設置文檔根目錄 | 虛擬主機 |
| handle_physical | 獲得物理路徑後 | 靜態文件、重寫 |
| handle_subrequest_start | 子請求開始 | FastCGI、CGI |
| handle_subrequest | 子請求處理 | 動態內容生成 |
處理完成進入 CON_STATE_RESPONSE_START,準備響應頭與寫入數據(下文續述)。