カテゴリーアーカイブ: sinatra

Passengerがnginxで使えるみたい。

nginxモジュールをインストールする際にnginxをダウンロードするかどうか聞かれました。
ソースからnginxをインストールしているなら、そのディレクトリを指定すればよいらしいけど、ちょっと前にnginxをyumからに変えていたので一旦削除。

sudo gem install passenger
passenger-install-nginx-module

(略

Automatically download and install Nginx?

Nginx doesn't support loadable modules such as some other web servers do,
so in order to install Nginx with Passenger support, it must be recompiled.

Do you want this installer to download, compile and install Nginx for you?

 1. Yes: download, compile and install Nginx for me. (recommended)
    The easiest way to get started. A stock Nginx 0.6.37 with Passenger
    support, but with no other additional third party modules, will be
    installed for you to a directory of your choice.

 2. No: I want to customize my Nginx installation. (for advanced users)
    Choose this if you want to compile Nginx with more third party modules
    besides Passenger, or if you need to pass additional options to Nginx's
    'configure' script. This installer will  1) ask you for the location of
    the Nginx source code,  2) run the 'configure' script according to your
    instructions, and  3) run 'make install'.

Whichever you choose, if you already have an existing Nginx configuration file,
then it will be preserved.

Enter your choice (1 or 2) or press Ctrl-C to abort: 1

(略

ほとんどreturnキー押して終了。

/opt/nginx以下にファイルができます。

conf/nginx.confに以下が記述されてます。

http {
    ...
    passenger_root /usr/local/ruby/lib/ruby/gems/1.8/gems/passenger-2.2.4;
    passenger_ruby /usr/local/ruby/bin/ruby;
    ...
}

あとはvirtual.confとか作って、

server {
   listen 80;
   server_name www.yourhost.com;
   root /somewhere/public;   # <--- be sure to point to 'public'!
   passenger_enabled on;
}

こんな風に書けばいいようで。

passengerのモジュールインストール中に説明してくれるので親切。

で、今回はSinatraを使っているのでSinatraアプリ以下にconfig.ruをつくり、publicとtmpディレクトリを用意。

起動ファイルはyumでインストールした時のものを流用します。

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemin
#
# chkconfig:   - 85 15
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/opt/nginx/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"

# [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

lockfile=/var/lock/subsys/nginx

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    stop
    start
}

reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}
case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

起動したり終了したりが楽。

/etc/init.d/nginx start
/etc/init.d/nginx stop
/etc/init.d/nginx restart

わぁー

やっぱメモリは喰うのね。。

目標的にはRailsの下にsinatraをミドルウェアとしてrackupするつもり。

現時点では単体で動かせれば良いのでその辺りまでかな。

rack,sinatra,thinはさくっとgem installしておきます。たぶんどれか入れればrackが入るはず。ログとってなかった。

nginxはソースファイルからインストールします。stableです。

# wget http://sysoev.ru/nginx/nginx-0.6.35.tar.gz
# tar zxvf nginx-0.6.35.tar.gz
# cd nginx-0.6.35
# ./configure --prefix=/usr/local/nginx --with-http_ssl_module
# make
# make install
# cd /usr/local/nginx/conf
# vi nginx.conf
pid        /var/run/nginx/nginx.pid;
worker_processes  3;

events {
    worker_connections  1024;
}
http {
    include       mime.types;
    include       proxy_conf;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  0;

    upstream radiant {
        server unix:/var/tmp/thin.0.sock;
        server unix:/var/tmp/thin.1.sock;
        server unix:/var/tmp/thin.2.sock;
    }
    upstream rackup {
        server 127.0.0.1:9292;
    }
    server {
        listen 80;
        server_name example.net;
        access_log /var/log/nginx/radiant.access.log;
        root /var/www/radiant/public;
        index index.html;

        location / {
            proxy_pass http://radiant;
        }
    }

    server {
        listen 80;
        server_name test.com;
        access_log /var/log/nginx/rackup.access.log;
        location / {
            proxy_pass http://rackup;
        }
    }
}

# vi proxy_conf
proxy_redirect          off;
proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    10m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffers           32 4k;

pidの位置を/var/run以下にしているのはなんとなくまとめておきたいからです。

radiantの設定とか入ってるけど気にしない。

upstreamでソケットとかポートとか書いてあげてproxy_passで指定するだけ。

server{}でapacheのバーチャルホストっぽいことができる。

sslは次回持ち越し。

proxy_confはサンプルコピペなのであんまり精査してない。

とりあえず動かす設定なので内容もあまり吟味してない。

たぶんrootで実行しちゃまずい気がするけどテストだしいいよね。

# /usr/local/nginx/sbin/nginx

これで準備OK。再起動するときは、

# kill -HUP `cat /var/run/nginx/nginx.pid`

こんな感じ。

やっとsinatraへ。ちょっとサイトが更新されててびっくりした。

ばびっと用意。

# cd /var/www
# mkdir app
# cd app
# touch routes.rb config.ru
# mkdir public tmp views log

sinatraコントローラ作成。

目的のrackミドルウェアとするには、Sinatra::Baseを継承したクラスを作り、そのなかに書いておくのがやりかたとしてあるっぽいけど、それは次回ということで。

# vi routes.rb
require 'rubygems'
require 'sinatra'

get '/' do
  erb :home
end

not_found do
  'This is nowhere to be found'
end

error do
  'Sorry there was a nasty error - ' + env['sinatra.error'].name
end

sinatraテンプレート作成

# vi views/home.erb
halt.

rack設定

# vi config.ru
require 'rubygems'
require 'sinatra'

set :run, false
set :environment, :production

require 'routes.rb'
run Sinatra::Application

前回テストしたrackの設定に比べて簡素。

こんどはthinの設定ファイルを作ります。

# thin config -C thin.yml
# vi thin.yml
pid: /var/run/thin/thin.pid
timeout: 30
log: log/thin.log
max_conns: 1024
require: []
max_persistent_conns: 512
environment: production
servers: 1
daemonize: true
chdir: /var/www/html
rackup: /var/www/html/config.ru
port: 9292
address: 127.0.0.1

この変も割と適当。

ここもpidを/var/run/thinとかにしているので、ディレクトリつくってあげないと起動してくれません。

sinatraだけなら、ruby routes.rb -e production とかやるだけですが、thinの設定でrackup: /var/www/html/config.ruとしてます。
これ、rackもsockでやればよかった・・まあいいや。

でthin起動。

# thin start -C thin.yml

nginxは起動しているので、ブラウザからtest.comの80番へアクセスすれば表示されます。

された!