読者です 読者をやめる 読者になる 読者になる

初代Masteries

きっとモヒカンにもなれないお前たちに告げる!!!

さくらVPSでnginxとsupervisordを使ってMojolicious::Liteを動かしてみた

よくよく考えてみるとウェブサービスの開発経験が非常に乏しいので, タイトルに書いてあるとおり, さくらのVPSでnginxとsupervisordを使って, Mojolicious::Liteで書いた軽いサービス(?)を動かしてみました.

結構苦労したので, 動くまでの作業を備忘録兼ツッコミ待ち(?)としてまとめたいと思います.

完成品

こんなのを作ってました. ※twitterの仕様変更? でうまく動かなくなったので公開を中止しています.

id:pokutunaさんがRubyでこんなのを作っていて, Githubにコードがあったので, 「とりあえずこれをMojolicious::Liteを使って実装してみよう!」と思ったのがきっかけです.

パクって参考にさせてもらっていいすかね?」というお願いを快諾して下さったぽくつなさん, 本当にありがとうございました.

ぽくつなさんスゲーまじスゲー, 俺ぽくつなさんのことマジリスペクトっすよー! (ミサワ風)

初期設定

初期設定やSSHの公開鍵設定については, こちらの記事を参考にしました:

この記事では, 初期設定については既に終わっているという前提で話を進めたいと思います.

perlbrewとcpanmのインストール

※こちらの記事を参考にしました:
[まとめ] さくらのVPSで一気に perl の環境を整える

とりあえずperlbrewを導入します.

$ curl -LO http://xrl.us/perlbrew
$ perl perlbrew install
$ ~/perl5/perlbrew/bin/perlbrew init
$ echo 'source ~/perl5/perlbrew/etc/bashrc' >> ~/.bashrc // .bashrcに, perlbrewを使う為の設定を追記
$ source ~/.bashrc                                       // 変更した.bashrcを有効化
$ which perlbrew                                         // パスが通っていることを確認
~/perl5/perlbrew/bin/perlbrew

インストールに使ったスクリプトは必要ないので, 削除しましょう.

$ rm perlbrew

続いてcpanmのインストールです. perlbrewから簡単に導入できます.

$ perlbrew install-cpanm

nginxのインストール

※こちらの記事を参考にしました:
Apache、mod_perl さようなら!さくらVPSで Nginx + Starman

さて, 次にnginxをインストールします. nginxは, 一言で言ってしまえばウェブサーバです.
かなーり昔は, Webサーバと言えばApache! というイメージがありましたが, 最近はnginxとかがナウい(ナウい, という言い方は古臭いけど)らしいので, 試しに使ってみようと思いました.

...さて, nginxのインストールには, pcre-devel と openssl-devel が必要となるらしいので, インストールします.

$ sudo su -  // 管理者へ
# yum -y install pcre-devel openssl-devel
# wget http://nginx.org/download/nginx-1.2.1.tar.gz
# tar zxvf ./nginx-1.2.1.tar.gz
# cd ./nginx-1.2.1
# ./configure
# make
# make install

2012年7月4日現在のnginxの最新版は1.2.1です. こんな感じで, ちゃちゃっとインストールしてしまいましょう.

nginxの設定

続いて, nginxの起動スクリプトを作ります.
こちらのWikiにスクリプトのサンプルがありますが, パスなどを変更する必要があります.

変更前: nginx="/usr/sbin/nginx"
変更後: nginx="/usr/local/nginx/sbin/nginx"
変更前: NGINX_CONF_FILE="/etc/nginx/nginx.conf"
変更後: NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

これを, '/etc/init.d/nginx'に保存して...

# chmod +x /etc/init.d/nginx
# /etc/rc.d/init.d/nginx start
# /etc/rc.d/init.d/nginx status

これで, nginxが動作するはずです.
nginxが動作している状態で, VPSのIPアドレスにアクセスすると, 'Welcome to nginx!'とか出てくるはずです.

supervisordのインストール

※こちらの記事を参考にしました:
Amon2をSupervisor+Starmanで動かす
supervisordとcelerydの設定

続いて, プロセスの死活管理をするsupervisordを導入します.
supervisordはpythonで作られているので, pythonのsetuptoolsを導入する必要があります.

# yum install python-setuptools
# easy_install -U supervisor

簡単ですね!

supervisordの設定

さて, ではsupervisordの設定を行います. 正直ここでかなり手間取りました...
supervisordの設定ファイルは, echo_supervisord_conf というコマンドで生成することができます.

# echo_supervisord_conf > /etc/supervisord.conf

続いて, 生成した設定ファイルを変更します.
ログのサイズ(logfile_maxbytes, デフォルトでは50MB)や, ログの生成場所(logfile, デフォルトでは'/tmp/supervisord.log')など, 必要に応じて変更しましょう.

※設定に関しては, 冒頭で紹介した, こちらのサイトが参考になります:
supervisordとcelerydの設定

今回は, 個別のサービスの設定ファイルを, '/etc/supervisord/'ディレクトリに格納することにします.
'/etc/supervisord.conf'の最後の行,

;[include]
;files = relative/directory/*.ini

を,

[include]
files = /etc/supervisord/*.conf

と書き換え,

# mkdir /etc/supervisord

コマンドで, 該当するディレクトリを作成します.

最後に, supervisordの起動スクリプトを用意します. 参考にしたサイトでは, これを使っていましたが, 自分はこれを使いました.
これを, '/etc/init.d/supervisord'に保存して...

# chmod +x /etc/init.d/supervisord
# /etc/rc.d/init.d/supervisord start
# /etc/rc.d/init.d/supervisord status

実行

さて, Mojolicious::Liteで簡単なアプリを作って動かしてみましょう.

#!/usr/bin/env perl
use Mojolicious::Lite;

get '/' => sub {
     my $self = shift;
     $self->render(text => 'Hello World!');
};

app->start;

これを, '/home/username/app/'というディレクトリに, 'app.pl'という名前で保存します.

続いて, 必要なモジュールを用意します.

$ cpanm Mojolicious 
$ cpanm Server::Starter
$ cpanm Starman
$ cpanm Net::Server::SS::PreFork

nginxの設定

今回は, 独自ドメイン'example.com'のサブドメイン'app.example.com'にアクセスすることで, このアプリを使えるようにしたいと思います.
という訳で, その為に必要なnginxの設定を行います.

まずnginxの設定ファイルである, '/usr/local/nginx/conf/nginx.conf'を編集します.

# vim /usr/local/nginx/conf/nginx.conf

ファイルの中に, 次のようなセクションがあるはずです.

http {
        <中略>
}

この'{'と'}'で挟まれた領域に,

include /usr/local/nginx/conf/extra/*.conf;

と書き込みます. '/usr/local/nginx/conf/extra/'ディレクトリに設定ファイルを用意するので, それを読み込めという意味になります.

さて, 初期状態では, '/usr/local/nginx/conf/extra/'ディレクトリは存在しないので, 用意します.

# mkdir /usr/local/nginx/conf/extra/

このディレクトリに, 'vhost.conf'という名前で, 次のようなファイルを用意します.

server {
    listen 80;
    server_name app.example.com;
    access_log /dev/stdout;
    location / {
        proxy_pass http://127.0.0.1:8000;
    }
}

この設定がどういう意味かと言うと, 「app.example.comにポート80でアクセスがあった場合, アクセスログを標準出力に出して, http://127.0.0.1:8000につなげ」という意味... だと思っていますがどうでしょう.
このとき, http://127.0.0.1:8000(localhost:8000)でアプリを動かしておけば, app.example.comにアクセスすると, 設定したアプリを使うことができる, という寸法... だと思います.

これでnginxの設定は終わりです.

supervisordの設定

最後にsupervisordの設定をします.
以前, 設定ファイルは'/etc/supervisord/'に配置する, と設定しているので, このディレクトリに'app.conf'という名前で次のようなファイルを保存します.

[program:app]
user=username
command=/home/username/app/run
directory=/home/username/app/
stdout_logfile=/var/log/supervisord/app.log
stderr_logfile=/var/log/supervisord/app_error.log
numprocs = 1
stdout_logfile_maxbytes = 10MB
stderr_logfile_maxbytes = 10MB
stdout_logfile_backups = 5
stderr_logfile_backups = 5
autostart = true
autorestart = true
startsecs = 5
priority = 998

'directory'は実行したいアプリがある場所, 'command'はそのアプリを実行する為のコマンドです. ここでは'/home/username/app/run'としておきます(次に用意します).
'stdout_logfile', 'stderr_logfile'はそれぞれ標準出力, 標準エラー出力を記録するファイルです.

実行用スクリプトの用意

'/home/username/app/'に, 'run'という名称で次のようなファイルを用意します.

#!/bin/sh
exec /home/username/perl5/perlbrew/perls/perl-5.12.4/bin/start_server --port 8000 --interval 2 -- /home/username/perl5/perlbrew/perls/perl-5.12.4/bin/plackup -s Starman -a /home/username/app/app.pl --workers 10

app.plを, Starmanを使って, ポート8000を使って起動する... という感じです.
ここでstart_serverとか, plackupとか, フルパスで書かずに住む方法とかありそうな気がするのですが, いい方法が思い浮かばなかったのでこのままにしています.

後は, supervisordを経由してこのアプリを実行すればOKです.

# /etc/init.d/supervisord start
supervisord を起動中:                                      [  OK  ]

おそらく, 'app.example.com'にアクセスすれば, 'Hello World!'とか出てくる... はずです.

まとめ

さくらのVPSで, nginxとsupervisordを使ってMojolicious::Liteで作ったアプリを動かしてみました.

...ぶっちゃけて言えば, ひと通り環境を構築した後, コマンドや作業内容を思い出しながら書いたので, 記述漏れがあるかもしれません.
更に, nginxやsupervisordは初めて触ったので, いろいろな意味で「マズい」手法を使っているかもしれません.

「これはこういう設定にした方が安全だよ!」とか, 「ここはこうじゃなくて, こうするべき!」とか, 「この作業, 書き忘れてない?」というご指摘, ご助言やアドバイスがあれば, ブログのコメント欄やtwitterなどで伝えて頂ければ嬉しいです.


環境を構築して, 作ったアプリを公開するまでに結構時間がかかってしまいましたが, なんとかかんとか動いた時の嬉しさや達成感は, やっぱり格別でした. これがあるから, プログラミングはやめられないんですよねー. そんな感じでこれからも, いろいろとチャレンジしてみようと思います!