#概要
Sinatraで作ったWEBアプリケーションをThin + Nginxで運用する。
本当はUnicornの方が早いらしいが、SinatraのチュートリアルでThinが紹介されており、手軽さを重視しThinで構築した。
また、Thin単体で動かすとなぜかSSL通信時にセッションが維持されないという現象に直面したので、Nginxをフロント、Thinをバックエンドサーバーとして動かすことにした。
#環境
- Ubuntu 14.04.2 LTS
- Ruby 2.0.0-p645
- Nginx 1.4.6
- Sinatra 1.4.6
- Thin 1.6.4
#設定
最小のファイル構造。
.
|-- Gemfile
|-- app.rb
|-- config.ru
Sinatraの設定
config.ru
を記述し、Sinatraをモジュールとして起動できるようにする。
require './app'
run Application
require 'bundler/setup'
require 'sinatra/base'
class Application < Sinatra::Base
get '/' do
'hello,world!'
end
end
Thinの設定
GemfileにThinを書いておく。
gem 'sinatra' , '1.4.6'
group :production do
gem 'thin'
end
bundle install
の後に、Thinをサービスとして起動する設定を行う。
rootで実行する必要があるため、環境変数PATHを引き継ぐ設定にするか、bundleを直接叩く。
$ which bundle
/home/kazuya/.rbenv/shims/bundle
$ sudo /home/kazuya/.rbenv/shims/bundle exec thin install
Installing thin service at /etc/init.d/thin ...
mkdir -p /etc/init.d
writing /etc/init.d/thin
chmod +x /etc/init.d/thin
mkdir -p /etc/thin
To configure thin to start at system boot:
on RedHat like systems:
sudo /sbin/chkconfig --level 345 thin on
on Debian-like systems (Ubuntu):
sudo /usr/sbin/update-rc.d -f thin defaults
on Gentoo:
sudo rc-update add thin default
$ sudo /usr/sbin/update-rc.d -f thin defaults
これでThinがサービスとして自動起動するようになる。
次にThinの設定ファイルを作成する。
---
chdir: /path/to/your/application
environment: production
timeout: 30
log: log/thin.log
pid: tmp/pids/thin.pid
max_conns: 1024
max_persistent_conns: 100
require: []
wait: 30
threadpool_size: 20
socket: /tmp/hoge.1.sock
daemonize: true
これでThin起動時に上記の設定が読み込まれる。
Nginxの設定
Thinとは/tmp/hoge.1.sockを通じてやりとりする。
SSL周りの詳細な設定は、また別の機会に。
upstream backend {
server unix:/tmp/hoge.1.sock;
ip_hash;
}
server {
listen 80;
listen 443;
server_name hoge-service.com;
ssl on;
ssl_certificate /etc/nginx/ssl-files/server.crt;
ssl_certificate_key /etc/nginx/ssl-files/server.key;
location / {
proxy_pass http://backend;
}
}
以上で完了。
ちゃんとしたサービスとして運用するには、負荷を考えThinのクラスタリング等のチューニングすべきかもしれない。