Pular para o conteúdo principal

Rails + Puma + Ngnix + Ubuntu

Para colocar em produção uma aplicação Rails com Puma e Nginx no Ubuntu (aqui utilizei o Ubuntu 16.04) de uma forma bem simples basta a seguintes configurações, todas elas retiradas de pontos diferentes da internet:

Primeiro em /diretorio/do/app/rails/config/puma.rb:
# Change to match your CPU core count
workers 1

threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i
threads threads_count, threads_count

app_dir = File.expand_path("../..", __FILE__)
shared_dir = "#{app_dir}/shared"

rails_env = ENV['RAILS_ENV'] || "production"
environment rails_env

# Set up socket location
bind "unix://#{shared_dir}/sockets/puma.sock"

# Logging
stdout_redirect "#{shared_dir}/log/puma.stdout.log", "#{shared_dir}/log/puma.stderr.log", true

# Set master PID and state locations
pidfile "#{shared_dir}/pids/puma.pid"
state_path "#{shared_dir}/pids/puma.state"
activate_control_app

on_worker_boot do
  require "active_record"
  ActiveRecord::Base.connection.disconnect! rescue ActiveRecord::ConnectionNotEstablished
  ActiveRecord::Base.establish_connection(YAML.load_file("#{app_dir}/config/database.yml")[rails_env])
end
É necessário criar uma estrutura de diretórios para os arquivos necessários para execução do Puma. No caso vamos criar dentro do diretório \var\www\ os seguintes diretórios:
\var\www\shared\pids
\var\www\shared\sockets
\var\www\shared\log
Depois, na configuração do site no Nginx no arquivo /etc/nginx/sites-enabled/default:
upstream app {
  # Path to Puma SOCK file, as defined previously
  server unix:/var/www/shared/sockets/puma.sock fail_timeout=0;
}

server {
  listen 80;
  server_name [domínio];

  root /var/www/[rails_app]/public;

  try_files $uri/index.html $uri @app;
  location @app {
    proxy_pass http://app;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;
}
 Após isso precisamos criar um script para iniciar o Puma no boot do sistema. Vamos criar um arquivo em /etc/systemd/system/puma.service com o seguinte conteúdo:
[Unit]
Description=Puma HTTP Server
After=network.target

# Uncomment for socket activation (see below)
# Requires=puma.socket

[Service]
# Foreground process (do not use --daemon in ExecStart or config.rb)
Type=simple

# Preferably configure a non-privileged user
User=www-data
Group=www-data

# Specify the path to your puma application root
WorkingDirectory=/var/www/[app]

# Helpful for debugging socket activation, etc.
# Environment=PUMA_DEBUG=1
# EnvironmentFile=/home/deployer/app/.env

# The command to start Puma
# ExecStart=/sbin/puma -b tcp://0.0.0.0:9292 -b ssl://0.0.0.0:9293?key=key.pem&cert=cert.pem
# ExecStart=/usr/local/bin/bundle exec --keep-file-descriptors puma -e production
ExecStart=/usr/local/bin/puma -C /var/www/[app]/config/puma.rb

Restart=always

[Install]
WantedBy=multi-user.target
 Após configurarmos o sistema podemos iniciar o Puma com o comando
systemctl start puma
Depois, para configurarmos o Puma para iniciar na inicialização do sistema, basta rodar o seguinte comando:
systemctl enable puma
Pronto, os sistema já está configurado.

Lembrando que essa é uma configuração bem básica, e é interessante buscar mais opções para melhorar essa configuração.


Comentários

Postagens mais visitadas deste blog

Jquery-rails - Problema ao cancelar uma confirmação

No projeto que estou desenvolvendo agora me deparei com o seguinte problema: ao clicar em um link para excluir um registro, clicando em cancelar no diálogo de confirmação a exclusão era executada. Solução: Substituir o arquivo rails.js pelo arquivo mais recente https://github.com/rails/jquery-ujs/blob/master/src/rails.js .

GWT

Neste post informei que estava começando um projeto particular e que utilizaria as seguintes tecnologias: JSP , Servlet , Struts , Hibernate . Bom, após uma tentativa frustrada de utilizar o YUI (Yahoo User Interface) diretamente com o Struts , decidi tentar aprender somente o que precisava saber sobre Struts primeiro, antes de utilizar alguma coisa diferente no projeto , como interface com AJAX que é o caso do YUI . Novamente fiquei frustrado. Bom, aprendi os conceitos do Struts , fiz alguns testes que funcionaram perfeitamente, inclusive com acesso ao banco de dados utilizando Hibernate . Mas o que me frustrou foi em relação justamente à interface. O motivo dessa frustração foi por que não existe uma padronização que todos todos concordem para integrar o Struts com o JSP . Pesquisando, alguns diziam que o melhor era utilizar as JSTL padronizadas, já para alguns casos a maioria dos desenvolvedores recomendavam a utilização das taglibs do próprio Struts ... Não encontrando...

Efeitos interessantes no buscador do Google

Não sei quando foi alterado, mas hoje quando acessei pela primeira vez o buscador do Google me deparei com a seguinte tela: Nunca havia visto essa página mais limpa... Porém as demais informações aparecem após algum evento, como a movimentação do mouse, a utilização do Tab ou Enter. Bem interessante, e vem da política da Google de manter suas páginas o mais simples possível e, claro, destacar ainda mais sua marca.