LoginSignup
9
9

More than 5 years have passed since last update.

SinatraをApache上のFastCGIで動かす

Last updated at Posted at 2014-07-22

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

参考

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9