一、簡介 從Linux2.4.13開始,在Networking options出現了一個試驗性的選項-'[ ] Kernel httpd acceleration (EXPERIMENTAL)',什麼是kHTTPd呢?它是一個Linux環境下的web服務器。kHTTPd和其它web服務器的不同之處在於其是作為內核的一部分運行在Linux的內核中(可以看成是一個設備驅動)。 kHTTPd僅僅處理靜態(基於靜態文件的)的web頁面,而將所有的對於非靜態內容的請求傳遞給正常的運行於用戶空間的web服務器來處理,如apache、Zeus等,而這些運行在用戶空間的web服務器並不需要任何修改。 對於靜態web頁面的http請求的處理不是一個非常復雜過程,但是這卻是web服務中非常重要的一個部分,因為至少網站中大多數圖形都是靜態的,而且還有很多Html文件時靜態的。一個常規的web服務器對於靜態頁面的http請求處理非常簡單,僅僅是拷貝‘文件到網絡‘的簡單操作。如果這些操作在內核中完成將變得非常高效。例如也是完成類似的功能的NFS服務器也是運行在內核中的。 通過在內核中實現web請求處理加速,通常意義的web服務器-如apache等則可以專注於處理那些動態web請求。 注:這裡Apache指代任何一個web服務器。 二、快速入門 1) 編譯並加載模塊 2) 如果需要,通過/proc/sys/net/khttpd來對模塊進行配置 3) echo 1 > /proc/sys/net/khttpd/start 卸載: echo 1 > /proc/sys/net/khttpd/stop echo 1 > /proc/sys/net/khttpd/unload rmmod khttpd 三、配置 1、操作模式 這裡有兩種推薦操作模式: 1) 'Apache' 是主web服務器,kHTTPd是輔助web服務器 clientport -> 80 serverport -> 8080 (or whatever) 2) kHTTPd是主web服務器, 'Apache'是輔助web服務器 clientport -> 8080 (or whatever) serverport -> 80 2、配置kHTTPd 在啟動kHTTPd之前首先需要對它進行配置。這是通過/proc文件系統來進行的,因此可以在腳本中實現自動配置。大多數參數只能在kHTTPd沒有啟動以前才能設置。 一般可以配置以下參數: 1) kHTTPd監聽的服務請求端口 2) 'Apache'監聽的端口(在'localhost'接口中) 3) web文檔root目錄(documentroot) 4) 動態內容的請求所包含的字符串(可選的) [ 默認包括"cgi-bin"] 在這裡指定的documentroot一定要保證和運行在用戶空間的web服務器的documentroot相一致,因為kHTTPd可能會將任何請求重定向給用戶空間的web服務器來處理。 一個典型的腳本(第一種操作模式) #!/bin/sh modprobe khttpd echo 80 > /proc/sys/net/khttpd/clientport echo 8080 > /proc/sys/net/khttpd/serverport echo /var/www > /proc/sys/net/khttpd/documentroot echo PHP3 > /proc/sys/net/khttpd/dynamic echo shtml > /proc/sys/net/khttpd/dynamic echo 1 > /proc/sys/net/khttpd/start 對於第二種操作模式,其典型的腳本如下: #!/bin/sh modprobe khttpd echo 8080 > /proc/sys/net/khttpd/clientport echo 80 > /proc/sys/net/khttpd/serverport echo /var/www > /proc/sys/net/khttpd/documentroot echo php3 > /proc/sys/net/khttpd/dynamic echo shtml > /proc/sys/net/khttpd/dynamic echo 1 > /proc/sys/net/khttpd/start 在這種情況下,你首先需要修改Apache的配置: Port 80 修改為 Port 8080 3、停止kHTTPd 為了修改配置,首先需要停止kHTTPd: #echo 1 > /proc/sys/net/khttpd/stop 如果希望卸載模塊,停止kHTTPd以後,運行: echo 1 > /proc/sys/net/khttpd/unload 如果你感覺對你來說這個過程太慢了(上面的命令需要等待遠程連接首先關閉),可以在停止其停止以後向服務器發送HUP信號,這將導致服務器線程立即停止。 注:如果這些進程沒有被停止,它們會馬上重新啟動。 四、 限制 kHTTPd的安全模式非常嚴格,這是因為有用戶空間的web服務器可以處理復雜的情況: kHTTPd只有在滿足下面的條件才會處理請求: 1) URL中沒有'?' 2) URL以'/'開始 3) URL指定的文件存在 4) 該文件的權限是所有用戶可讀的(*) 5) 文件不是一個目錄,不是可執行文件,沒有sticky位置位(*) 6) URL不包含任何非法子串,如:'..'、'cgi-bin'等(*) 7) 文件的mime類型是可知的(*) 這裡後面標注*的條件是可以通過/proc/sys/net/khttpd來配置的不滿足上面任何條件的請求將被轉交給用戶空間的web服務器來處理。 五、參數 下面的參數可以通過/proc/sys/net/khttpd被配置: 變量名 默認值 含義 serverport 8080 kHTTPd監聽的服務端口 clientport 80 用戶空間的web服務器的監聽端口 threads 2 服務器線程的數量,對於小型web來說應該是每個CPU對應一個,對於大型網站來說(活動文件不是保存在RAM中),其值應該是每個CPU對應2documentroot /var/www web內容所在目錄 start 0 設置為1來啟動kHTTPd (該位可能被'stop'自動設置為0) stop 0 設置為1來停止kHTTPd (該位可能被'start'自動設置為0) unload 0 設置為1來准備卸載kHTTPd模塊 sloppymime 0 如果為1,那麼為止的mime類型自動設置為text/html,如果為0則未知mimi類型的文件將由用戶空間的web服務器來處理 perm_required S_IROTH 需要的最小限制(其值參考'man 2 stat') perm_forbid dir+sticky+ 文件禁止的限制掩碼(其值參考'man 2 stat') dynamic cgi-bin .. 動態內容請求URL包含的子串 maxconnect 1000 當前最大連接數 六、更多信息 關於kHTTPd體系結構的更多信息,參考http://www.fenrus.demon.nl