組態 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 檔改到別的地方吧 ;),方便你除錯。
收工
洗澡去。
- Previous: GVim plugin helpfile @2007/04/18
- Next: 新生的 screenrc @2007/04/25
Please send trackback to: http://blog.seety.org/everydaywork/2007/4/23/668/trackback/.