Nginx + Starman + Catalyst(PSGI) で最初のページを表示するまで。

ユーザーのリクエストをNginx(プロクシとして使用) -> Starman(perl製webサーバー) -> Catalyst(PSGI)てな感じで待ち受ける環境を作ってみようと思います。

Catalystのインストール。

cpanm Task::Catalyst

Catalystのインストールが終わったら、catalyst.plが使えるようになるので、

catalyst.pl Myapp

で、とりあえずMyappアプリを生成してみました。
Calyst5.90015だと、myapp.psgiファイルも一緒に生成されました。
前までは、

./script/myapp_create.pl PSGI

ってやって、.psgiを生成してたんですが、その必要はないぽいです。

myapp.psgiにlibへのpathを追加して起動してみます。

use strict;
use warnings;

use lib ('/home/hogehoge/Myapp/lib');
use Myapp;

my $app = Myapp->apply_default_middlewares(Myapp->psgi_app);
$app;
plackup myapp.psgi

動いたので停止して次へ。

# Starmanのインストール

cpanm Starman

お手軽ですねw

# daemontoolsのインストール
Starmanを起動させておくために、daemontoolsを使ってデーモン化します。

# daemontoolsのDL -> 解凍
http://cr.yp.to/daemontools/install.html

mkdir -p /package
chmod 1755 /package
cd /package
wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
tar xvzf daemontools-0.76.tar.gz

で、解凍したら、adminってdirができる。

cd admin/daemontools-0.76

このままインストールするとエラーがでるらしいので、patchを当てる。

wget http://www.qmail.org/moni.csi.hu/pub/glibc-2.3.1/daemontools-0.76.errno.patch
patch -p1 < daemontools-0.76.errno.patch

# ようやくインストール

package/install

# runファイルの作成
portは、使ってなさそうな8080で。
workersは、とりあえず1個にしときます。
Perl + Perlモジュールは、perlbrew(+cpanm)でインストールしたので、
exportでlibを追加しつつ、starmanは絶対パスで指定。

#!/bin/sh
exec 2>&1
cd /home/hogehoge/Myapp
export PATH=/home/hogehoge/perl5/perlbrew/perls/perl-5.16.0/lib:${PATH}
exec setuidgid hogehoge /home/hogehoge/perl5/perlbrew/perls/perl-5.16.0/bin/starman myapp.psgi --p 8080 --workers 1

上記を/home/hogehoge/daemontools/Myapp/runとして保存しました。

perlbrew使ってない場合は、

#!/bin/sh
exec 2>&1
cd /home/hogehoge/Myapp
exec setuidgid hogehoge starman myapp.psgi --p 8080 --workers 1

こんな感じでいけそうですね。
で、上記のファイルに実行権限を与えて、/service/にリンクを貼ります。

chmod 755 run
ln -s /home/hogehoge/daemontools/Myapp /service/Myapp

下記のような感じで、myapp.psgiを操作する事ができます。

# ステータス確認
svstat /service/Myapp

# 停止
svc -d /service/Myapp

# 再開
svc -u /service/Myapp

# 完全停止
mv /service/Myapp /service/.Myapp
svc -dx /service/.Myapp

あとは、nginxにプロクシを設定します。

server {
    listen 80;
    server_name hogehoge.com;

    # .が含まれるリクエストはrootを参照(静的ファイル)
    location ~ .+\..+$ {
        root /home/hogehoge/Myapp/root;
    }

    location / {
        proxy_pass http://localhost:8080;
    }
}

で、nginxをreloadして、ページアクセス!

Welcome to the world of Catalyst.

とりあえず動いたんで、セキュリティ周りとチューニング周りをもう少し調べてみよ。