2012/02/10

Nginx + uwsgi で Trac環境を作った時のメモ


ここ数日の間に、Trac環境を作ることになったのですが、
Apache + mod_python のスタンダード(?)な構成ではなく、
Nginx + uwsgi の組み合わせでやってみたので今回はそのメモを書いておきます。

Tracのインストール
OSはUbuntu11.10 Server 64bitで
全体的に新しめな環境で行いましたが、Tracのインストール自体は至ってスタンダードでした。
まずは必要なパッケージをaptとeasy_installでインストール。
□ laughk@ubuntu
 --------------------------------
sudo aptitude install vim unzip nginx uwsgi uwsgi-plugin-python subversion easy_install sqlite3
sudo easy_install babel
TracはInterAct社が提供している日本語版を利用するのでaptではインストールしません。
また、DBは一番手軽なSQLiteにしました。

続いてTrac本体のインストール。
□ laughk@ubuntu
 --------------------------------
cd /usr/local/src
 # ソースを置くディレクトリまで移動。ここはお好きな所で。

sudo wget http://www.i-act.co.jp/project/products/downloads/Trac-0.12.2.ja1.zip
sudo unzip Trac-0.12.2.ja1.zip
cd Trac-0.12.2.ja1
 # wget でソースを取得。ちなみURLは 2012/02/10 の時点で最新のものとなっています。

sudo python setup.py compile_catalog -f
 ## ↑これを忘れるとメニューが日本語化されない。
sudo python setup.py install
 ## Tracインストール開始
これでTrac環境作成に必要なパッケージのインストールは完了です。

Tracプロジェクトの作成
パッケージのインストールが完了してもまだTracは動いてくれません。
ここからブラウザ経由でアクセスできるように設定していかなければいけません。

まずはプロジェクトの作成
ここはスタンダードそのものです。
□ laughk@ubuntu
 -------------------------------
sudo mkdir /usr/local/trac && sudo chown www-data. /usr/local/trac
sudo -u www-data trac-admin /usr/local/trac/[TRAC_PROJECT] initenv
 ## ---- 
   対話式でプロジェクト名など入力。適宜情報を入れていく。
   DBの部分で sqlite:db/[TRAC_PROJECT_DB].db とSQLiteの設定にするのに気をつける。
 ## ----

sudo -u www-data trac-admin /usr/local/trac/[TRAC_PROJECT] permission add [ADMIN_USER] TRAC_ADMIN
 ## 今のうちにTracの管理者ユーザーを登録しておく。

 ## ----- 
   ※ [TRAC_PROJECT] --> Tracのプロジェクト名
     [TRAC_ADMIN]   --> Tracの管理者ユーザー名
 ## -----

uwsgiの設定
Nginxももちろん設定が必要ですが、
まずはuwsgiというツールの設定をしてあげる必要があります。
※他にも FastCGIであったりmod_wsgiといったものがあるようですが、情報がありそうだったuwsgiを選択しました。

uwsgiでpythonを動かすための設定ファイルがwsgiファイルやiniファイル、xmlなど色々手段があるようです。
僕はサービスとしてuwsgiを使う際に一番しっくりきたので、xmlを採用しました。

ということで、以下の要領で作成します。
□ laughk@ubuntu
 --------------------------------
cd /etc/uwsgi/apps-available
vim [TRAC_PROJECT].xml
[TRAC_PROJECT].xml 内容は以下のとおり。
<uwsgi>
    <socket>127.0.0.1:8080</socket>
    <env>TRAC_ENV=/usr/local/trac/[TRAC_PROJECT]</env>
    <module>trac.web.main:dispatch_request</module>
</uwsgi>

※socket部分に関してはポートは開いている場所なら違うところでも問題ないです。
  ただしNginxの設定と合わせる必要があるので注意。
□ laughk@ubuntu
 --------------------------------
sudo chown www-data. [TRAC_PROJECT].xml
 ## パーミッションは忘れずに設定。

