我想不出題目,用關鍵字當題目好了

組態 FastCGI 是好幾年前的事了。前一陣子為了測試某個 hosting 的 fastcgi 功能,再花了一番功夫研究 apache 和 fastcgi 的配合,算是又複習了回來。不過,今天要再作一次遷移工作時,程序還是忘記了 @_@

我決定把步驟寫下來,之後還要用的呢。

Python 的部分

我要玩的是 Django,所以要先搞定 Python。在 web 環境下設定 scripting 的路徑是很重要的事,過去,我們得設一些 *PATH 環境變數,但現在我們有了新武器。EasyInstall 除了提供 easy_install.py 工具,讓人可以自動從網路 (cheeseshop) 下載套件並安裝之外,還有個 virtual-python.py 給我們用。

virtual-python.py 會用 symlink 把 Python runtime 結構包裝起來,所以我們就有了一個自訂的 Python library 結構,不必再設 PYTHONPATH 了。不過,因為用了 symlink,所以 Windows 下不能用! (也還好,我們在 Windows 下通常都是用 sys.path.insert(0, 'blah.char') 來解決程式庫路徑問題的。) 用法很簡單:

$ apt-get install wget
$ wget http://peak.telecommunity.com/dist/virtual-python.py
$ /path/to/original/python virtual-python.py --prefix=/path/to/new/python

然後再把 setuptools 搞進來:

$ wget http://peak.telecommunity.com/dist/ez_setup.py
$ /path/to/new/python ez_setup.py

OK!Python 會動了。現在我們來裝 Django 要用的 fastcgi wrapper:

$ /path/to/new/python/script_dir/easy_install flup

噗噗噗地裝完了。

那 Django 呢?用 svn trunk 就好了,穩得很:

$ apt-get install subversion
$ svn http://code.djangoproject.com/svn/django/trunk /path/to/Django

接著下載/安裝要用到的 app、建目錄、設權限等等工作就不講了。Python 的整備工作至此告一段落。

Apache 的部分

apache/apache2 都支援 fastcgi,在 Debian 下只要安裝幾個套件就會有 apache+fastcgi:

$ apt-get install apache2 apache2-mod-fastcgi

我們有了 fastcgi module,然後要弄一個開 fastcgi 的 vhost,組態檔這樣寫:

<VirtualHost host_ip:host_port>
    ServerAdmin root@some.site
    ServerName some.site

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    ErrorLog /var/log/apache2/some.site-error.log
    CustomLog /var/log/apache2/some.site-access.log combined

    ServerSignature Off
    RewriteEngine On

    DocumentRoot /var/www/some.site

    <Directory /var/www/some.site>
        Options +ExecCGI -Indexes
        #SetHandler fastcgi-script
        AddHandler fastcgi-script fcgi
    </Directory>

    <Location />
        Order deny,allow
        Allow from all
    </Location>

    RewriteEngine On
    RewriteRule ^/(media/.*)$ - [L]
    Alias /media/ /path/to/some.site/localsite/media/
    RewriteRule ^(.*)$ /root.fcgi$1 [QSA,L]

</VirtualHost>

# vim: set nu ft=conf:

當然,可別忘了 a2enmod rewrite; a2enmod fastcgi; /etc/init.d/apache2 restart 喔。

FastCGI driver script

這個是重點,不小心寫錯的話 apache2/python 就只會吐一行錯誤訊息,除錯很痛苦。為了減輕除錯的難度,我們要請 Python 的 traceback 模組來幫忙:

#!/path/to/new/python

import sys, os
import traceback

try:
    sys.path.insert(0, '/path/to/Django' )
    sys.path.insert(0, '/path/to/your/app' )
    sys.path.insert(0, '/path/to/your/localsite' )

    os.environ['DJANGO_SETTINGS_MODULE'] = 'localsite.settings'

    from django.core.servers.fastcgi import runfastcgi
    runfastcgi([ "method=threaded", "daemonize=false" ])
except Exception, e:
    f = open('/tmp/some.debug.file', 'w')
    traceback.print_exc( file=f )
    f.close()

# vim: set ai et nu sw=4 ts=4 tw=79:

如果連 import 都會錯的話,八成是你的 Python bin 指定錯誤,不然 traceback 會被存到 /tmp/some.debug.file (當然,shared hosting 的話,把 debug 檔改到別的地方吧 ;),方便你除錯。

收工

洗澡去。

Posted by yungyuc at 21:32, 0 comment, 0 trackback.
Navigate
Add a trackback
Add a comment

Your name. (required)

Your personal website. (optional)

Your email address. Will not show in page. (suggested, but optional)

Text format is "Plain Text".

Enter "xIKQc"
© hover year to navigate month: powered by django