2012年2月28日 星期二

利用 uWSGI + nginx 搞定 moinmoin 與 bottle.py

之前用 lighttpd 以 FastCGI 方式架 moinmoin wiki,雖然設定上有點麻煩,但還是可以跑,只是最近在同一個 VM 上玩 bottle,雖然試過用 flup 來啟動,但一直沒有成功,連 flup 作者自己都講他討厭 FastCGI

於是就來試試 WSGI 看看,但 lighttpd 對 WSGI 似乎還沒有很完善的支援,乾脆就跳槽到 nginx + uWSGI,試了一下才發現這設定真是簡單到不行,跟當初搞moinmoin 搞到火大的情況完全不同。

不過 Arch Linux 的官方套件庫沒有 uWSGI,必須到 AUR 裡面去找,結果我裝不起來,查資料時意外發現 pypi 裡面有 uWSGI,而且用 virtualenv 裝的起來!只要有裝 gcc 和libxml2,virtualenv 就可以直接編譯 uWSGI 出來用,真是太神奇了!而且 uWSGI 也有支援 virtualenv,只要加上 -H "Venv_dir" 這個選項就能啟用,而 bottle application 也只要在檔案內加上一行


application = bottle.default_app()


就可以跑起來, nginx 設定也很簡單,從官方網站上複製貼上就可以用,moinmoin 的設定更是簡單,只需改一行就OK,只是有些選項搞不太懂意思。

主要由 Running uWSGI behind Nginx 抄來的範例:

# for bottle application
location /bottle {
include uwsgi_params;
uwsgi_param SCRIPT_NAME /bottle;
uwsgi_modifier1 30;
uwsgi_pass localhost:9002;
}


像 SCRIPT_NAME 只有在 wsgiref PEP 333 看到,bottle 開 debug 模式下去看,傳進去的網址跟瀏覽器要求的一樣,只是後端在處理的時候似乎會改變,所以 bottle 會吐錯誤,回報錯誤的網址會改變,不知道能不能設成跟 location 不一樣?

uwsgi_modifier1 就更難找到相關資訊,只知道改另一個數值就跑不起來

目前遇到比較搞不定的是 bottle 原本的 run(reloader=True) 不知道怎麼讓它
重新讀取有修改的檔案,可能要翻一下 bottle 的原始碼看看是怎麼實作的?

Reference: