2009/07/30
書いたといっても結構前からあったのですが、いらん所を削ぎ落として軽量Webサーバとして仕立て上げました。
軽量とは言えど、CGIを使って結構色々動きます。
例えば、ソースアーカイブを解凍したらCGIがあって、apacheから見える場所にコピーして...とか面倒くさかったりしますよね。
おれは今すぐWebサーバを起動したいんだ!そして今いるディレクトリのファイルをWebサーバからサーブしたいんだー!
って事ないですか?blogソフトウェアをダウンロードして今すぐ試したいけど、apacheインストールされてなかった...とか悲しすぎます。
今回紹介する"tinytinyhttpd"(tthttpd)はそんな、小さい様で大きな問題を解決出来るかもしれないソフトウェアです。
mattn's tinytinyhttpd at master - GitHub
tiny tiny httpd
http://github.com/mattn/tinytinyhttpd/tree/master
リンク先に、動いてる様子のキャプチャがあります。
ソースはC++で書いてます。WindowsとUNIX(Linuxでだけ動作確認)で動作します。
機能としては、マルチスレッドサーバ、カスタマイズ、ディレクトリスティング、CGI起動が可能です。
小ささをウリにしているのでインストールとか、レジストリとか、面倒くさいものは要りません。exeファイルだけあれば起動します。
一応、設定ファイルの記述も可能で
[global]
port= 8080
root= c:/temp/mtos
indexpages= index.html,index.php
charset= cp932
[mime/types]
cgi= @c:/strawberry/perl/bin/perl.exe
php= @c:/progra~1/php/php-cgi.exe
という設定ファイルを"-c"オプションで指定する事も出来ます。デフォルトではポート8080番でカレントディレクトリをドキュメントルートとし、phpとperlが適当なパスでCGI起動される様になっています(パスが違う場合は設定ファイルから変更出来ますし、拡張子rbに対してrubyを追加する事も出来ます)。
私が試した限りですが、以下のソフトウェアの動作が確認出来ています。
MTOS(Movable Type Open Source) (perl)
WordPress (php)
blogn Plus (php)
tDiary (ruby)
PukiWiki (php)
NucreusCMS (php)
blosxom (perl)
などなど。CGIで動くならば大体動きます。
ライセンスはBSDライセンスとします。使ってみて下さい。
コードはgithubにあるので、patchウェルカムです。
今後は、コードのブラッシュアップと、拡張なんかを考えて行きたいなーと思ってます。
Posted at
00:06
in
ソフトウェア::lang::c
|
WriteBacks (23)
|
Edit
Tagged as:
c++ ,
httpd
Bookmarks:
|
|
|
|
|
|
View the discussion thread.
blog comments powered by
動かしてみました。
こんにちは。 Ubuntu 9.04 64bit でコンパイルして動かしてみました。 コンパイル時に以下のようなエラーがでました。 utils.cxx: In function ‘std::string tthttpd::convert_string(std::string, std::string, std::string)’: utils.cxx:522: error: ‘MB_LEN_MAX’ was not declared in this scope make: *** [utils.o] エラー 1 utils.cxxに #include を書き加えて対応しました。 perlがcgiとして軽快に動くのを確認しました。 ところでCで書いたcgiを動かしてみましたが、画面がまったく表示されません。エラーも出ず、画面が真っ白になります。my_httpd.confは以下のようにしてます。 ----- port=8080 root=/var/www indexpages=index.html,index.php charset=utf-8 [mime/types] cgi=@ pl=@/usr/bin/perl php=@/usr/bin/php ----- どうすればCのcgiが教えていただけませんか?
すいません。 先のコメントでinclude部分が消えてしまいました。 正しくは #include <limits.h> です。
Re: 動かしてみました。
limits.h の件ありがとうございました。 Cで書かれたCGIの件ですが、現状拡張子に対するインタプリタの起動しかサポートしておりませんでしたので、新しくオプション"spawnexec"を追加し、execビットの立っているファイルをCGIとして実行する要修正しました。 ありがとうございました。
早速のご返事・対応ありがとうございます。また、先の質問で日本語がおかしな箇所がありました。お詫びいたします。 新たにソースをダウンロードし直してコンパイルし、実行してみました。 今度はindexpagesで指定してあるindex.htmlを読み込んだまま処理が戻って来なくなってしまいました。URLを直接を打ち込んでも読み込みに行ったまま返って来ません。念のため前回の版で試したところ、正常に表示されます。今回の修正で別の不具合が発生している可能性がないでしょうか?
[c++][starbug1] Re: C++で軽量Webサーバ書いた。
すばらしい。 書いたといっても結構前からあったのですが、いらん所を削ぎ落として軽量Webサーバとして仕立て上げました。 軽量とは言えど、CGIを使って結構色々動きます。 Big Sky :: C++で軽量Webサーバ書いた。 mattnさんがC++で書いた軽量Webサーバを公開されていました
Re:
すみません。ご指摘のとおり、バグ混入しました。確認して修正させて頂きました。
ありがとうございます。動きました。
素早い対応ありがとうございます。 新しいソースをダウンロード、コンパイルして動かしてみました。 Cで書いたcgiが綺麗に動作しました。 ありがとうございました。 疑問点あります。HTMLに以下のように書かれている場合正常に動作しますが、 <html> …省略… <form action="/cgi-bin/a.cgi" method="POST"> <input type="submit" value="CGI表示"> </form> …省略… 以下のようにJavascript経由だとアクセスに行ったまま返って来ません。 <html> …省略… <script type="text/javascript"> …省略… function go_aview() { var f0 = document.sendf; f0.method = "POST"; f0.action = "/cgi-bin/a.cgi"; f0.submit(); } …省略… </script> …省略… <form name="sendf"> <input type="button" value="CGI表示" onClick="go_aview()"> </form> …省略… ブラウザは内部で同じ処理を実行している筈ですが、どういう訳かJavascript経由では正常に表示しません。ちなみにブラウザはFirefox3.0.12(Ubuntu物64bit)です。 これはtthttpdの処理がJavascript経由だけ対応していないということなのでしょうか?できたらJavascript経由でも動いて欲しいのですが…。
Re:
Windowsですが、↑のサンプルが動作しています。 お手数ですが再現するファイルを頂いてもよろしいでしょうか?
失礼しました
失礼しました。先に上げた例は正常に動作します。見誤っておりました。 動作しないパターンは以下の通りになります。 よろしくお願い致します。 <html lang="ja"> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <script type="text/javascript"> <!-- function go_aview() { var f0 = document.sendf; f0.method = "POST"; f0.action = "/cgi-bin/a.cgi"; f0.submit(); } function go_aview2(no) { var f0 = document.sendf; f0.method = "POST"; /*GETにしても症状は同じ*/ f0.action = "/cgi-bin/a.cgi&no=" + no; f0.submit(); } //--> </script> <body> <form name="sendf"> <input type="button" value="CGI成功" onClick="go_aview()"> <input type="button" value="CGI失敗" onClick="go_aview2('9')"> </form> </body> </html>
ごめんなさい。また間違えました。
HTMLの一部に書き違いがありました。たびたび申し訳ありません。正しくは以下です。 <html lang="ja"> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <script type="text/javascript"> <!-- function go_aview() { var f0 = document.sendf; f0.method = "POST"; f0.action = "/cgi-bin/a.cgi"; f0.submit(); } function go_aview2(no) { var f0 = document.sendf; f0.method = "POST"; /*GETにしても症状は同じ*/ f0.action = "/cgi-bin/a.cgi?no=" + no; f0.submit(); } //--> </script> <body> <form name="sendf"> <input type="button" value="CGI成功" onClick="go_aview()"> <input type="button" value="CGI失敗" onClick="go_aview2('9')"> </form> </body> </html>
Re:
ありがとうございます。 こうではないかな...と思う部分を修正しました。おそらくcgiの起動フォルダを間違って設定してしまっていたようです。
0.0.3を動かしてみました。
素早い対応をありがとうございます。 0.0.3のソースをダウンロード・コンパイルして動作させてみました。 しかし、今度は「CGI成功」の処理まで返って来なくなりました。 mattnさん(この上のコメントはmattnさん以外の第三者なのかも知れませんが…)のところでは正常に動作しているのでしょうか?その場合、私の環境に問題がある筈なので再度検証してみたいと思います。 貼り付け忘れましたが上記HTMLで動作検証に利用している a.cgi は以下の通りです。 #!/usr/bin/perl print "Content-type: text/html\n"; print "\n"; read(STDIN, $data, $ENV{'CONTENT_LENGTH'}); print "Hi!"; print "REQUEST_METHOD : $ENV{'REQUEST_METHOD'}\n"; print "QUERY_STRING : $ENV{'QUERY_STRING'}\n"; print "CONTENT_LENGTH : $ENV{'CONTENT_LENGTH'}\n"; print "DATA : $data\n"; そして現在のテスト用index.htmlは以下のように hidden の値も加えました。 <html lang="ja"> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <script type="text/javascript"> <!-- function go_aview() { var f0 = document.sendf; f0.method = "POST"; f0.action = "/cgi-bin/a.cgi"; f0.submit(); } function go_aview2(no) { var f0 = document.sendf; f0.method = "POST"; f0.action = "/cgi-bin/a.cgi?no=" + no; f0.submit(); } //--> </script> <body> <form name="sendf"> <input type="hidden" name="namae" value="oyaji"><!--1行追加 --> <input type="button" value="CGI成功" onClick="go_aview()"> <input type="button" value="CGI失敗" onClick="go_aview2('9')"> </form> </body> </html>
追加で。
上記検証用環境の「CGI失敗」をApache 2.2で動作させると以下のような結果が表示されます。 Hi! REQUEST_METHOD : POST QUERY_STRING : no=9 CONTENT_LENGTH : 11 DATA : namae=oyaji
[c++][starbug1] tthttpd でStarbug1を動かした
昨日の続き mattnさんが公開したtthttpdでStarbug1を動かそうとしています。問題を報告した日に、早速修正してもらいました。mattnさん、ありがとうございます。 それで動かしてみたんですが、なんか動かない。昨日の問題は解決していたんですが、CのCGIを動かすには、まだ
デートクラブ・デリヘル・オナクラ・交際クラブ【素人自画撮りエロ写メ画像投稿掲示板】
デートクラブ・デリヘル・オナクラ・交際クラブ【素人自画撮りエロ写メ画像投稿掲示板】
Re:
oyajiさん 不具合と思われる箇所を修正させて頂きました。ご確認下さい。
mattnさん対応ありがとうございます。 ソース0.0.4を落として試してみました。 先の検証用環境で実行したところ「CGI成功」は綺麗に動きました。 「CGI失敗」はボタンクリック後、ブラウザが以下のようなURLを指し示しました。 http://localhost:8080/cgi-bin/w/cgi-bin/a.cgi (そのままではpostできないので/は/に変更してます) 上記のようなパスは存在しないので「ファイルが見つかりませんでした」とブラウザに表示されて終了します。 mattnさんの環境では正しく動くのでしょうか?
Re:
すみません。原因が分かりました。 0.0.4a で確認してください。
完動で画面が見えません。
0.0.4bが最新のようなのでbを落として試してみました。 まず、コンパイルが通りませんでした。 $make g++ -Wall -c -DHAVE_SETRESUID main.cxx g++ -Wall -c -DHAVE_SETRESUID httpd.cxx httpd.cxx:92: error: expected ‘,’ or ‘...’ before ‘*’ token httpd.cxx:92: error: ISO C++ forbids declaration of ‘FILETIME’ with no type httpd.cxx: In function ‘bool tthttpd::filetime2unixtime(int)’: httpd.cxx:93: error: expected `;' before ‘lt’ httpd.cxx:93: 警告: statement has no effect httpd.cxx:94: error: ‘SYSTEMTIME’ was not declared in this scope httpd.cxx:94: error: expected `;' before ‘st’ httpd.cxx:96: error: ‘ft’ was not declared in this scope httpd.cxx:96: error: ‘lt’ was not declared in this scope httpd.cxx:96: error: ‘FileTimeToLocalFileTime’ was not declared in this scope httpd.cxx:97: error: ‘lt’ was not declared in this scope httpd.cxx:97: error: ‘st’ was not declared in this scope httpd.cxx:97: error: ‘FileTimeToSystemTime’ was not declared in this scope httpd.cxx:98: error: expected primary-expression before ‘,’ token httpd.cxx:99: error: expected unqualified-id before ‘->’ token httpd.cxx:100: error: expected unqualified-id before ‘->’ token httpd.cxx:101: error: expected unqualified-id before ‘->’ token httpd.cxx:102: error: expected unqualified-id before ‘->’ token httpd.cxx:103: error: expected unqualified-id before ‘->’ token httpd.cxx:104: error: expected unqualified-id before ‘->’ token httpd.cxx: In function ‘void* tthttpd::response_thread(void*)’: httpd.cxx:1233: 警告: format ‘%u’ expects type ‘unsigned int’, but argument 3 has type ‘size_t’ httpd.cxx: At global scope: httpd.cxx:92: 警告: ‘bool tthttpd::filetime2unixtime(int)’ defined but not used make: *** [httpd.o] エラー 1 調べたところ、ソースのエラー部分に使われている、FILETIME,SYSTEMTIME,FileTimeToSystemTime,FileTimeToLocalFileTime はWindows専用の関数および型のようです。Linuxでは存在しません。 そこで対象のfiletime2unixtime(...)関数を #ifdef _WIN32...#endif のコメントで囲い、無効にしました。するとコンパイルは通りました。 そして動作させると、感動的なくらい綺麗に動きました。 もちろんCのcgiもなんの遜色もなく素直に動きました。 mattnさんありがとうございました!! 軽量で手間が少なくcgiが完動するアプリを随分探していたので、ガシガシ使わせて頂きます。 今後益々のご発展をお祈りしております。 本当にありがとうございました。
Re:
いえ、こちらこそ。お付き合い頂いてありがとうございました。 windowsでしかコンパイル出来ない件は修正しておきます。
池袋 出会い喫茶 横浜 ナビ
池袋 出会い喫茶 横浜 ナビ
デートクラブ・デリヘル・オナクラ・交際クラブ【素人自画撮りエロ写メ画像投稿掲示板】
デートクラブ・デリヘル・オナクラ・交際クラブ【素人自画撮りエロ写メ画像投稿掲示板】
レジストリ 復元
レジストリ 復元についての情報です。
writeback message: Ready to post a comment.