Back-End

14 set, 2012

Instalando Nginx com RVM para aplicações Rails

Publicidade

Olá, pessoal! Hoje eu resolvi fazer algo que estava no meu dashboard há um bom tempo: explicar o básico para se levantar uma aplicação Rails e Nginx em um servidor Linux. Minha intenção é passar os caminhos básicos de como configurar o Nginx, o Passenger e o RVM em um servidor Linux. O processo é relativamente simples.

Antes de começar o processo de instalação, é necessário que você possua acesso de administrador do sistema, ou seja, acesso ao usuário root. Caso você não possua esse nível de acesso, os comandos abaixo não darão certo.

Algumas distribuições não permitem o acesso direto ao usuário root, exigindo que você tenha uma conta de usuário normal e só então, a partir dele, mudar o nível de acesso para o root, isso normalmente é feito através do comando sudo. Se for o seu caso, sugiro rodar o comando sudo su – que fará você mudar o nível de privilégios para administrador do sitema, aí é só seguir os passos abaixo.

Instalando o RVM

O processo de instalação do RVM não possui muitos mistérios, basta seguir o processo de instalação disponível no site do RVM. Mas para que você não tenha dúvidas, segue a linha a ser executada:

curl -L https://get.rvm.io | bash -s stable --ruby

Este comando fará a instalação do RVM no sistema, e logo em seguida a instalação da a última versão do Ruby disponível (no momento, a versão mais atual é a 1.9.3-p194).

A instalação do RVM requer o uso do curl, portanto é preciso ter ele instalado, verifique como instalar esse software em sua distribuição/versão de Linux.

Caso ocorra algum erro na instalação do Ruby é bem provável que seja pela ausência de alguma dependência na distribuição utilizada. Para fazer um levantamento e identificar se falta algo, rode o comando rvm requirements. Siga os procedimentos informados e após terminar tente novamente instalar o Ruby:

rvm install 1.9.3 #ou a versão que deseja

Instalando o Passenger

Esse talvez seja o passo mais fácil. O passenger é uma gem que por sua vez possui um script que auxilia em todo o processo, como estamos fazendo a instalação em um ambiente servidor nós podemos instalar a gem sem os arquivos de documentação:

gem install passenger --no-ri --no-rdoc

Pronto, agora já temos o passenger instalado. Entretanto, ele sozinho não fará muita coisa por você, ou melhor, por sua aplicação. Vamos agora instalar o Nginx.

Instalando o Nginx

Infelizmente não podemos utilizar o Nginx provido pela distribuição Linux que você está usando, isso porque o Nginx não possui o suporte a módulos, algo que o Apache tem, que seria a possibilidade de instalar o Nginx e depois apenas os módulos que necessários (php, ruby, etc.). Para o nosso caso será necessário (re)compilar o Nginx habilitando o suporte ao Passenger e é justamente isso que vamos abordar no próximo tópico.

Instalando o Nginx com suporte ao Passenger (usando o assistente)

Nós utilizaremos o instalador provido pela gem passenger. Esse script fará todo o trabalho sujo por você, baixando o Nginx, configurando e compilando. Esse processo é recomendado para aqueles que estão começando e querem algo funcional de forma simples. Vamos lá então:

passenger-install-nginx-module

O script fará uma série de perguntas, vou documentar cada uma delas e explicar para que você se sinta seguro.

Logo no início será apresentado um texto informativo sobre o que será realizado durante o processo de instalação. Nessa primeira parte será solicitado que você pressione <ENTER> para continuar, ou <CTRL>-C caso tenha se arrependido e queira abortar a instalação. É óbvio que vamos continuar, então, <ENTER>.

Logo em seguid,a o script fará um checklist sobre todas as dependências necessárias para compilar o Passenger e o Nginx. Dntre os itens verificados estão: compilador, make, curl ou wget, headers do Ruby (bibliotecas necessárias para compilação), rubygems, rack, openssl, zlib, etc. Caso algum deles esteja faltando, o script fará o alerta e mostrará o que fazer para resolver as dependências. Se for o seu caso, instale as dependências e depois volte a executar o comando passenger-install-nginx-module novamente.

Após o checklist de dependências, o script solicitará qual o método você utilizará para instalar o Nginx + Passenger:

Automatically download and install Nginx?

Nginx doesn't support loadable modules such as some other web servers do,
so in order to install Nginx with Passenger support, it must be recompiled.

Do you want this installer to download, compile and install Nginx for you?

 1. Yes: download, compile and install Nginx for me. (recommended)
    The easiest way to get started. A stock Nginx 1.0.10 with Passenger
    support, but with no other additional third party modules, will be
    installed for you to a directory of your choice.

 2. No: I want to customize my Nginx installation. (for advanced users)
    Choose this if you want to compile Nginx with more third party modules
    besides Passenger, or if you need to pass additional options to Nginx's
    'configure' script. This installer will  1) ask you for the location of
    the Nginx source code,  2) run the 'configure' script according to your
    instructions, and  3) run 'make install'.

Whichever you choose, if you already have an existing Nginx configuration file,
then it will be preserved.

Selecione a opção 1 e pressione <ENTER>. Nesta opção será feito o download e compilação do Nginx com suporte ao Passenger pelo próprio script. Logo após será feito um novo questionamento, desta vez sobre qual será o local onde o Nginx será instalado. Eu prefiro escolher um local diferente por questões de gosto e costume, em meus processos de instalação eu utilizo o path /usr/local/nginx – fique a vontade para escolher qual deles utilizar.

Where do you want to install Nginx to?

Please specify a prefix directory [/opt/nginx]: /usr/local/nginx

Faça a sua escolha e pressione <ENTER> para dar início a compilação, agora é só esperar finalizar o processo.

Ao finalizar a compilação e instalação do Nginx, o script exibe alguns parâmetros que devem ser definidos na configuração do Nginx para ativar o Passenger. Nós não precisamos nos preocupar com isso agora, pois o script de instalação já injetou essas diretivas no arquivo de configuração do Nginx, mas vale a pena registrar para não ter dúvidas:

Nginx with Passenger support was successfully installed.

The Nginx configuration file (/usr/local/nginx/conf/nginx.conf)
must contain the correct configuration options in order for Phusion Passenger
to function correctly.

This installer has already modified the configuration file for you! The
following configuration snippet was inserted:

  http {
      ...
      passenger_root /usr/local/rvm/gems/ruby-1.9.3-p194/gems/passenger-3.0.15;
      passenger_ruby /usr/local/rvm/wrappers/ruby-1.9.3-p194/ruby;
      ...
  }

After you start Nginx, you are ready to deploy any number of Ruby on Rails
applications on Nginx.

Pressione <ENTER> e outra mensagem informativa será exibida. Desta vez é exibido um trecho de configuração da seção server dos arquivos de configuração do Nginx – essa seção é utilizada justamente para configurar uma aplicação/site no Nginx. Ela não é inserida automaticamente, precisaremos setar isso quando da configuração de nossa aplicação.

Organizando a instalação

Vamos agora dar uma organizada para termos menos trabalho no futuro, até para melhorar a manutenção. Como é padrão das distribuições Linux, os arquivos de configuração devem ficar no path /etc. Sendo assim, ficaria melhor se a configuração do Nginx ficasse em /etc/nginx. Vamos criar um link simbólico dos arquivos de configuração do Nginx para o /etc/nginx:

ln -s /usr/local/nginx/conf /etc/nginx

Outra melhoria que podemos fazer é colocar o binário do Nginx em um path globalmente reconhecido pelo Linux. Para isso vamos criar outro link simbólico:

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/nginx

Configurando o Nginx

O Nginx é instalado com um arquivo default de configuração. Não vou cobrir todo esse processo, no lugar eu sugiro que você baixe e use o arquivo de configuração abaixo:

user www-data;
worker_processes 4;
pid /var/run/nginx.pid;

events {
worker_connections 512;
multi_accept on;
}

