一、簡介
從linux2.4.13開始,在Networking options出現了一個試驗性的選項-"[ ] Kernel httpd aclearcase/" target="_blank" >cceleration (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對應2
documentroot /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體系結構的更多信息,參考