Skip to content

Instantly share code, notes, and snippets.

@sauloarruda
Created April 17, 2012 19:01
Show Gist options
  • Star 13 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save sauloarruda/2408305 to your computer and use it in GitHub Desktop.
Save sauloarruda/2408305 to your computer and use it in GitHub Desktop.
Configurando aplicação Rails com Nginx e Unicorn

Configurando aplicação Rails com Nginx e Unicorn

TL;DR Como configurar uma aplicação Rails usando Nginx + Unicorn + Upstart + RVM (gemset por aplicação).

Dependências: (TODO) Configuração de Servidor Nginx

Essas instruções são aplicáveis para o seguinte ambiente:

  • Sistema Operacional: Ubuntu Server 12.04 beta2
  • Servidor: AWS EC2 usando ESB AMI: ubuntu/images-milestone/ebs/ubuntu-precise-12.04-beta2-amd64-server-20120328 (ami-b5ea34dc)

Porém, você pode usar as instruções e adaptá-las conforme sua necessidade para outras versões do ubuntu ou para outras distrbuições.

OBS: as variáveis #{nome da variável} devem ser alteradas para os valores do seu ambiente

Procedimento de configuração

Configurar ambiente para git

  • Criar usuário da aplicação
$ sudo useradd -b /storage/var/www -m -N -G rvm,www-data -s /bin/bash #{nome da aplicação}
$ sudo ln -s /storage/var/www/#{nome da aplicação} /var/www
  • Acessar como o usuário e criar uma chave ssh
$ sudo su - #{nome da aplicação}
$ ssh-keygen
  • Incluir o conteúdo do arquivo ~/.ssh/id_rsa.pub chave como deploy key (no github ou codeplane)

  • Clonar a aplicação. Se for migração, simplesmente copie o conteúdo para o diretório /var/www/#{nome da aplicação}/current.

 $ sudo su - #{nome da aplicação}
$ git clone #{endereço RW da aplicação} current/

Configurar unicorn

  • Antes de começar, acessar como o usuário da aplicação: $ sudo su - #{nome da aplicação}

  • Criar o arquivo de configuração do unicorn (colar o conteúdo do arquivo nº 2) $ sudo vim current/config/unicorn.rb

  • Criar RVM RC. Caso já exista, substitua o conteúdo


* Acessar a pasta para dar "trust" para o RVM RC
```$ cd current```

* Adicionar unicorn ao Gemfile
```$ echo "gem 'unicorn'" >> Gemfile```

* Rodar bundler
```$ bundle```

* Configurar banco de dados (TODO Procedimento para criar o banco de dados) (colar o conteúdo do arquivo nº 3)
```$ vim config/database.yml```

* Iniciar unicorn
```$ unicorn_rails -c config/unicorn.rb -E production -D```

* Testar unicorn
```$ ps aux | grep #{nome da sua aplicação}```
 * Se apareceu algum processo, está OK! Senão, olhe os arquivos log/unicorn.stderr.log e log/production.log para entender o que aconteceu.

* Encerrar sessão do usuário #{nome da aplicação}
``` $ exit```


### Configurar nginx

* Criar o arquivo de configuração (colar conteúdo do arquivo nº 4)
``` $ sudo vim /etc/nginx/sites-available/#{nome da aplicação} ```

* Criar link simbólico para habilitar aplicação
``` sudo ln -s /etc/nginx/sites-available/#{nome da aplicação} /etc/nginx/sites-enabled ```

* Recarregar configurações do nginx
``` $ sudo service nginx reload ```

* Teste o acesso acessando o domínio da aplicação pelo navegador. Lembre-se que você iniciou o unicorn anteriormente, se não está mais iniciado execute os dois últimos passos do processo de configuração do unicorn.
 * Em caso de problemas veja o arquivo de log do nginx em /var/log/nginx/error.log


### Configurar upstart

* Criar wrapper do RVM para o comando unicorn_rails
``` $ rvmsudo rvm wrapper 1.9.3@#{nome da aplicação} #{nome da aplicação} unicorn_rails ```

* Criar o arquivo de configuração do upstart para a aplicação (colar o conteúdo do arquivo nº 5)
``` $ sudo vim /etc/init/unicorn_#{nome da aplicação}.conf```

* Parar o processo do unicorn que já estava rodando.
``` $ sudo kill -9 `cat /var/www/#{nome da aplicação}/current/tmp/pids/unicorn.pid` ```

* Iniciar processo pelo upstart
``` $ sudo start unicorn_#{nome da aplicação} ```

* Testar unicorn
```$ ps aux | grep #{nome da sua aplicação}```
 * Se apareceu algum processo, está OK! Senão, olhe os arquivos /tmp/upstart_unicorn_#{nome da aplicação}.log /var/www/#{nome da aplicação}/log/unicorn.stderr.log e /var/www/#{nome da aplicação}/log/production.log para entender o que aconteceu.

APP_ROOT = File.expand_path(File.dirname(File.dirname(__FILE__)))
if ENV['MY_RUBY_HOME'] && ENV['MY_RUBY_HOME'].include?('rvm')
begin
rvm_path = File.dirname(File.dirname(ENV['MY_RUBY_HOME']))
rvm_lib_path = File.join(rvm_path, 'lib')
$LOAD_PATH.unshift rvm_lib_path
require 'rvm'
RVM.use_from_path! APP_ROOT
rescue LoadError
raise "RVM ruby lib is currently unavailable."
end
end
ENV['BUNDLE_GEMFILE'] = File.expand_path('../Gemfile', File.dirname(__FILE__))
require 'bundler/setup'
worker_processes 1
working_directory APP_ROOT
preload_app true
timeout 30
listen APP_ROOT + "/tmp/sockets/unicorn.sock", :backlog => 64
pid APP_ROOT + "/tmp/pids/unicorn.pid"
stderr_path APP_ROOT + "/log/unicorn.stderr.log"
stdout_path APP_ROOT + "/log/unicorn.stdout.log"
before_fork do |server, worker|
defined?(ActiveRecord::Base) && ActiveRecord::Base.connection.disconnect!
old_pid = APP_ROOT + '/tmp/pids/unicorn.pid.oldbin'
if File.exists?(old_pid) && server.pid != old_pid
begin
Process.kill("QUIT", File.read(old_pid).to_i)
rescue Errno::ENOENT, Errno::ESRCH
puts "Old master alerady dead"
end
end
end
after_fork do |server, worker|
defined?(ActiveRecord::Base) && ActiveRecord::Base.establish_connection
end
production:
adapter: mysql2
encoding: utf8
reconnect: false
host: #{host do banco de dados}
port: 3306
database: #{nome da aplicação}_production
pool: 2
username: #{nome da aplicação}
password: #{senha gerada}
upstream unicorn_#{nome da aplicação} {
server unix:/var/www/#{nome da aplicação}/current/tmp/sockets/unicorn.sock fail_timeout=0;
}
server {
listen 80;
client_max_body_size 4G;
server_name #{dominios da aplicação separados por espaço};
keepalive_timeout 5;
root /var/www/#{nome da aplicação}/current/public;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://unicorn_#{nome da aplicação};
break;
}
}
error_page 500 502 503 504 /500.html;
location = /500.html {
root /var/www/#{nome da aplicação}/current/public;
}
}
start on runlevel [2]
stop on runlevel [016]
console owner
setuid #{nome da aplicação}
exec /usr/local/rvm/bin/#{nome da aplicação}_unicorn_rails -E production -c /var/www/#{nome da aplicação}/current/config/unicorn.rb > /tmp/upstart_unicorn_#{nome da aplicação}.log 2>&1
respawn
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment