Ramaze Wiki
History
Table of Contents
  1. Deploying your Ramaze app
    1. Mongrel
    2. Apache
    3. Nginx
    4. LigHTTPD
    5. CGI / FastCGI
      1. public/dispatch.fcgi
      2. public/dispatch.cgi
      3. .htaccess
      4. Apache virtual host config

Deploying your Ramaze app


Once your app is up and running, you'll want to deploy it in a production environment.
Ramaze has no special production mode -- to turn off source reloading and hide public-facing error messages:

class MainController < Ramaze::Controller
  def error() 'An error has occurred, try again later' end
end

Ramaze.start :sourcereload => false

Mongrel


The recommended way of deploying a Ramaze app is using either Mongrel or Evented Mongrel behind an Apache or Nginx proxy.

Apache

NameVirtualHost *:80
<VirtualHost *:80>
  ServerName yourdomain.com
  ServerAlias www.yourdomain.com

  ServerAdmin admin@yourdomain.com

  ErrorLog /var/log/apache2/yourdomain.com.errors
  CustomLog /var/log/apache2/yourdomain.com.log custom

  DefaultType text/html

  ProxyPreserveHost On

  # Configuration possibility 1 of 2:
    # The entire domainname, from the root (/), is served by Ramaze
    # Ramaze should be running at the defined host (192.168.1.100 in this example)
    # and on the specified port (8000 in this example)
    # Note the trailing slash after the port.
    ProxyPass        / http://192.168.1.100:8000/
    ProxyPassReverse / http://192.168.1.100:8000/
  # End Configuration possibility 1 of 2.

  # Configuration possibility 2 of 2:
    # Or, if you like, only some subdirectory
    # Note the lack of trailing slash after the port.
    ProxyPass        /some-sub-dir http://192.168.1.100:8001
    ProxyPassReverse /some-sub-dir http://192.168.1.100:8001

    # This line will make it serve things from the DocumentRoot
    # Unless stuff from some-sub-dir is requested
    ProxyPass / !
    DocumentRoot "/var/www/localhost/htdocs/stuff"
    <Directory "/var/www/localhost/htdocs/stuff">
      AllowOverride All
      Options -Indexes FollowSymLinks MultiViews ExecCGI
      Order Allow,Deny
      Allow from All
    </Directory>
  # End Configuration possibility 2 of 2.
</VirtualHost>

Nginx

server {
  server_name source.ramaze.net;

  access_log /var/log/nginx/ramaze.sourceview.access_log main;
  error_log  /var/log/nginx/ramaze.sourceview.error_log;

  root /home/ramaze/ramaze/examples/sourceview/public;

  location / {
    if (-f $request_filename) {
      access_log off;
      rewrite_log off;
      expires 30d;
      break;
    }

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;

    if (!-f $request_filename) {
      proxy_pass http://localhost:9950;
      break;
    }
  }

  # To proxy from a subdirectory to a Ramaze app, use this:

  location /subdir {
    if (-f $request_filename) {
      access_log off;
      rewrite_log off;
      expires 30d;
      break;
    }

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;

    if (!-f $request_filename) {
      rewrite    /subdir(.*)     $1  break;
      proxy_pass http://localhost:9951;
      break;
    }
  }

}

LigHTTPD


In your lighttpd.conf, you'll have to enable/include mod_proxy by adding it to the server.modules list, so we can later use it to forward requests to our Ramaze app, like so:

server.modules = ( "mod_proxy" )

(Please note that usually the list contains more than just one mod_* entry.)

Secondly, you'll need to add a rule to invoke the proxy. In this example, I'm looking for requests using a particular domain name, "example.com". I recommend putting this snippet to the very end of lighttpd.conf, but it's up to you, really.

#### proxy module

$HTTP["host"] =~ "example\.com" {
    proxy.server  = ( "" => (( "host" => "127.0.0.1", "port" => 7000 )))
}

If you have more than one app, which are supposed to be served under different (sub)domains, you would just add more rules:

#### proxy module

$HTTP["host"] =~ "awesome\.example\.com" {
    proxy.server  = ( "" => (( "host" => "127.0.0.1", "port" => 7000 )))
}

$HTTP["host"] =~ "great\.example\.com" {
    proxy.server  = ( "" => (( "host" => "127.0.0.1", "port" => 7001 )))
}