http {

        sendfile on;
tcp_nopush on;
tcp_nodelay on;

        # Paths para o passenger e o ruby utilizados
passenger_root /usr/local/rvm/gems/ruby-1.9.3-p194/gems/passenger-3.0.15;
passenger_ruby /usr/local/rvm/wrappers/ruby-1.9.3-p194/ruby;

        # Vide mais configurações em: http://www.modrails.com/documentation/Users%20guide%20Nginx.html
passenger_max_pool_size 4;
passenger_max_instances_per_app 2;
passenger_pool_idle_time 10;
passenger_log_level 2;

# Buffer
client_body_buffer_size 8K;
client_header_buffer_size 1k;
client_max_body_size 5m;
large_client_header_buffers 2 1k;

# Timeouts
client_body_timeout 10;
client_header_timeout 10;
keepalive_timeout 15;
send_timeout 10;

types_hash_max_size 2048;

include /etc/nginx/mime.types;
default_type application/octet-stream;

##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";

gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        # Para melhorar a organização os .conf foram separados em conf.d e sites-enabled (no estilo do Apache)
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}

A seguir vamos criar algumas pastas para organizar melhor os arquivos de configuração:

mkdir /etc/nginx/conf.d
mkdir /etc/nginx/sites-enabled
mkdir /etc/nginx/sites-available

Configurando seu domínio

Pronto! Quase tudo configurado. Agora só falta configurar o Nginx para responder pelo domínio de seu site e para isso usaremos a diretiva server – vamos utilizar como exemplo o meu domínio almirmendes.com. Vamos criar um arquivo em /etc/nginx/sites-available/ com o nome do seu domínio (o nome não importa, pode ser qualquer um):

vim /etc/nginx/sites-available/almirmendes.com

Eu tenho, no Gist abaixo, uma configuração que você pode utilizar como exemplo, apenas lembre-se de trocar as entradas que tiverem almirmendes.com pelo seu domínio:

server {
listen 80;
server_name almirmendes.com www.almirmendes.com;

        # Este é o path onde está hospedada sua aplicação Rails, ele pode ficar onde você quiser, entretanto
        # é comum coloca-los em uma pasta na home de algum usuário ou mesmo em /var/www/. Independente disto
        # o que é necessário aqui é que você adicione o path da pasta public de sua aplicação Rails.
        # Importantíssimo, se você utiliza o Capistrano para fazer deploy de sua aplicação, lembre-se de adicionar
        # o current antes do public
root /home/m3nd3s/almirmendes.com/public;
        passenger_enabled on;

        # Comente a linha acima e descomente a abaixo se utiliza capistrano
        # root /home/m3nd3s/almirmendes.com/current/public;

#error_page 404 /404.html;

        # Forcando o www na url
        if ($host !~* ^www\.) {
            rewrite ^(.*)$ http://www.$host$1 permanent;
        }

#Configuracao de expiracao para imagens e outros arquivos
location ~* \.(ico|css|js|swf|html|htm)(\?[0-9]+)?$ {
if (-f $request_filename) {
access_log off;
expires 5d;
break;
}
}

location ~* /(images|system|public) {
if (-f $request_filename) {
access_log off;
expires 5d;
break;
}
}

location ~ /\. { deny all; }
}

Agora vamos fazer um link simbólico do arquivo almirmendes.com para a pasta `/etc/nginx/sites-enabled/. Se reparar no arquivo de configuração acima, no gist 3482847, ela é a única que está sendo lida pelo Nginx. Esta é a forma que temos para ativar uma configuração nova de site. Com isso habilitaremos o site:

ln -s /etc/nginx/sites-available/almirmendes.com /etc/nginx/sites-enabled/almirmendes.com

Se algum dia precisar desativar o site, basta remover o link simbólico em /etc/nginx/sites-enabled/almirmendes.com. Você ainda terá o arquivo de configuração intacto em /etc/nginx/sites-available.

Para testar a configuração, use o seguinte comando:

nginx -t

Se no resultado do comando acima aparecer algo semelhante ao exibido abaixo é sinal de que está tudo correto, agora só falta inicializarmos o Nginx:

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

Script de inicialização do Nginx

Por fim, falta só adicionar ao sistema o script de inicialização do Nginx. Sugiro que baixe o que está disponível neste link e salve-o em /etc/init.d/nginx. :

chmod +x /etc/init.d/nginx # permissão de execução para o script
service nginx start #inicializa o nginx

Existem inúmeras outas informações a serem adicionadas ao artigo, entretanto não queria deixá-lo ainda maior. Espero que ajude você a configurar o Nginx. Qualquer dúvida, estou a disposição.

Abraços!