使用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