cd ../apps-enabled/
sudo ln -s ../apps-available/[TRAC_PROJECT].xml
 ## enabled配下にシンボリックリンクをおいて有効にする。
以上でuwsgiの設定は完了です。

Nginxの設定
いよいよNginxの設定に入ります。
通常であれば nginx.conf を編集するところですが、Ubuntuの場合はApache同様、
/etc/nginx/site-available/  配下に設定ファイルを置き、
/etc/nginx/site-enabled/    配下に site-available 配下の有効にする設定ファイルに対するシンボリックリンクを置く。
と言った方式になっております。
せっかくなのでTrac用に新規に作って見ることにします。
□ laughk@ubuntu
 --------------------------------
cd /etc/nginx/site-available/
sudo vim [TRAC_PROJECT_WEBCONF]
 ## ※ [TRAC_PROJECT_WEBCONF] --> Nginx用のTrac設定ファイル名

[TRAC_PROJECT_WEBCONF] ファイルの内容は以下のような感じ。
server{
            ## Block 1
            server_name localhost;

            ## Block 2
            location /[TRAC_WEB] {
                    include uwsgi_params;
                    uwsgi_pass 127.0.0.1:8080;
            }

            ## Block 3
            location /[TRAC_WEB]/login {
                    include uwsgi_params;
                    uwsgi_param REMOTE_USER $remote_user;
                    uwsgi_pass 127.0.0.1:8080;
                    auth_basic "Trac Auth";
                    auth_basic_user_file "[BASIC_PASSWD_FILEPATH]";
            }
}
内容を簡単に説明すると、
# Block 1
  ---> Webサーバの名前。デフォルトのままでOK

 # Block 2
  ---> URLパスの指定とuwsgiのパスの記載。ここは [TRAC_PROJECT].xmlの内容(特にポート)に合わせること。

 # Block 3
  ---> Basic認証の設定。パスワードファイルのパスを指定する。
          また、URLのパスは必ず# Block 2 のURLパスの直下に login という形にすること!
と言った具合でしょうか。
あと当然ですが、「# Block ..」は説明用につけただけなんでなくても全く問題ないです。

ファイルの編集が終了したら、
□ laughk@ubuntu
 --------------------------------
cd ../site-enabled/
sudo ln -s ../site-available/[TRAC_PROJECT_WEBCONF]

sudo service nginx configtest
 ## コンフィグテスト。エラーが出ないことを確認する。
ここまで来てNginxの設定も完了です。

ベーシック認証パスワードの設定
上記の状態でもおそらく動くかとは思いますが、
起動する前にベーシック認証のユーザーとパスワードの登録もしておきましょう。
□ laughk@ubuntu
 --------------------------------
sudo -u www-data htpasswd -c [BASIC_PASSWD_FILEPATH] [ADMIN_USER]
 ## ここで対話式でパスワードの入力を求められるので入力

 ## ※ 初回の時は必ず -c オプションを付ける。二回目以降は付けない。
以上で設定は完了です。

uwsgi と Nginx を起動する
ここまで来たら後は起動するだけです。uwsgiとNginxを動かしましょう!
□ laughk@ubuntu
 --------------------------------
sudo service uwsgi start
sudo service nginx start

この状態でブラウザから
http://[サーバのip]/[TRAC_WEB]
にアクセスをするとTracが表示されるかと思います。
あとは既存の情報に沿ってカスタマイズしていくだけです。

最後に!
Nginxを使った環境に関してはApacheのものに比べて情報量が少なく苦戦しましたが、
なんとか普通に動かせるところまで持っていけました。
何事も無く書いてますが一番ハマってしまったのは、実はBasic認証のあたりだったりします。
認証関連についてTwitterで情報頂いた@ttkzwさん。本当にありがとうございました。

以上、お疲れ様でしたー。

2012/02/10 追記
/etc/uwsgi/apps-enabled 配下にシンボリックリンクを置く手順が抜けていたので追記しました。