Mise en place d'un environnement Ruby on Rails avec Nginx

Introduction

Le but de cet HowTo n'est pas de faire un cours sur Ruby on Rails mais simplement de détailler les outils nécessaires à son bon fonctionnement. Nous prendrons pour exemple le déploiement d'un blog développé en Ruby nommé Typosphere en utilisant MySQL (cf Installation & Sécurisation MySQL pour l'installation et le paramétrage de MySQL).

Nginx a été choisi pour ses capacités avancées de load balancing, toutefois d'autres serveurs web font l'affaire.

Le résultat sera celui ci : typo.jpg

Avant de commencer

Installation des packets nécessaires

NGINX

On l'installe :

# pkg_add -r nginx

On le configure pour démarrer au lancement du système :

# vi /etc/rc.local
if [ -x /usr/local/sbin/nginx ]; then
        echo -n ' nginx'; /usr/local/sbin/nginx
fi

Ruby on Rails

On installe les différents éléments nécessaires :

# pkg_add -r ruby
# pkg_add -r ruby-gems
# pkg_add -r ruby-rails
# pkg_add -r ruby-rake
# pkg_add -r ruby-iconv
# pkg_add -r ruby-sqlite3
# gem install mysql

On crée le squelette de l'architecture rail :

# rails /var/nginx/html/

Typosphere

Nous allons nous servir de l'utilitaire gem installé précédemment pour rapatrier typo :

# gem install typo
# typo install /var/nginx/html/typo db_user=root db_name=typo db_host=localhost db_password=pass

NB : Les informations de votre base sont contenues dans config/database.yml

Par défaut, typo utilise mongrel un serveur web ruby. Nous allons le configurer directement via typo pour qu'il écoute sur 127.0.0.1 avec 3 threads sur les ports 3000-3002.

# typo config /var/nginx/html/typo bind-address=127.0.0.1
# typo config /var/nginx/html/typo port-number=3000
# typo config /var/nginx/html/typo web-server=mongrel_cluster
# typo config /var/nginx/html/typo threads=3

On crée le répertoire de logs des pids parce qu'il n'est pas fichu de le faire tout seul au lancement :

# mkdir /var/nginx/html/typo/tmp/pids

On le démarre :

# typo start /var/nginx/html/typo

A ce stade votre application est déjà accessible à l'adressse 127.0.0.1:3000-3002, mais on veut faire plus !

Configuration de Nginx

# vi /etc/nginx/nginx.conf
user _nginx;
worker_processes 5;
  error_log /var/log/nginx.error.log;
pid /var/run/nginx.pid;
  events {
worker_connections 1024;
}
  http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] $request '
                    '"$status" $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx.access.log main;
sendfile on;
keepalive_timeout 65;
# on déclare l'adresse du cluster :
upstream mongrel_cluster {
  server 127.0.0.1:3000;
  server 127.0.0.1:3001;
  server 127.0.0.1:3002;
}
server {
  listen 80;
  server_name 192.168.1.30; #changez par votre IP
  root /var/nginx/html;
# on pointe notre blog vers la racine et on va chercher le contenu sur le serveur ruby
location / {
    proxy_pass http://mongrel_cluster;
    break;
    }
  }
}

On lance nginx :

# /usr/local/sbin/nginx

Plus qu'à aller à l'adresse de votre serveur, vous devriez tomber immédiatement sur la page de configuration de l'admin.

Amélioration des performances

Il existe un autre serveur ruby offrant un meilleur gain et permettant l'utilisation de socks, il s'agit de Thin.

Thin

Attention, selon les versions des packages / ports il est possible que ça ne marche pas. La compatibilité avec OpenBSD reste extrêmement relative.

On l'installe :

# gem install thin
# mkdir /etc/thin
# vi /etc/thin/thin.ymp
pid: /var/nginx/tmp/pids/thin.pid
socket: /var/nginx/tmp/thin.sock
log: log/thin.log
timeout: 30
max_conns: 1024
chdir: /var/nginx/html/typo
max_persistent_conns: 512
environment: production
daemonize: true
require: []

servers: 3

On configure Nginx :

  upstream thin_cluster {
  server unix:/tmp/thin.0.sock;
  server unix:/tmp/thin.1.sock;
  server unix:/tmp/thin.2.sock; 
}
location / {
    proxy_pass http://thin_cluster;
    break;
    }

On lance l'application :

# thin -C /etc/thin/thin.yml start

Memcached

Comme son nom l'indique Memcached va servir de cache pour Nginx :

# pkg_add memcached

# vi /etc/rc.local

if [ -x /usr/local/bin/memcached ]; then

      echo -n ' memcached'
      /usr/local/bin/memcached -d -l 127.0.0.1 \
         -u _memcached -P /var/run/memcached.pid
fi

On configure Nginx pour l'utiliser :

location / {
  set $memcached_key $uri;
  memcached_pass     127.0.0.1:11211;
  default_type       text/html;
  error_page         404 = /fallback;
}
location = /fallback {
  proxy_pass http://thin_cluster;
}

Crédits

Auteur : Angeli Matthieu
Date de réalisation : 08/13/2009
Version d'OpenBSD : 4.6

documentations/admin/ruby_on_rails.txt · Dernière modification: 2010/03/01 16:07 par benje
OpenBSD Apache Driven by DokuWiki
CC Attribution-Noncommercial-Share Alike 3.0 Unported