THTTPD CGI 使用手冊
1. THTTPD介紹
thttpd是一個非常小巧的輕量級web server,它非常非常簡單,僅僅提供了HTTP/1.1和簡單的CGI支援,在其官方網站上有一個與其他web server(如Apache, Zeus等)的對比圖+Benchmark,可以參考參考。此外,thttpd 也類似於lighttpd,對於並發請求不使用fork()來派生子進程處理,而是採用多工(Multiplex)技術來實現。因此效能很好。
Thttpd支援多種平台,如FreeBSD, SunOS, Solaris, BSD, Linux, OSF等。對於小型web server而言,速度快似乎是一個代名詞,通過官方站提供的Benchmark,可以這樣認為:thttpd至少和主流的web server一樣快,在高負載下更快,因為其資源佔用小的緣故。
Thttpd還有一個較為令人信服的特點:基於URL的檔案流量限制,這對於下載的流量控制而言是非常方便的。象Apache就必須使用外掛程式實現,效率較thttpd低。
2. CGI介紹
CGI is not a language. It's a simple protocol that can be used to communicate between Web forms and your program. A CGI script can be written in any language that can read STDIN, write to STDOUT, and read environment variables, i.e. virtually any
programming language, including C, Perl, or even shell scripting.
Structure of a CGI Script
Here's the typical sequence of steps for a CGI script:
Read the user's form input.
Do what you want with the data.
Write the HTML response to STDOUT.
具體參考網路文章。CGI Made Really Easyhttp://www.jmarshall.com/easy/cgi/
公用網關介面(CGI)是一種編程標準,它規定了Web伺服器調用其它可執行程式(CGI程式)的介面協議標準。CGI程式通過Web伺服器與運行Web伺服器調用其它可執行程式互動,它接受Web瀏覽器發送給Web伺服器的資訊,並進行處理,然後將結果再送給Web伺服器及Web瀏覽器。CGI程式可以用任何程式設計語言編寫,如Shell、perl、C、Java等,用C語言編寫的CGI程式具有速度快、安全性高等特點。
CGI程式通常用於加入查詢機制、搜尋機制、互動式應用及其它一些應用。 CGI介面標準包括輸入、環境變數、標準輸出三部分,CGI程式可以通過標準輸入stdin)從Web伺服器得到輸入資訊,例如從FORM中得到資料,這就是常用的POST方法。由於不同的作業系統採用了不同的資訊交換器制,其參數傳遞的處理過程也有別,在Unix與DOS中,環境資訊反映著本級程式運行時的某些系統狀況,可用於父序與子程式間的資訊傳遞,CGI正是通過設量環境變數在伺服器與客戶機間傳遞資料的,各作業系統都提供了許多環境變數,它們定義了程式的執行環境,應用程式可以存取它們。Web伺服器和CGI介面也設定了一些環境變數用以傳遞一些重要的參數。CGI程式通過標準輸出(stdout)將輸出資訊傳送給Web伺服器,傳送給伺服器的資訊可以是HTML文本也可以是純文字。本文將利用C語言編寫一個CGI應用程式--學產生績查詢系統,並分析了CGI程式設計的方法、過程、技巧。
3. THTTPD 安裝
1) 下載安裝包thttpd-2.25b.tar.gz
2) tar -xzvf thttpd-2.25b.tar.gz
3) cd thttpd-2.25b
4) ./configure
5) make
6) make install 將thttpd copy到/usr/local/sbin目錄下
7) thttpd 啟動可以採用指令碼方式 thttpd -D -C /home/www/ thttpd.config
8) 指令碼的編寫參考網路文章UseTheThttpdWebserver
THTTPD 支援將配置資訊寫入thttpd可執行檔,此時需要在./configure 添加編譯選項,THTTPD也支援將配置資訊通過執行參數輸入到執行環境。最好用設定檔。
4. 困難
1) chroot
什麼是chroot?chroot基本上重定義了一個程式的運行環境。更確切地說,它重定義了一個程式(或登入工作階段)的"ROOT"目錄或"/"。也就是說,對於chroot了的程式或shell來說,chroot環境之外的目錄是不存在的。
那這樣又有什麼用呢?如果入侵者入侵了你的電腦,他們就不能看見你系統裡所有的檔案了。這樣,就限制了入侵者可能執行的命令,從而禁止了他們溢出不安全檔案的機會。但唯一的缺點是,我認為這不能阻止他們察看網路連接和其他資料。因此,你應做一些本文未深入涉及的事情:
l 保護網路連接埠。
l 察看是否所有的服務都以非root許可權運行。另外,是否所有的服務都進行了chroot?
l 把系統日誌轉移到其他電腦。
l 分析記錄檔。
l 分析那些試圖探測你的電腦的隨機連接埠的人們。
l 限制服務所佔用的cpu和記憶體資源。
Chroot功能保證系統安全性,但是對於CGI程式的執行環境進行限制,比如.c程式必須編譯成-static。而perl 等解釋語言的解譯器同樣必須放在chroot 目錄.下面以sh指令碼解譯器為例說明此解決辦法:
參考 Lightweight Web Serving with thttpd
# cd /home/www
# mkdir bin
# cp /bin/sh bin
# ldd bin/sh
bin/sh:
-ledit.2 => /lib/libedit.so.2
-ltermcap.0 => /lib/libtermcap.so.0
-lc.12 => /lib/libc.so.12
# mkdir lib
# cp /lib/libedit.so.2 lib
# cp /lib/libtermcap.so.0 lib
# cp /lib/libc.so.12 lib
# mkdir libexec
# cp /libexec/ld.elf_so libexec
# chown -R root:wheel bin lib libexec
Depending on the applications you need inside the chroot, things will get more complicated: you may need to create device files, a user database, pipes, and so on.
2) gcc -static 選項
-static
On systems that support dynamic linking, this prevents linking with the shared libraries. On other systems, this option has no effect.
把一些函數都靜態編譯到程式中,而無需動態連結了。
3) thttp.config
# dir=/usr/local/www/
#chroot
#cgipat=/cgi-bin/*
#logfile=/usr/local/www/logs/thttpd_log
#pidfile=/var/run/thttpd.pid
5. Thttpd程式碼分析
核心部分如何將web的get/post與 CGI程式 的stdin 關聯,以及web的內容和stdout關聯。