2013年09月14日 ? 綜合 ? 共 3216字? 字型大小 ? 評論關閉

    THTTPD CGI 使用手冊
1. THTTPD介紹
thttpd是一個非常小巧的輕量級webserver,它非常非常簡單,僅僅提供了HTTP/1.1和簡單的CGI支持,在其官方網站上有一個與其他web server(如Apache,Zeus等)的對比圖+Benchmark,可以參考參考。此外,thttpd也類似於lighttpd,對於並發請求不使用fork()來派生子進程處理,而是採用多路復用(Multiplex)技術來實現。因此效能很好。
Thttpd支持多種平台,如FreeBSD, SunOS, Solaris, BSD, Linux, OSF等。對於小型webserver而言,速度快似乎是一個代名詞,通過官方站提供的Benchmark,可以這樣認為:thttpd至少和主流的webserver一樣快,在高負載下更快,因為其資源佔用小的緣故。
Thttpd還有一個較為引人注目的特點:基於URL的文件流量限制,這對於下載的流量控制而言是非常方便的。象Apache就必須使用插件實現,效率較thttpd低。
2. CGI介紹
   CGI is not a language. It's a simple protocol that can beused to communicate between Web forms and your program. A CGI script can be written in any language that can read STDIN, write to STDOUT, andread 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 willget more complicated: you may need to create device files, a userdatabase, 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關聯。

12-28 16:54