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、yamlLDAPでも設定できるらしい)。

$ 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
  }
} 

*1:uwsgi パッケージが /etc/init.d/uwsgi とか /etc/uwsgi/apps-available などなど作ってくれてるけどよくわかんないので保留。