django + mod_wsgi + virtualenv 注意事項

官網文件寫得滿清楚的, 這裡摘錄重點:
  • 為了避免用到系統裝的 package, 要將 virtualenv 載入的 package 放在 sys.path 前面, 這有幾種解法。
  • 第一種做法是在 apache config 裡寫: WSGIPythonHome /usr/local/pythonenv/BASELINE。BASELINE 是自己建的空 virtualenv。如此一來  mod_wsgi 就不會載入系統裝的 package, 自然沒這問題。
  • 但若 apache 同時用了 mod_python 和 mod_wsgi 的話, WSGIPythonHome 會失效 ( 我之前裝的 ReviewBoard 就是用 mod_python, 不知後來如何)。這裡有一點相關說明。
  • 在沒設 WSGIPythonHome 的情況下, 執行 mod_wsgi 時, sys.path 已載入系統裝的 packages 了。在這種情況下有兩種解法。
  • 若用了 mod_wsgi 2.4 之後的版本, mod_wsgi 有修改 site.addsitedir(), 讓它把 package path 加到 sys.path 的前面, 所以不用多做任何事, 就沒有這個問題。
  • 但是 Ubuntu 8.04 用的是 mod_wsgi 2.0, 所以得採用另一個作法, 也就是官網在 Application Environments 章節最後那段程式, 呼叫 site.addsitedir() 後自己重排 sys.path 內的順序。
  • 另外一點, 若只有一組 virtualenv, Application Environments 和 Process Environments 兩者做一個就行了。前者是在 WSGI  script (也就是 python script) 裡加 site-packages 到 sys.path 裡;後者是用 apache directive 指定 python path。
  • Process Environments 一次設好全部 WSGI application 的 virtualenv。但若有多個 WSGI application 需要不同的 virtualenv, 就得用 Application Environments 的方式各別設定。比方說 project A 用 Django-1.1, project B 用 Django-1.2, 那就得建兩個 virtualenv, 用 Application Environments 的方式各別設。
我最後是用 WSGIPythonHome + Application Environments + Daemon mode 的作法搞定。
附帶一提, 官網說一般情況 embedded mode 效能可能較好 (但官網也說應該差不了多少)。而我選 daemon mode 是因為這樣改程式後要重載入的話, touch WSGI script 即可, 不用 apache reload。

留言

這個網誌中的熱門文章

(C/C++ ) 如何在 Linux 上使用自行編譯的第三方函式庫

熟悉系統工具好處多多

virtualbox 使用 USB 裝置