{"id":21516,"date":"2016-06-10T13:00:51","date_gmt":"2016-06-10T16:00:51","guid":{"rendered":"https:\/\/blog.locaweb.com.br\/?p=21516"},"modified":"2022-08-31T16:54:11","modified_gmt":"2022-08-31T19:54:11","slug":"configurando-nginx-para-rodar-duas-aplicacoes","status":"publish","type":"post","link":"https:\/\/www.locaweb.com.br\/blog\/temas\/codigo-aberto\/configurando-nginx-para-rodar-duas-aplicacoes\/","title":{"rendered":"Configurando Nginx para rodar duas aplica\u00e7\u00f5es Rails"},"content":{"rendered":"<p><span style=\"font-weight: 400\">Quando estamos trabalhando com desenvolvimento de sites e aplica\u00e7\u00f5es web, sempre vem a d\u00favida de como hospedar e manter os sistemas dispon\u00edveis para os usu\u00e1rios. \u00c9 muito comum o uso do Apache em aplica\u00e7\u00f5es pequenas, mas quando falamos de algo mais robusto, com grande fluxo de dados, o Nginx (leia-se <\/span><i><span style=\"font-weight: 400\">Engine-EX<\/span><\/i><span style=\"font-weight: 400\">) \u00e9 o recomendado.<\/span><\/p>\n<p><span style=\"font-weight: 400\">As vantagens de se usar o Nginx como servidor web ao inv\u00e9s dos concorrentes s\u00e3o muitas: o Nginx \u00e9 muito f\u00e1cil de instalar e configurar; possui uma \u00f3tima performance servindo arquivos est\u00e1ticos como imagens e v\u00eddeos; \u00e9 otimizado para conex\u00f5es concorrentes, e; funciona como balanceador de cargas\u2026 Se voc\u00ea ainda n\u00e3o se convenceu, vale lembrar que grandes servi\u00e7os como Yahoo, YouTube e Instagram fazem uso do Nginx para otimizar o tempo de resposta.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Neste post, vamos abordar um cen\u00e1rio onde voc\u00ea tem duas aplica\u00e7\u00f5es Rails distintas que s\u00e3o acess\u00edveis por dom\u00ednios diferentes. Para facilitar as coisas, caso voc\u00ea ainda n\u00e3o tenha dois dom\u00ednios, crie no hosts de sua m\u00e1quina dom\u00ednios fict\u00edcios. Aqui, usarei os dom\u00ednios <\/span><i><span style=\"font-weight: 400\">meuapp.com<\/span><\/i><span style=\"font-weight: 400\"> e <\/span><i><span style=\"font-weight: 400\">dominio.com<\/span><\/i><span style=\"font-weight: 400\">.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Para fazer essa configura\u00e7\u00e3o, edite o arquivo <\/span><i><span style=\"font-weight: 400\">\/etc\/hosts<\/span><\/i><span style=\"font-weight: 400\"> e adicione as seguintes linhas:<\/span><\/p>\n<p>[sourcecode language=&#8221;bash&#8221;]<br \/>\n127.0.0.1          meuapp.com<br \/>\n127.0.0.1          dominio.com<br \/>\n[\/sourcecode]<\/p>\n<p><span style=\"font-weight: 400\">Antes de colocarmos a m\u00e3o na massa, voc\u00ea precisa saber de mais algumas coisas: <\/span><\/p>\n<p><b>O condom\u00ednio de aplica\u00e7\u00f5es<\/b><\/p>\n<p><span style=\"font-weight: 400\">Se voc\u00ea programa em Rails j\u00e1 deve ter tentado subir duas aplica\u00e7\u00f5es apenas com o comando <\/span><i><span style=\"font-weight: 400\">rails s<\/span><\/i><span style=\"font-weight: 400\">. Fazer isso sem definir portas diferentes ocasiona um erro. O servidor do Rails identifica que outra porta j\u00e1 est\u00e1 em uso e n\u00e3o permite subir um outro servidor na mesma porta. Para entender melhor, pense em um condom\u00ednio de apartamentos. Cada apartamento tem sua porta de entrada e se voc\u00ea quer entrar no apartamento 302, voc\u00ea n\u00e3o utiliza a porta do apartamento 403. Assim como em um condom\u00ednio, n\u00e3o da para acessar uma aplica\u00e7\u00e3o atrav\u00e9s de uma porta que j\u00e1 est\u00e1 criada para outra. <\/span><\/p>\n<p><b>E a porta 80?<\/b><\/p>\n<p><span style=\"font-weight: 400\">Por padr\u00e3o, a porta 80 \u00e9 reservada para o <\/span><i><span style=\"font-weight: 400\">http<\/span><\/i><span style=\"font-weight: 400\">. Quem trabalha com PHP e Apache e n\u00e3o sabia disso pode estar achando um pouco estranho, j\u00e1 que aplica\u00e7\u00f5es PHP rodando local com Apache s\u00e3o comumente acess\u00edveis pela porta 80. O que acontece, na verdade, \u00e9 que os servidores web (tanto o Nginx quanto o Apache) recebem as requisi\u00e7\u00f5es <\/span><i><span style=\"font-weight: 400\">http<\/span><\/i><span style=\"font-weight: 400\"> por esta porta e repassam para as aplica\u00e7\u00f5es rodando em portas diferentes. No caso do Apache, ele executa o PHP atrav\u00e9s de m\u00f3dulos internos e por tanto n\u00e3o abre uma nova porta, mas atrav\u00e9s de algumas configura\u00e7\u00f5es \u00e9 poss\u00edvel configurar diferentes portas para diferentes aplica\u00e7\u00f5es.<\/span><\/p>\n<p><b>Talk is cheap, show me the code\u2026<\/b><\/p>\n<p><span style=\"font-weight: 400\">Agora que voc\u00ea sabe o b\u00e1sico, podemos iniciar nossos trabalhos configurando duas aplica\u00e7\u00f5es em um mesmo servidor. Todos os procedimentos realizados aqui est\u00e3o sendo feitos em um servidor <\/span><i><span style=\"font-weight: 400\">Cloud Server Pro<\/span><\/i><span style=\"font-weight: 400\"> da Locaweb. O servidor \u00e9 munido de um Debian 8, ent\u00e3o, se voc\u00ea est\u00e1 rodando o Ubuntu, n\u00e3o se preocupe.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Vamos come\u00e7ar instalando o Nginx<\/span><\/p>\n<p>[sourcecode language=&#8221;bash&#8221;]<br \/>\n$ sudo apt-get install nginx<br \/>\n[\/sourcecode]<\/p>\n<p><span style=\"font-weight: 400\">Ap\u00f3s a instala\u00e7\u00e3o, devemos iniciar a configura\u00e7\u00e3o do nosso servidor para rodar dois sites ou aplica\u00e7\u00f5es ao mesmo tempo. O Nginx guarda os arquivos de configura\u00e7\u00e3o na pasta <\/span><i><span style=\"font-weight: 400\">\/etc\/nginx<\/span><\/i><span style=\"font-weight: 400\">. Ao acessar esse diret\u00f3rio, voc\u00ea perceber\u00e1 a presen\u00e7a de algumas pastas, mas neste post utilizaremos apenas as pastas sites-available e sites-enabled.<\/span><\/p>\n<p><span style=\"font-weight: 400\">A partir de agora voc\u00ea j\u00e1 deve ter suas aplica\u00e7\u00f5es rodando em portas diferentes. No meu caso, tenho duas aplica\u00e7\u00f5es Rails, uma na porta 3000 e outra na porta 3030. Para subir uma aplica\u00e7\u00e3o Rails em uma porta espec\u00edfica, voc\u00ea pode rodar:<\/span><\/p>\n<p>[sourcecode language=&#8221;bash&#8221;]$ rails s -p 3030[\/sourcecode]<\/p>\n<p><span style=\"font-weight: 400\">A configura\u00e7\u00e3o come\u00e7a na pasta sites-available, que \u00e9 onde voc\u00ea deve guardar um arquivo de configura\u00e7\u00e3o para cada aplica\u00e7\u00e3o. Se voc\u00ea n\u00e3o vai se aprofundar muito nas configura\u00e7\u00f5es, \u00e9 poss\u00edvel fazer tudo no mesmo arquivo. Por\u00e9m, o recomendado \u00e9 que cada aplica\u00e7\u00e3o tenha seu pr\u00f3prio arquivo de configura\u00e7\u00e3o para facilitar manuten\u00e7\u00f5es futuras.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Para a aplica\u00e7\u00e3o rodando no dom\u00ednio <\/span><i><span style=\"font-weight: 400\">meuapp.com<\/span><\/i><span style=\"font-weight: 400\">, crie o arquivo <\/span><i><span style=\"font-weight: 400\">meuapp<\/span><\/i><span style=\"font-weight: 400\"> dentro de <\/span><i><span style=\"font-weight: 400\">sites-available<\/span><\/i><span style=\"font-weight: 400\">. Quando o Nginx processa cada requisi\u00e7\u00e3o, ele busca na configura\u00e7\u00e3o por um \u201c<\/span><i><span style=\"font-weight: 400\">virtual server<\/span><\/i><span style=\"font-weight: 400\">\u201d, que \u00e9 representado pelo bloco <\/span><b>server<\/b><\/p>\n<p>[sourcecode language=&#8221;bash&#8221;]<br \/>\nserver {<br \/>\n    #configura\u00e7\u00f5es<br \/>\n}<br \/>\n[\/sourcecode]<\/p>\n<p><span style=\"font-weight: 400\">Esse bloco, normalmente, cont\u00e9m a diretiva <\/span><b>listen<\/b><span style=\"font-weight: 400\"> que diz qual o IP e a porta em que o servidor est\u00e1 esperando por requisi\u00e7\u00f5es<\/span><\/p>\n<p>[sourcecode language=&#8221;bash&#8221;]<br \/>\nserver {<br \/>\n    listen 80;<br \/>\n}<br \/>\n[\/sourcecode]<\/p>\n<p><span style=\"font-weight: 400\">Ao omitir o IP, o Nginx entende que as requisi\u00e7\u00f5es podem ser recebidas de qualquer endere\u00e7o. Se v\u00e1rios blocos est\u00e3o esperando requisi\u00e7\u00f5es pelo mesmo endere\u00e7o e porta, o Nginx passa a verificar o cabe\u00e7alho das requisi\u00e7\u00f5es pelo <\/span><b>host <\/b><span style=\"font-weight: 400\">e compara com o <\/span><b>server_name<\/b><span style=\"font-weight: 400\">.<\/span><\/p>\n<p>[sourcecode language=&#8221;bash&#8221;]<br \/>\nserver {<br \/>\n    listen 80;<br \/>\n    server_name meuapp.com www.meuapp.com;<br \/>\n}<br \/>\n[\/sourcecode]<\/p>\n<p><span style=\"font-weight: 400\">O Nginx pode repassar a requisi\u00e7\u00e3o para outro server ou at\u00e9 mesmo servir um arquivo est\u00e1tico, isso \u00e9 feito atr\u00e1ves do bloco <\/span><b>location<\/b><span style=\"font-weight: 400\"> que fica dentro de <\/span><b>server<\/b><span style=\"font-weight: 400\">.<\/span><\/p>\n<p>[sourcecode language=&#8221;bash&#8221;]<br \/>\nserver {<br \/>\n    listen 80;<br \/>\n    server_name meuapp.com www.meuapp.com;<\/p>\n<p>    location \/ {<\/p>\n<p>    }<br \/>\n}<br \/>\n[\/sourcecode]<\/p>\n<p><span style=\"font-weight: 400\">O bloco <\/span><b>location<\/b><span style=\"font-weight: 400\"> cont\u00e9m diretivas que dizem ao Nginx o que fazer com a requisi\u00e7\u00e3o. No nosso cen\u00e1rio, vamos redirecionar as requisi\u00e7\u00f5es ao servidor Rails que est\u00e1 rodando nas portas 3000 e 3030 no nosso ambiente local. Por padr\u00e3o, o ambiente local (localhost) possui o IP 127.0.0.1.<\/span><\/p>\n<p>[sourcecode language=&#8221;bash&#8221;]<br \/>\nserver {<br \/>\n    listen 80;<br \/>\n    server_name meuapp.com www.meuapp.com;<\/p>\n<p>    location \/ {<br \/>\n        proxy_pass http:\/\/127.0.0.1:3000;<br \/>\n    }<br \/>\n}<br \/>\n[\/sourcecode]<\/p>\n<p><span style=\"font-weight: 400\">A diretiva <\/span><b>proxy_pass<\/b><span style=\"font-weight: 400\"> \u00e9 respons\u00e1vel por transmitir a requisi\u00e7\u00e3o a um servidor com proxy e retornar a resposta ao cliente.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Sendo assim, j\u00e1 temos nosso arquivo de configura\u00e7\u00e3o para o dom\u00ednio <\/span><i><span style=\"font-weight: 400\">meuapp.com<\/span><\/i><span style=\"font-weight: 400\">. Se voc\u00ea entendeu bem o funcionamento do Nginx para essa situa\u00e7\u00e3o, criar uma configura\u00e7\u00e3o para o dom\u00ednio <\/span><i><span style=\"font-weight: 400\">dominio.com<\/span><\/i><span style=\"font-weight: 400\"> deve ser trivial. Apenas crie o arquivo <\/span><i><span style=\"font-weight: 400\">dominio<\/span><\/i><span style=\"font-weight: 400\"> dentro da pasta <\/span><i><span style=\"font-weight: 400\">sites-available<\/span><\/i><span style=\"font-weight: 400\"> e coloque as configura\u00e7\u00f5es assim como foi feito para o arquivo <\/span><i><span style=\"font-weight: 400\">meuapp<\/span><\/i><span style=\"font-weight: 400\">.<\/span><\/p>\n<p>[sourcecode language=&#8221;bash&#8221;]<br \/>\nserver {<br \/>\n    listen 80;<br \/>\n    server_name dominio.com www.dominio.com;<\/p>\n<p>    location \/ {<br \/>\n        proxy_pass http:\/\/127.0.0.1:3030;<br \/>\n    }<br \/>\n}<br \/>\n[\/sourcecode]<\/p>\n<p><span style=\"font-weight: 400\">Tentar acessar algum dos dom\u00ednios vai te levar a uma p\u00e1gina inicial do Nginx que n\u00e3o \u00e9 o que voc\u00ea esperava. Para ser direcionado diretamente a sua aplica\u00e7\u00e3o, devemos dizer ao Nginx quais sites est\u00e3o ativados. Faremos isso criando um link simb\u00f3lico na pasta <\/span><i><span style=\"font-weight: 400\">sites-enabled<\/span><\/i><span style=\"font-weight: 400\"> para os arquivos da pasta <\/span><i><span style=\"font-weight: 400\">sites-available<\/span><\/i><span style=\"font-weight: 400\">.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Acesse a pasta <\/span><i><span style=\"font-weight: 400\">sites-enabled<\/span><\/i><span style=\"font-weight: 400\"> e, para o dom\u00ednio <\/span><i><span style=\"font-weight: 400\">dominio.com<\/span><\/i><span style=\"font-weight: 400\"> fa\u00e7a o seguinte:<\/span><\/p>\n<p>[sourcecode language=&#8221;bash&#8221;]$ sudo ln -s ..\/sites-available\/dominio .[\/sourcecode]<\/p>\n<p><span style=\"font-weight: 400\">Agora, para o dom\u00ednio <\/span><i><span style=\"font-weight: 400\">meuapp.com<\/span><\/i><span style=\"font-weight: 400\">, fa\u00e7a:<\/span><\/p>\n<p>[sourcecode language=&#8221;bash&#8221;]$ sudo ln -s ..\/sites-available\/meuapp .[\/sourcecode]<\/p>\n<p>Recarregue os arquivos de configura\u00e7\u00e3o do Nginx com o comando<\/p>\n<p>[sourcecode language=&#8221;bash&#8221;]$ sudo service nginx reload[\/sourcecode]<\/p>\n<p><span style=\"font-weight: 400\">Agora, se testar cada um dos dom\u00ednios, voc\u00ea deve ver sua aplica\u00e7\u00e3o.\u00a0<\/span><span style=\"font-weight: 400\">Essa \u00e9 uma configura\u00e7\u00e3o simples do Nginx. Se voc\u00ea trabalha com PHP, nos veremos em outro post aqui no Blog da Locaweb que mostrar\u00e1 como configurar o php_fpm para servir aplica\u00e7\u00f5es PHP.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Espero que tenham curtido. Nos vemos no pr\u00f3ximo post.<\/span><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quando estamos trabalhando com desenvolvimento de sites e aplica\u00e7\u00f5es web, sempre vem a d\u00favida de como hospedar e manter os sistemas dispon\u00edveis para os usu\u00e1rios. \u00c9 muito comum o uso do Apache em aplica\u00e7\u00f5es pequenas, mas quando falamos de algo mais robusto, com grande fluxo de dados, o Nginx (leia-se Engine-EX) \u00e9 o recomendado. As [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":21639,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[5],"tags":[],"class_list":["post-21516","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-aberto"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/posts\/21516","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/comments?post=21516"}],"version-history":[{"count":1,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/posts\/21516\/revisions"}],"predecessor-version":[{"id":36494,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/posts\/21516\/revisions\/36494"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/media\/21639"}],"wp:attachment":[{"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/media?parent=21516"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/categories?post=21516"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/tags?post=21516"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}