サーバ構築シリーズ nginx+unicornで生Rackアプリを動かす

とりあえずnginx+unicornでhelloworldが動くようになりましたってところまで。

サーバを借りる

さくらVPSで適当なコースで借りる(一番安い「さくらのVPS 1G」でいいと思います)

よくある初期設定~nginx+unicorn+GitLabのインストール

新さくらのVPSへの引越のついでにGitLab+Unicorn+Nginxで最新バージョン管理環境構築の通りにやりましょう。gitolite+GitLabも使います。 あ、Rubyのバージョンは1.9.3の新しいバージョンにしておきました。 GitLabはRuby on Railsで書かれているので、ここまでうまくいけばnginx+unicorn(+Rails)の動作自体は大丈夫なのですが、自分で書いたものを動かすところまでやらないと開発できる環境にならないので、続きがあります。

借りたサーバのドメイン設定

さくらインターネットでドメインを確保した人は、さくらインターネットの会員メニュー>契約情報>ドメインメニュー>ゾーン編集で、使いたいドメインを借りたサーバに向けます。タイプは「IPアドレス(A)」で値はサーバのIPアドレス。 とりあえずここが僕が用意した新サーバです。

nginxの設定その1

/etc/nginx/nginx.confに以下を足す

    server {
        listen   80;
        server_name 設定したドメイン;
         
        access_log  /var/log/nginx/newdomain.access.log;
        
        location / {
            root  /var/www/nginx-default;
            index index.html;
        }
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /var/www/nginx-default;
        }
    }
で、/var/www/nginx-defaultディレクトリにindex.htmlと50x.htmlを用意。あ、/var/log/nginxディレクトリがなかったら作っておきましょう。

nginxの再起動

先のGitLab導入のところでnginxは動かしているので、起動ではなく再起動。なんかrestartだとうまくいかないことがあるらしいので、stop→startで行っておきます。

$sudo /etc/init.d/nginx stop
$sudo /etc/init.d/nginx start
これでnginxが起動します。エラーで起動しない場合は設定ファイルの文法エラーです、大体。

設定したドメインでのアクセス確認

作業してたらそのうち設定したドメインがDNSに行き渡るので、アクセスしてみましょう。書いたindex.htmlの中身が見えればOK、見れなければアクセスログを見て何がいけないのか調べましょう。ほぼ、設定のrootディレクトリが間違っているかファイルのアクセス権限が適切でないかだと思います。

HelloWorldなRackアプリを用意する

config.ru

$APP_ROOT = '(このファイルを置いたディレクトリ)';
 
require 'rack'
require $APP_ROOT+'sample.rb'
 
run Sample.new
sample.rb

require 'rack/request'
require 'rack/response'
 
SIMPLE_CONTENT = <<__EOS__
<html>
<body>
<form method="POST" action="./">
  <input type="text" name="n" />
  <input type="submit" />
</form>
</body>
</html>
__EOS__
 
class Sample
  def call(env)
    req = Rack::Request.new(env)
    res = Rack::Response.new{|r|
      case
      when req.get?
        r.write SIMPLE_CONTENT
      when req.post?
        r.write "Hello, #{req['n']}!!"
      end
    }
    res.finish
  end
end
unicorn.config.rb

# unicorn.conf
worker_processes  2
working_directory '(このファイルを置いたディレクトリ)'
listen '/home/(ファイルのオーナー)/tmp/helloworld.sock', :backlog => 1
listen 4423, :tcp_nopush => true
timeout 10
 
pid '/tmp/helloworl.pid'
preload_app  true
stderr_path '/home/(ファイルのオーナー)/log/helloworld.log'
 
before_fork do |server, worker|
  old_pid = "#{server.config[:pid]}.oldbin"
  if old_pid != server.pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
 
  sleep 1
end
after_fork do |server, worker|
  addr = "127.0.0.1:#{4423 + worker.nr}"
  server.listen(addr, :tries => -1, :delay => 5, :tcp_nopush => 1)
end
プログラムはCapsule:Rackを試しに使ってみる (2)から拝借してきました。変更点は、Ruby1.9.2からロードパスにカレントディレクトリが含まれなくなったので自分で書いたファイルをrequireするときにパス指定したくらいです。 この3ファイルを同じディレクトリに置きます(unicorn.config.rbは別でもいいけど説明を楽にするためにそうします)

HelloWorldのためのUnicorn起動


$ unicorn -D -c (ファイルを置いたディレクトリのフルパス)/unicorn.conf.rb (ファイルを置いたディレクトリのフルパス)/config.ru
これでRackアプリにアクセスできるようになります。 http://サーバのIPアドレス:4423/にアクセスして確認します。Unicornの起動やアクセスでエラーが出るようならログファイルを見て設定を修正します。 参考:As Sloth As Possible:nginxとUnicornでRackアプリを動かす

Unicorn再起動

修正したらUnicornを再起動しなければいけません。 こちらを参考に

$ kill -USR2 (unicornのマスタープロセス)
すると再起動してくれます。 あ、Unicorn起動時にエラーが出てたときは当然プロセスないので普通に起動しなおします。

nginxの設定その2(リバースプロキシ)

先に参考資料として出したAs Sloth As Possible:nginxとUnicornでRackアプリを動かすに書いてある通り、nginx.confに

upstream helloworld {
    server unix:'/home/(ファイルのオーナー)/tmp/helloworld.sock';
}
 
server {
  (中略)
    location /helloworld/ {
        proxy_pass  http://helloworld;
    }
}
を追加します。そしてnginxを再起動してhttp://(設定したドメイン)/helloworld/にアクセスしてみましょう。今回はこれが動くところまでです。

まとめ

インストールして最低限起動と再起動ができるまでなら簡単(笑)設定を詰めていくのは後からでいいです。

次回予告

  • Railsの初歩の初歩
  • Hamlを使ってみる
  • groongaをインストールしてちょっと使ってみる
多分どれかやります。