Edited at

SinatraをApache上のFastCGIで動かす

More than 5 years have passed since last update.

Sinatraをサーバに設置して公開するためには,リバースプロキシを使った構成が推奨されています.

しかし,初心者にはハードルが高いですし,この起動方法ではSSH操作やApacheの設定ファイルを書く知識が必要になります.

初心者でもファイルをアップロードする程度でSinatraアプリを動かせるような設定をしてみたので紹介します.


環境


  • OS: Ubuntu

  • Web Server: Apache2.2


    • ServerAlias, VirtualDocumentRootを使ったユーザごとのサブドメイン環境

    • .htaccessが使用可能




Apacheにmod_fastcgiを導入

まずは,ApacheでFastCGIを使えるようにします.

mod_fcgidもありますが,今回はmod_fastcgiを利用しました.

sudo apt-get install libapache2-mod-fastcgi

ファイルが更新されたときにリロードする設定を追加します.

(ただし,dispatch.fcgiの更新のみしか捕らえられないので,Sinatraの方のコードを変更した時にdispatch.fcgiのタイムスタンプも変更する必要があります.)


  • /etc/apache2/mods-available/fastcgi.conf

FastCgiConfig -autoUpdate


必要なgemのインストール

gemがインストールされていないと動作しません.sinatraとfcgiが必要です.

sudo gem install sinatra fcgi


ディレクトリ・ファイル構成

公開ディレクトリの直下にapp_nameというフォルダで設置した例です.

公開ディレクトリ/app_name/

├── app [755]
│   ├── app.rb
├── .htaccess
├── log [777]
│   ├── fastcgi.log
└── public [755]
├── dispatch.fcgi [755]
└── .htaccess


それぞれのファイルの中身


  • app_name/.htaccess

まず,public以下を見せるようにしたいので,rewriteでURLを書き換えてpublic以下に見せかけます.

RewriteEngine on

RewriteBase /app_name
# 全てpublic以下へ書き換える
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]


  • app_name/public/.htaccess

次に,public内の静的ファイル以外はdispatch.cgiを通し,Sinatraに問い合わせさせるようにします.

AddHandler fastcgi-script .fcgi

Options +FollowSymLinks +ExecCGI

RewriteEngine on
RewriteBase /app_name/public
DirectoryIndex dispatch.fcgi
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ dispatch.fcgi/$1 [QSA,L]


  • app_name/public/dispatch.fcgi

このファイルでSinatraをFastCGIとして起動します.

#!/usr/bin/env ruby

require 'rubygems'
require 'rack'

fastcgi_log = File.open("../log/fastcgi.log", "a")
STDOUT.reopen fastcgi_log
STDERR.reopen fastcgi_log
STDOUT.sync = true

load '../app/app.rb'

builder = Rack::Builder.new do
map '/' do
run App.new
end
end

Rack::Handler::FastCGI.run(builder)


  • app_name/app/app.rb

Sinatraのコードです.クラスとして定義する必要があります.

require 'sinatra'

class App < Sinatra::Application
set :public_folder, './public'

get '/' do
'hello'
end

get '/hoge' do
'hoge'
end
end


テンプレート

これらのテンプレートをGithubに公開しました.


参考