HDEラボの桜井です。
最近は新型インフルエンザによるパンデミックが気になっています。
今日は、TwistedでCGIが動くWebサーバを書いてみます。
まず、仕様を簡単に説明します。
では、さっそくソースを見てみましょう。
最近は新型インフルエンザによるパンデミックが気になっています。
今日は、TwistedでCGIが動くWebサーバを書いてみます。
まず、仕様を簡単に説明します。
- TCP:48080ポートで稼働
- 動作するサーバの"cgi"ディレクトリでCGIプログラムが動作
- 画像は動作するサーバの"image"ディレクトリで"image"というURLで公開
- CGIプログラムの他にPHPも動作させてみる
では、さっそくソースを見てみましょう。
サーバのファイル名は、「TestWebServer.tac」とします。
このデーモンを動作させるためには、下記のようにします。
停止させる場合は、下記のようにします。
ここで、注意点をひとつ。
PHPを動作させる場合、php.iniに下記の記述を追加する必要があります。
from twisted.application import internet, service
from twisted.web import error, server, twcgi, static
cgi_path = './cgi'
image_path = './image'
port = 48080
# ディレクトリにファイルがない場合、ディレクトリ一覧を表示しない
class NoDirectoryListFile(static.File):
def directoryListing(self):
return error.ForbiddenResource()
# PHP5が動作するように
class PHP5Script(twcgi.PHPScript):
filter = '/usr/bin/php-cgi'
res = static.File(cgi_path)
# 画像表示用のサブディレクトリ
res.putChild('image', NoDirectoryListFile(image_path))
# ファイル名を指定しない場合、index.cgiを実行するように設定
res.indexNames = ['index.cgi', 'index.html']
# .cgiはCGIプログラムとして、.phpはPHPプログラムとして動作するように設定
res.processors = {'.cgi': twcgi.CGIScript, '.php': PHP5Script}
site = server.Site(res)
# デーモンとして起動
myServer = internet.TCPServer(port, site)
application = service.Application('cgi_httpd')
myServer.setServiceParent(application)
このデーモンを動作させるためには、下記のようにします。
$ twistd -oy TestWebServer.tac
停止させる場合は、下記のようにします。
$ kill `cat twistd.pid`
ここで、注意点をひとつ。
PHPを動作させる場合、php.iniに下記の記述を追加する必要があります。
cgi.force_redirect = 0




Leave a comment