Nginx, Unicorn e vários aplicativos Rails

É realmente fácil fazer um aplicativo rails rodar usando unicorn + nginx, mas quando se trata de vários aplicativos, as coisas ficam muito mais difíceis, bem, pelo menos foi o que pensei.

O que eu quero é tornar a pasta raiz (“/”) um local no servidor onde você pode colocar HTML ou PHP e usar subdiretórios como “/ app1”, por exemplo, para fornecer um aplicativo rails. Fazer isso corretamente torna muito mais fácil implantar outros aplicativos usando pastas em vez de portas http. Foi muito difícil encontrar essa maneira melhor / mais fácil de executar vários aplicativos Rails e é isso que me faz querer compartilhar com vocês.

Neste post vou mostrar como fazer seu servidor rodar rails no subdiretório. Para este tutorial, estou usando Ruby 2.0 e Rails 4.0. Suponho que você já tenha o nginx e o unicórnio instalados. Então vamos começar!

Em seu arquivo nginx.conf, faremos o nginx apontar para um soquete de unicórnio:

upstream unicorn_socket_for_myapp {
server unix
:/home/user/apps/myapp/current/tmp/sockets/unicorn.sock fail_timeout=0;
}

Em seguida, com seu servidor ouvindo a porta 80, adicione um bloco de localização que aponta para o subdiretório do seu aplicativo Rails (este código deve estar dentro do bloco de servidor):

location /myapp/ {
try_files $uri
@unicorn_proxy;
}

location
@unicorn_proxy {
proxy_pass http
://unix:/home/user/apps/myapp/current/tmp/sockets/unicorn.sock;
proxy_set_header X
-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header
Host $http_host;
proxy_redirect off
;
proxy_set_header X
-Forwarded-Proto $scheme;
}

Agora você pode apenas Unicórnio como um Deamon:

sudo unicorn_rails -c config / unicorn.rb -D
A última coisa a fazer, e a que eu mais descobri, é adicionar um escopo para seu arquivo de rotas de trilhos, como este:

MyApp::Application.routes.draw do
scope
'/myapp' do
root
:to => 'welcome#home'

# other routes are always inside this block
# ...
end
end

Desta forma, seu aplicativo irá mapear um link / myapp / welcome, em vez de apenas / welcome

Além disso, precisamos fazer com que os rails o vejam em um subdiretório. No final do seu arquivo production.rb, adicione:

config.relative url root = “/ myapp”
Então, agora nosso aplicativo abre usando o subdiretório “/ myapp”, mas, ei! Onde estão meus ativos? Bem, rails ainda acredita que seus ativos estão em “/ assets” quando deveriam estar em “/ myapp / assets”. Vamos resolver isso:

Em seu arquivo config / applcation.rb, adicione:

config.assets.prefix = “/ myapp / assets”
Se no ambiente de produção seu css ou js não estiverem sendo encontrados, talvez empacote os recursos exec rake: pré- compilar RAILS RELATIVE URL_ROOT = / mypapp resolve o problema.

Agora terminamos. 🙂