使用Apache上的FastCGI来运行Sinatra

为了在服务器上安装和发布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

下一步,将除公共静态文件外的所有内容通过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上公开了这些模板。

    https://github.com/nnct-jo-ken/sinatra_fcgi_template

请参考

    http://recipes.sinatrarb.com/p/deployment/fastcgi
bannerAds