1、kHTTPd概述 Linux平台上有很多傳統的Web Server,例如Apache、Zeus等等。由於這些Web Server都不是內核的模塊,處理來自客戶端的HTTP請求的效率必然受到一定的影響。從2.3.** 版本的kernel開始,在內核中引入一個名為kHTTPd的模塊,來處理簡單的HTTP請求。kHTTPd全名為Kernel httpd accelerator,譯為內核httpd加速器。顧名思義,這是內核的一個模塊;可想而知,由於它是內核的一個模塊,處理HTTP請求的速度自然比傳統的Web Server效率要高(為了簡單起見,下文中使用應用最廣泛的Apache來代表傳統的Web Server)。 下面就讓我們一起來感受一下這個加速器的魅力。 2、下載新的內核 你可以從附近的FTP上下載2.3.**或者2.4.**版本的kernel,到筆者寫這篇文章時為止,目前最新的kernel版本是2.4.0test7。如果你實在找不到,就請到這兒來看一看了:ftp://166.111.160.18/pub/kernel/kernel2.4/。(我們下面以2.3.99的kernel為例,如果你怕麻煩,就下載2.3.99的kernel好了。) 下載的新版本的kernel一般都是*.tgz(或者*.tar.gz)文件或者*.tar.bz2文件。你可以首先把新版本的內核(我們以linux-2.3.99pre4-2.tar.bz2為例)拷貝到/usr/src/下面,可以使用下面的命令: cp linux-2.3.99pre4.tar.bz2 /usr/src/ (如果源文件是linux-2.3.99pre4.tgz就不用解釋命令應該如何修改了吧?) 現在先讓我們看一下/usr/src/的內容: cd /usr/src/ ls -l 注意這裡有一個名為linux的符號連接,指向你當前版本的內核源程序的目錄,比如是linux-2.2.14。 bz2文件和tgz(或者tar.gz)文件都是壓縮文件,使用前首先要解壓:tgz(或者tar.gz)文件是使用gzip壓縮的,解壓命令為: tar -xzvf linux-2.3.99pre4.tar.gz bz2文件是使用bzip2壓縮的,解壓命令為: bzip2 -d linux-2.3.99pre4.tar.bz2 tar -xvf linux-2.3.99pre4.tar 現在讓我們再來看一下/usr/src的內容: ls -l 注意現在的linux已經不是一個符號連接了,而是一個目錄,裡面的內容就是我們剛才解開的新版本的kernel的源程序。為了防止再次升級kernel時覆蓋現在的文件,我們也模仿一下原來的目錄結構做點手腳: mv linux linux-2.3.99 ln -s linux-2.3.99 linux 這樣我們就不用擔心現在版本的源程序了,即使你再升級一次內核,也不過重復一次上面的過程,而不會丟失任何內容。 3、編譯內核 由於kHTTPd、IPV6等都是新加入的功能,現在仍處於實驗階段,缺省情況下在編譯內核時是不能選中這些模塊的。使用下面的命令,打開defconfig文件: vi /usr/src/linux/arch/i386/defconfig 找到# CONFIG_EXPERIMENTAL is not set,這一行被注釋掉了,所以在選擇要編譯的模塊時,kHTTpd等實驗內容是灰掉不可選的。在這一行下面增加一行:CONFIG_EXPERIMENTAL=y(如圖1所示),這樣我們就可以選擇kHTTPd等內容了。 圖1 defconfig.jpg 接下來要做一點准備工作,首先使用下面的命令: make menUConfig(或者是make config,不推薦) 如果你可以使用Xwindow,還有更好的選擇: 運行startx命令,在一個xterm下輸入make xconfig(確保路徑為/usr/src/linux),就可以在更加細膩的圖形界面下選擇需要適合自己的模塊(見圖2)。 圖2 xconfig_main.jpg 根據自己的需要選擇適當的內容,注意在Networking options中把khttpd作為模塊選中(見圖3)。 圖3 xconfig_netoption.jpg 然後,執行下面這些命令: make dep make bzImage make modules make modules_install depmod -a (注:如果你使用的是2.4.0-test7版本的kernel,在make modules_install一步時會出現錯誤,原因是你的modutils版本太低,2.4.0-test7的kernel至少需要modutils-2.3.13,把modutils升級一下就好了。) 現在,我們已經編譯好了新的內核,接下來的工作是要讓新內核發揮作用。首先要把bzImage拷貝到/boot/下,bzImage一般是位於/usr/src/linux/arch/i386/boot/,使用下面的命令: cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.3.99 然後修改/etc/lilo.conf文件,仿照下面的內容自己根據需要編寫一段,加入/etc/lilo.conf中: image = /boot/vmlinuz-2.2.14-5.0 root = /dev/hda1 (根據自己的系統可能有所不同) label = linux read-only 加入內容為: image = /boot/vmlinuz-2.3.99 root = /dev/hda1 (根據自己的系統進行適當的修改) label = linux2399 read-only 現在敲入lilo -v,然後重新啟動吧,激動人心的時刻就要來臨了。 4、感受kHTTPd kHTTPd本身的功能並不是十分強大,需要和Apache等傳統的Web Server一起協同工作。推薦的工作模式有兩種: 1. Apache作主Web Server,kHTTPd作輔助 2. kHTTPd作主Web Server,Apache作輔助 如果Apache作主Web Server,可以這樣配置並啟動kHTTPd: #!/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 上面的documentroot要和Apache的設置保持一致。 啟動Apache,在Netscape的URL中鍵入http://localhost/index.html (當然在上面配置的documentroot目錄下面得有這個index.html文件才行)看看效果吧,怎麼樣,kHTTPd發揮作用了!怎麼?你不相信這是kHTTPd的功勞?好,讓我們采用第二種方式,使用kHTTPd作為主Web Server,並且停掉Apache,看看情形如何?配置並啟動的命令如下: #!/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 再次使用Netscape,輸入http://localhost/index.html(當然在上面配置的documentroot目錄下面得有這個index.html文件才行),你看到了什麼?這下你沒話說了吧? 停止kHTTPd的命令是: echo 1 > /proc/sys/net/khttpd/stop 停止kHTTPd之後,你可以將該模塊卸載,命令如下: echo 1 > /proc/sys/net/khttpd/unload 5、kHTTPd的局限 kHTTPd畢竟只是內核的一個小模塊,功能上有很多局限。它只能處理以下內容: 1. URL中不包含"?" 2. URL以"/"開始 3. URL中指明的文件存在 4. URL中指明的文件可以讀取 5. URL中指明的文件不是目錄,沒有設置粘滯鍵,不能執行 6. URL中不包含任何".."之類可隱藏的字符串 7. 客戶端請求的mime-type是已知的 可以想象,kHTTPd對於CGI、ASP等等需要執行或者解釋的腳本是無能為力的,實際上kHTTPd並不真正處理這些請求,這需要Apache來解決了。 6、kHTTPd參數列表及其說明 kHTTPd所有的參數都可以通過/proc/sys/net/khttpd進行設置,完成的參數列表如下: 參數名 缺省值 說明 serverport 8080 KHTTPd監聽的端口 clientport 80 其它Web Server使用的端口 threads 2 服務器線程的個數 documentroot /var/www 文檔路徑 start 0 該值設置為1,啟動kHTTPd stop 0 該值設置為1,停止kHTTPd unload 0 該值設置為1,卸載kHTTPd模塊 sloppymime 0 如果該值設置為1,那麼不能識別的mime-type都認為是text/html;如果該值設置為0,那麼不能識別的mime-type由其它Web Server處理 perm_required S_IROTH S_IROTH 最小要求許可 perm_forbid dir+sticky+execute 禁止權限掩碼 dynamic cgi-bin .. 如果URL中包含動態內容,就說明為"dynamic content" maxconnect 1000 當前最大連接數