Rails 4 : exécuter une application dans un sous-répertoire avec Nginx

Cet article détaille la configuration Nginx et Rails pour faire tourner une application Rails dans un sous-répertoire.

Contexte

On ne va pas discuter ici si nous utilisons la meilleure architecture pour ce cas de figure mais  comment configurer un environnement existant pour faire fonctionner notre application dans un sous-répertoire.

L’application utilise Rails 4 et est servie par thin.

  • L’ancienne url de l’application : http://www.mydomain.com
  • La nouvelle url de l’application : http://www.mydomain.com/fr
  • Nginx écoute sur le port 80 et sert de reverse proxy vers un cluster thin qui sert l’application Rails

Configuration de Rails

config.ru

  • config.ru avant
# This file is used by Rack-based servers to start the application.

require ::File.expand_path('../config/environment', __FILE__)
run Rails.application
  • config.ru après
map MyApp::Application.config.relative_url_root || "/" do
    run Rails.application
end

config/application.rb

Pour servir votre application dans un sous-répertoire, il faut utiliser l’option relative_url_root.

Cette option se change dans le fichier config/application.rb

config.relative_url_root = "/fr"

Configuration de Nginx

La configuration a été modifiée pour changer le « location / » en « location /fr ».

Nous avons rajouté un règle de réécriture pour gérer les assets rails qui sont servis directement par Nginx.

  • La configuration de notre vhost nginx
upstream thin_cluster {
    server unix:/var/www/myapp/shared/tmp/sockets/thin.0.sock;
    server unix:/var/www/myapp/shared/tmp/sockets/thin.1.sock;
}

server {
    listen 80;
    server_name  www.mydomain.com

    root /var/www/myapp/current/public;
    index.html;

    location ~ ^/fr/assets/  {
            rewrite ^/fr(.*)$ $1 last;
    }

    location /fr {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host:$server_port;
        proxy_redirect off;

        if (-f $request_filename/index.html) {
            rewrite (.*) $1/index.html break;
        }

        if (-f $request_filename.html) {
            rewrite (.*) $1.html break;
        }

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

 

 

 

admin