Ubuntu Oneiric + nginx + uwsgi + moin
インストール
nginx は PPA から入れる。
$ sudo -s # nginx=stable # add-apt-repository ppa:nginx/$nginx # apt-get update # apt-get install nginx
uwsgi 関連もインストール。
# apt-get install uwsgi uwsgi-plugin-python
バージョン確認。
# nginx -v nginx version: nginx/1.0.11 # uwsgi --version uWSGI 0.9.8.1-debian # python -V Python 2.7.2+
hello world!
helloworld してみる。 /etc/nginx/sites-available/default を以下のように設定、テスト。
# vi /etc/nginx/sites-available/default
server { server_name localhost; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:9090; } }
# /etc/init.d/nginx configtest
Testing nginx configuration: nginx.
一般ユーザに戻って /home/hoge/code/python/hello.py (どこでも可)を作る。
def application(environ, start_response): status = '200 OK' output = 'Hello World!' headers = [("Content-Type", "text/plain")] start_response(status, headers) return [output]
uwsgi_python コマンドを走らせる。 uwsgi_python は uwsgi --plugins python するのと同じ?
$ sudo /etc/init.d/nginx start $ uwsgi_python -s :9090 --pp /home/hoge/code/python --file hello.py
で、ウェブブラウザで該当ホストを開いて "Hello World!" と表示されたら成功。
MoinMoin その1 : コマンドラインでテスト
pip の moin-1.9.2 を入れると /usr/local/share/moin に素材が入るので、運用ディレクトリにいろいろコピー。
$ sudo pip install moin $ pip uninstall moin # ファイルリストの確認のみ Uninstalling moin: /usr/local/bin/moin /usr/local/lib/python2.7/dist-packages/MoinMoin /usr/local/lib/python2.7/dist-packages/jabberbot /usr/local/lib/python2.7/dist-packages/moin-1.9.2.egg-info /usr/local/share/moin Proceed (y/n)? n $ mkdir -p ~/.moin/{config,server} $ cp -a /usr/local/share/moin/server/{test,moin}.wsgi ~/.moin/server
ここでさっきと同じようにテスト。
$ uwsgi_python -s :9090 --pp /home/hoge/.moin/server --file test.wsgi
WSGI test script is working! という画面が出たら成功。
さらに moin をざっくり設定。
$ cp -a /usr/local/share/moin/config/wikifarm/farmconfig.py ~/.moin/config $ cp -a /usr/local/share/moin/config/wikifarm/mywiki.py ~/.moin/config/test.py $ cp -a /usr/local/share/moin/data ~/.moin/data_test $ cp -a /usr/local/share/moin/underlay ~/.moin/underlay_192 $ chmod -R o+w ~/.moin/underlay_192
config/farmconfig.py
... wikis = [ # wikiname, url regular expression # --------------------------------------------------------------- ("sandbox", r"^https?://localhost/.*$"), ] ... data_underlay_dir = '/home/hoge/.moin/underlay_192'
config/test.py
... class Config(FarmConfig): # basic options (you normally need to change these) sitename = u'MoinTest' # [Unicode] interwikiname = u'MoinTest' # [Unicode] # name of entry page / front page [Unicode], choose one of those: # a) if most wiki content is in a single language #page_front_page = u"MyStartingPage" # b) if wiki content is maintained in many languages page_front_page = u"FrontPage" data_dir = '/home/hoge/.moin/data_test/'
server/moin.wsgi
sys.path.insert(0, '/home/hoge/.moin/config')
またコマンドでテスト。 --pythonpath で設定ファイルのディレクトリを指定。
$ uwsgi_python -s :9090 \ > --pp /home/hoge/.moin/config \ > --file ~/.moin/server/moin.wsgi \ > -M -p 4 # マスタープロセスとワーカー4つを付けてみる
これで MoinMoin の画面が出たらOK。
MoinMoin その2 : upstart で起動
こんどはサーバの起動過程に組み込む。今さらながら virtualenv などもする。
HowTo/UbuntuQuick 6. Nginx Installation - MoinMoin
$ sudo pip virtualenv $ cd ~/.moin $ virtualenv testenv $ source testenv/bin/activate (testenv)$ pip install moin (testenv)$ deactivate $ mkdir run $ chmod -R o-w underlay_192 $ sudo chown -R www-data:www-data {data_test,run,underlay_192}
実行プロセスに合わせて chown www-data:www-data してるのはこれまでの行きがかりから手間を省いてしまった処理。実用では /srv/ 以下などに環境を作る。
wsgi ファイルに実行環境のライブラリパスを追加。
$ vi server/moin.wsgi
sys.path.insert(0, '/home/hoge/.moin/testenv/lib/python2.7/site-packages/')
uwsgi のオプション設定ファイル(コマンドラインオプションと XML のほかに環境変数、ini、yaml、LDAPでも設定できるらしい)。
$ vi ./uwsgi.xml
<uwsgi> <uid>www-data</uid> <gid>www-data</gid> <plugin>python</plugin> <socket>/home/hoge/.moin/run/moin.sock</socket> <wsgi-file>/home/hoge/.moin/server/moin.wsgi</wsgi-file> <limit-as>256</limit-as> <processes>4</processes> <master/> <logto>/var/log/uwsgi/uwsgi.log</logto> <memory-report/> <vhost/> <no-site/> </uwsgi>
upstart の設定ファイル。
$ sudo vi /etc/init/moin.conf
description "moin uwsgi service" start on runlevel [2345] stop on runlevel [!2345] chdir /home/hoge/.moin/ exec /usr/bin/uwsgi --plugins python --xml /home/hoge/.moin/uwsgi.xml respawn
$ sudo start moin moin start/running, process 2162
nginx の設定も。
$ sudo /etc/nginx/sites-available/default
server { server_name localhost; location /wiki { # /wiki にマウントしてみる include uwsgi_params; #uwsgi_pass 127.0.0.1:9090; uwsgi_param SCRIPT_NAME /wiki; uwsgi_pass unix:///home/hoge/.moin/run/moin.sock; uwsgi_modifier1 30; } location /moin_static192 { root /home/hoge/.moin/static; index index.html index.htm; } }
apache2 は off 。
$ sysv-rc-conf --list apache2 apache2 0:off 1:off 2:on 3:on 4:on 5:on 6:off $ sudo sysv-rc-conf apache2 off $ sysv-rc-conf --list apache2 apache2 0:off 1:off 2:off 3:off 4:off 5:off 6:off
ここで nginx の location ディレクティブの挙動がちょっとひっかかって、例えば
http://example.jp/moin_static192/index.html
へのリクエストに対して次の静的ファイル
/home/hoge/.moin/static/moin_static192/index.html
を返してほしい場合、 /moin_static の root は /home/hoge/.moin/static としてやる。
「example.jp/moin_static192/ というリクエストがあった場合の / (=root) はここですよ、という指定」だと考えれば理解できるところだけど、そのうちきちんと確認する。
とりあえずここまで*1。
おまけ: uwsgi 設定スタイルメモ
上で使ったXML形式の設定を他形式で。ini, yaml, json は真偽値の設定に対して 1 (以上の整数値)でも true でも渡せるらしい。 yaml と json は pythonpath みたいなものに配列で渡せるとか。
コマンドライン
uwsgi \ --uid www-data \ --gid www-data \ --plugins python \ --socket /home/hoge/.moin/run/moin.sock \ --wsgi-file /home/hoge/.moin/server/moin.wsgi \ --limit-as 256 \ -p 4 \ -M \ --logto /var/log/uwsgi/uwsgi.log \ --memory-report \ --vhost \ --no-site uwsgi --ini uwsgi.ini uwsgi --yaml uwsgi.yaml uwsgi --json uwsgi.json
[uwsgi] uid = www-data gid = www-data plugins = python socket = /home/hoge/.moin/run/moin.sock wsgi-file = /home/hoge/.moin/server/moin.wsgi limit-as = 256 processes = 4 master = true logto = /var/log/uwsgi/uwsgi.log memory-report = true vhost = true no-site = true
uwsgi: uid: www-data gid: www-data plugins: python socket: /home/hoge/.moin/run/moin.sock wsgi-file: /home/hoge/.moin/server/moin.wsgi limit-as: 256 processes: 4 master: 1 logto: /var/log/uwsgi/uwsgi.log memory-report: 1 vhost: 1 no-site: 1
{ "uwsgi": { "uid": "www-data", "gid": "www-data", "plugins": "python", "socket": "/home/hoge/.moin/run/moin.sock", "wsgi-file": "/home/hoge/.moin/server/moin.wsgi", "limit-as": 256, "proccesses": 4, "master": true, "logto": "/var/log/uwsgi/uwsgi.log", "memory-report": true, "vhost": true, "no-site": true } }
参考
- Quickstart – uWSGI
- Doc – uWSGI
- Example – uWSGI
- RunOnNginx – uWSGI
- nginx + uWSGI + Flaskを試してみる - Reinvention of the Wheel
- uWSGI+virtualenv+Flask | おいぬま日報
- Ubuntu 11.10 with Nginx and uWSGI - Server Fault
- UWSGI and NGINX for Python Apps on Ubuntu 11.10 - Server Fault
- Moin, uWSGI & nginx - setting up at <my-domain>/wiki - Server Fault
- uWSGI + nginx for django project, error with strting uwsgi - Stack Overflow
- uwsgi + python + nginx + willy nilly file execution - Stack Overflow
- Django and Python + uWSGI - Stack Overflow
- Deploy Python Code with WSGI using uWSGI and nginx on Ubuntu 10.04 (Lucid) – Linode Library
- Deploy Python Code with WSGI using uWSGI and nginx on Ubuntu 10.10 (Maverick) – Linode Library
- FreeBSD: Nginx Virtual Hosting Configuration
*1:uwsgi パッケージが /etc/init.d/uwsgi とか /etc/uwsgi/apps-available などなど作ってくれてるけどよくわかんないので保留。