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に公開しました.