For more details on mod_proxy, see the docs on the lighttpd site.

Here's a slightly advanced setup that lets lighttpd serve your application's static files (for the sake of this example located in ./public/css/, ./public/images and ./public/js), while forwarding any other request to your application.

This is a win-win situation: lighttpd can do what it does best (serving static files), and your Ramaze app can fully concentrate on dealing with the actual dynamic requests.

$HTTP["host"] =~ "example\.com" {
    # This is the path to your Ramaze app's /public/ folder
    server.document-root = "/home/example_user/myramazeapp/public/"

    $HTTP["url"] !~ "^/(css|images|js)" {
        proxy.server  = ( "" => "host" => "127.0.0.1", "port" => 7000 )
    }
}

Another plus: you can employ other lighttpd mechanics for your static files, for example output compression using mod_compress.

CGI / FastCGI


Most shared hosting servers use FastCGI. To deploy your Ramaze app in these environments, use the fcgi adapter.

Create the following files in your application. Choose either dispatch.cgi or dispatch.fcgi, depending on your needs and what you server makes available to you.

*Note:* In order for these scripts to run both script itself and the public directory the script is running in need to be executable, log dir needs to be writeable etc.

chmod 755 public public/dispatch.fcgi

public/dispatch.fcgi


#!/usr/bin/env ruby

require 'rubygems'
require 'ramaze'

# FCGI doesn't like writing to stdout
Ramaze::Inform.loggers = [ Ramaze::Informer.new( File.join(__DIR__, '..', 'log', 'ramaze.fcgi.log') ) ]

Ramaze::Global.adapter = :fcgi

$0 = File.join(__DIR__, '..', 'start.rb')

require $0

If you want common code shared between start.rb and dispatch.fcgi, but require different settings, one method is:

#!/usr/bin/env ruby

require 'rubygems'
require 'ramaze'

# FCGI doesn't like writing to stdout
Ramaze::Inform.loggers = [ Ramaze::Informer.new( File.join(__DIR__, '..', 'log', 'ramaze.fcgi.log') ) ]

Ramaze::APPDIR.replace __DIR__/'..'

Ramaze::Global.setup do |g|
  g.template_root = __DIR__/'..'/:view
  g.public_root = __DIR__
  g.adapter = :fcgi
  # other settings here
  # g.sourcereload = false
end

require '../start_common.rb'

Ramaze.start

public/dispatch.cgi


#!/usr/bin/env ruby

require 'rubygems'
require 'ramaze'

Ramaze::Global.adapter = :cgi
Ramaze::Inform.loggers = [ Ramaze::Informer.new( File.join(__DIR__, '..', 'log', 'ramaze.cgi.log') ) ]

$0 = File.join(File.dirname(__FILE__), '..', 'start.rb')

require $0

.htaccess


# General Apache options
Options +FollowSymLinks +ExecCGI
AddHandler cgi-script cgi rb
<IfModule mod_fastcgi.c>
 AddHandler fastcgi-script fcgi
</IfModule>
<IfModule mod_fcgid.c>
 AddHandler fcgid-script fcgi
</IfModule>

# Redirect all requests not available on the filesystem
# to Ramaze. By default the cgi dispatcher is used which
# is very slow. For better performance replace the
# dispatcher with the fastcgi one

RewriteEngine On
RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]

# In case Ramaze experiences terminal errors.
# Instead of displaying this message you can supply a
# file here which will be rendered instead.
#
# Example:
#   ErrorDocument 500 /500.html

ErrorDocument 500 "<h2>Application error</h2>Ramaze failed to start properly"

Apache virtual host config


(the placement of these lines depends on your flavour and distribution of UNIX/Linux)

Listen 127.0.0.1:7001

<VirtualHost 127.0.0.1:7001>
  ServerAdmin webmaster@yourdomain.com
  DocumentRoot /path/to/you/ramaze/application/public
  ServerName ramazetest.yourdomain.com
  ServerAlias ramazetest
  AddDefaultCharset utf-8
  ErrorLog /var/log/apache2/ramazetest_error.log
  TransferLog /var/log/apache2/ramazetest_access.log
</VirtualHost>

For more configuration options, check out the FastCgi Apache documentation