{"id":2115,"date":"2014-09-17T17:38:44","date_gmt":"2014-09-17T20:38:44","guid":{"rendered":"http:\/\/www.viazap.com.br\/?p=2115"},"modified":"2014-09-17T21:29:56","modified_gmt":"2014-09-18T00:29:56","slug":"como-configurar-um-servidor-node-js","status":"publish","type":"post","link":"https:\/\/blog.clusterweb.com.br\/?p=2115","title":{"rendered":"Como configurar um servidor Node.js"},"content":{"rendered":"<p>Neste post, estou assumindo que voc\u00ea j\u00e1 possui sua VPS instalada e configurada com o Ubuntu Server. Optei pelo Ubuntu, por ser uma distribui\u00e7\u00e3o super simples de configurar. Caso voc\u00ea n\u00e3o possua, aqui vai uma indica\u00e7\u00e3o:<\/p>\n<ol>\n<li><a href=\"http:\/\/www.clusterweb.com.br\" target=\"_blank\">ClusterWeb &#8211; Internet Data Center<\/a><\/li>\n<\/ol>\n<p>Ap\u00f3s o jab\u00e1 gratuito, o primeiro passo, \u00e9 voc\u00ea facilitar futuros acessos a m\u00e1quina, guardando sua chave p\u00fablica (~\/.ssh\/id_rsa.pub).<\/p>\n<p>O motivo deste procedimento \u00e9 para voc\u00ea n\u00e3o precisar digitar sua senha toda as vezes que acessar a VPS.<\/p>\n<h2 id=\"ssh-key\">SSH key<\/h2>\n<p>Se voc\u00ea utiliza Mac, aqui vai uma dica super simples para copiar sua chave:<\/p>\n<div class=\"highlight\">\n<pre><code class=\"bash\">cat ~\/.ssh\/id_rsa.pub <span class=\"p\">|<\/span> pbcopy\r\n<\/code><\/pre>\n<\/div>\n<p>Com este comando, sua chave j\u00e1 estar\u00e1 no seu clipboard para colar no servidor. Com sua chave em m\u00e3os, vamos nos conectar \u00e0 vps e executar os seguintes comandos:<\/p>\n<div class=\"highlight\">\n<pre><code class=\"bash\">ssh usuario@ip-de-sua-vps <span class=\"c\"># Ele vai solicitar sua senha desta vez.<\/span>\r\n<span class=\"nb\">cd<\/span> ~\/.ssh <span class=\"c\"># Caso o diret\u00f3rio .ssh n\u00e3o exista, voc\u00ea deve cri\u00e1-lo: mkdir ~\/.ssh<\/span>\r\nvi authorized_keys\r\n<\/code><\/pre>\n<\/div>\n<p>Caso o arquivo n\u00e3o exista, digite <code>touch authorized_keys<\/code>. Em alguns casos voc\u00ea precisar\u00e1 utilizar <code>sudo<\/code>. Ent\u00e3o, <code>sudo touch authorized_keys<\/code> e<code>sudo vi authorized_keys<\/code>.<\/p>\n<p>Com o arquivo aberto no terminal, digite a tecla <code>i<\/code> para entrar em modo de edi\u00e7\u00e3o no vi. Com o modo de edi\u00e7\u00e3o ativado, cole sua chave que j\u00e1 deve estar no seu clipboard. (cmd + v para macs) e (control + v) para Windows\/Linux. Com sua chave colada, aperte <code>esc<\/code> para voltar ao modo de leitura e em seguida <code>x<\/code> para salvar e fechar ao mesmo tempo.<\/p>\n<p>Pronto, ssh key copiada! Caso voc\u00ea tenha criado o arquivo <code>authorized_keys<\/code>, voc\u00ea vai precisar executar este comando para que o que fizemos tenha feito:<\/p>\n<div class=\"highlight\">\n<pre><code class=\"bash\">sudo chmod 444 ~\/.ssh\/authorized_keys\r\n<\/code><\/pre>\n<\/div>\n<p><!--more--><\/p>\n<p>Esta forma de copiar a chave \u00e9 bem manual, mas serve como aprendizado.<\/p>\n<p>Outra forma muito \u00fatil de copiar sua chave \u00e9 utilizando <code>ssh-copy-id<\/code>. Se voc\u00ea utiliza Ubuntu por exemplo \u00e9 s\u00f3 utilizar o comando. Se voc\u00ea \u00e9 usu\u00e1rio Mac, voc\u00ea pode instalar atrav\u00e9s do <code>brew install ssh-copy-id<\/code>. Para utilizar \u00e9 muito simples:<\/p>\n<div class=\"highlight\">\n<pre><code class=\"bash\">ssh-copy-id user@hostname.example.com\r\n<\/code><\/pre>\n<\/div>\n<p>Agora, da pr\u00f3xima vez que voc\u00ea acessar sua VPS <code>ssh user@ip-de-sua-vps<\/code>, n\u00e3o haver\u00e1 necessidade de digitar sua senha.<\/p>\n<h2 id=\"seguindo-git\">Seguindo.. GIT!<\/h2>\n<p>Para nosso deploy, n\u00f3s utilizaremos o GIT e o forever. Para isso, precisamos instalar o git na VPS. Para verificar se voc\u00ea j\u00e1 possui o git instalado, digite<code>which git<\/code>. Se voc\u00ea receber a mensagem \u201cgit not found\u201d, vamos instal\u00e1-lo atrav\u00e9s do seguinte comando:<\/p>\n<div class=\"highlight\">\n<pre><code class=\"bash\">sudo apt-get install git\r\n<\/code><\/pre>\n<\/div>\n<p>Provavelmente a instala\u00e7\u00e3o pedir\u00e1 para voc\u00ea apertar <code>Y<\/code> para concordar em baixar os arquivos.<\/p>\n<p>Com o GIT instalado, nos resta come\u00e7ar a brincar de instalar o NODE e logo menos, o forever para manter sua aplica\u00e7\u00e3o rodando em background.<\/p>\n<h2 id=\"instalando-o-node\">Instalando o Node<\/h2>\n<p>Para instalar o node, vamos utilizar o apt-get, por\u00e9m, os pacotes nem sempre est\u00e3o atualizados como deveriam, ent\u00e3o, para garantir que seja instalada a vers\u00e3o mais nova do node, vamos informar ao apt-get que desejamos um reposit\u00f3rio espec\u00edfico para baixar o node:<\/p>\n<div class=\"highlight\">\n<pre><code class=\"bash\">sudo add-apt-repository ppa:chris-lea\/node.js\r\nsudo apt-get update\r\nsudo apt-get install nodejs\r\n<\/code><\/pre>\n<\/div>\n<p>Com o node instalado, vamos testar se funcionou digitando <code>node --version<\/code>. Pronto, voc\u00ea j\u00e1 deve estar com o node instalado e consequentemente o npm, j\u00e1 que o mesmo vem \u201cbuilt-in\u201d j\u00e1 faz algum tempo.<\/p>\n<h3 id=\"vamos-ao-exemplo-finalmente-node\">Vamos ao exemplo! Finalmente, node!<\/h3>\n<p>Navegue at\u00e9 a pasta de seu usu\u00e1rio, Vamos clonar uma aplica\u00e7\u00e3o Express j\u00e1 existente para facilitar nosso trabalho.<\/p>\n<div class=\"highlight\">\n<pre><code class=\"bash\"><span class=\"nb\">cd<\/span> ~\r\ngit clone https:\/\/github.com\/djalmaaraujo\/express-js-example-blog\r\n<span class=\"nb\">cd <\/span>express-js-example-blog\r\n<\/code><\/pre>\n<\/div>\n<p>Se voc\u00ea tentar rodar <code>node app.js<\/code>, voc\u00ea vai receber alguns erros, uma vez que precisamos instalar as depend\u00eancias. Para isso, vamos utilizar o &#8220;`npm install&#8220;. Depois de algum tempo e muito output, o final se parecer\u00e1 com isso:<\/p>\n<div class=\"highlight\">\n<pre><code class=\"bash\">...\r\n...\r\nexpress@3.4.7 node_modules\/express\r\n\u251c\u2500\u2500 methods@0.1.0\r\n\u251c\u2500\u2500 merge-descriptors@0.0.1\r\n\u251c\u2500\u2500 cookie-signature@1.0.1\r\ndoctype html\r\n\u251c\u2500\u2500 range-parser@0.0.4\r\n\u251c\u2500\u2500 fresh@0.2.0\r\n\u251c\u2500\u2500 debug@0.7.4\r\n\u251c\u2500\u2500 buffer-crc32@0.2.1\r\n\u251c\u2500\u2500 cookie@0.1.0\r\n\u251c\u2500\u2500 mkdirp@0.3.5\r\n\u251c\u2500\u2500 send@0.1.4 <span class=\"o\">(<\/span>mime@1.2.11<span class=\"o\">)<\/span>\r\n\u251c\u2500\u2500 commander@1.3.2 <span class=\"o\">(<\/span>keypress@0.1.0<span class=\"o\">)<\/span>\r\n\u2514\u2500\u2500 connect@2.12.0 <span class=\"o\">(<\/span>uid2@0.0.3, pause@0.0.1, qs@0.6.6, bytes@0.2.1, raw-body@1.1.2, batch@0.5.0, negotiator@0.3.0, multiparty@2.2.0<span class=\"o\">)<\/span>\r\n<\/code><\/pre>\n<\/div>\n<p>Pronto! Estamos prontos para rodar nossa primeira aplica\u00e7\u00e3o node em nossa VPS. Para isso, digite <code>node app.js<\/code> ou apenas <code>node app<\/code>. Com isso voc\u00ea receber\u00e1 a seguinte mensagem:<\/p>\n<p><code>Express server listening on port 3000<\/code><\/p>\n<p>Agora, voc\u00ea deve acessar sua VPS no browser, <code>http:\/\/ip-de-sua-vps:3000<\/code>. Voc\u00ea ver\u00e1 a tela do express inicial:<\/p>\n<div class=\"highlight\">\n<pre><code class=\"bash\">Express\r\nWelcome to Express\r\n<\/code><\/pre>\n<\/div>\n<h2 id=\"e-agora\">E agora?<\/h2>\n<p>Perfeito! Agora n\u00f3s temos nossa aplica\u00e7\u00e3o rodando e j\u00e1 podemos efetuar testes. Mas ningu\u00e9m gosta de acessar sites na porta <code>3000<\/code>, correto? Para configurar nossa porta <code>80<\/code>, n\u00f3s faremos mais algumas coisas.<\/p>\n<p>Por padr\u00e3o, o Ubuntu server vem com porta 80 bloqueada em seu firewall e al\u00e9m disso, para n\u00e3o ter necessidade de ficar \u201ccascavilhando\u201d e brigando com firewall e etc, vamos manter nossa aplica\u00e7\u00e3o rodando na porta <code>3000<\/code> e redirecionar a porta <code>80<\/code>. Assim, quando os usu\u00e1rios acessarem seu app, a porta <code>80<\/code> ser\u00e1 redirecionada para a porta <code>3000<\/code> em background.<\/p>\n<p><code>N\u00e3o, seu browser n\u00e3o ser\u00e1 redirecionado para :3000<\/code><\/p>\n<p>Para isso vamos primeiro checar se o \u201cip forwarding\u201d est\u00e1 ativado na m\u00e1quina. <code>cat \/proc\/sys\/net\/ipv4\/ip_forward<\/code> vai te dizer se est\u00e1 ativado ou n\u00e3o. Caso voc\u00ea receba <code>0<\/code>, para habilitar utilize as seguintes instru\u00e7\u00f5es:<\/p>\n<div class=\"highlight\">\n<pre><code class=\"bash\">sudo vi \/etc\/sysctl.conf\r\nnet.ipv4.ip_forward <span class=\"c\"># Descomente esta linha no arquivo aberto. Salve e feche o arquivo.<\/span>\r\nsudo sysctl -p \/etc\/sysctl.conf <span class=\"c\"># Para ativar as modifica\u00e7\u00f5es feitas no arquivo.<\/span>\r\ncat \/proc\/sys\/net\/ipv4\/ip_forward <span class=\"c\"># Para verificar se agora est\u00e1 ativado.<\/span>\r\n<\/code><\/pre>\n<\/div>\n<p>Com o \u201cport forwarding\u201d ativado, agora vamos ativar nosso redirecionamento da porta <code>80<\/code> para a porta <code>3000<\/code>, utilizando iptables.<\/p>\n<div class=\"highlight\">\n<pre><code class=\"bash\">sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000\r\n<\/code><\/pre>\n<\/div>\n<p>Como dito acima, por padr\u00e3o a porta <code>80<\/code> \u00e9 bloqueada no firewall, ent\u00e3o vamos permitir conex\u00f5es atrav\u00e9s desta porta:<\/p>\n<div class=\"highlight\">\n<pre><code class=\"bash\">sudo iptables -A INPUT -p tcp -m tcp --sport 80 -j ACCEPT\r\nsudo iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT\r\n<\/code><\/pre>\n<\/div>\n<h2 id=\"reiniciando-a-aplicao\">Reiniciando a aplica\u00e7\u00e3o<\/h2>\n<p>V\u00e1 at\u00e9 sua aplica\u00e7\u00e3o, inicie a mesma <code>node app<\/code>, e verifique agora no seu browser, que voc\u00ea pode acessar sua m\u00e1quina atrav\u00e9s da porta <code>80<\/code>.<code>http:\/\/ip-de-sua-maquina<\/code>. O output da aplica\u00e7\u00e3o continuar\u00e1 dizendo<code>listening on port 3000<\/code>, mas agora sua porta <code>80<\/code> est\u00e1 sendo redirecionada para a <code>3000<\/code>.<\/p>\n<h2 id=\"mais-um-passo-para-a-vitria-colocando-a-aplicao-para-rodar-em-background-com-forever\">Mais um passo para a vit\u00f3ria. Colocando a aplica\u00e7\u00e3o para rodar em background com forever<\/h2>\n<p>Vamos come\u00e7ar instalado o forever, atrav\u00e9s do npm.<\/p>\n<p><code>[sudo] npm install forever -g<\/code><\/p>\n<p>Para utilizar o forever \u00e9 extremamente simples, apenas saiba o path de sua aplica\u00e7\u00e3o e digite o seguinte comando:<\/p>\n<p><code>forever start \/home\/seuusuario\/express-js-example-blog\/app.js<\/code><\/p>\n<p>Com isso, voc\u00ea ter\u00e1 o seguinte output:<\/p>\n<div class=\"highlight\">\n<pre><code class=\"bash\">warn:    --minUptime not set. Defaulting to: 1000ms\r\nwarn:    --spinSleepTime not set. Your script will <span class=\"nb\">exit <\/span><span class=\"k\">if <\/span>it does not stay up <span class=\"k\">for <\/span>at least 1000ms\r\ninfo:    Forever processing file: app.js\r\n<\/code><\/pre>\n<\/div>\n<p>Voc\u00ea percebeu que agora, seu console ficou livre para efetuar outras opera\u00e7\u00f5es. Isso acontece devido ao forever colocar o processo do node em background.<\/p>\n<p>Aqui v\u00e3o algumas dicas para voc\u00ea interagir mais com o forever:<\/p>\n<ul>\n<li><code>forever list<\/code> Lista todas as suas aplica\u00e7\u00f5es iniciadas com o forever.<\/li>\n<li><code>tail -f \/path\/para\/o\/log\/fornecido.log<\/code> Voc\u00ea pode verificar o log de sua aplica\u00e7\u00e3o em tempo real.<\/li>\n<li><code>forever stopall<\/code> Para todas as aplica\u00e7\u00f5es<\/li>\n<li><code>forever stop ID<\/code> Para uma aplica\u00e7\u00e3o espec\u00edfica. Para conseguir o id, digite forever list.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h2 id=\"up-and-running\">Up and running!<\/h2>\n<p>Seguindo todos estes passos, voc\u00ea ter\u00e1 sua VPS configurada para rodar suas aplica\u00e7\u00f5es node sem se preocupar em utilizar hosts de terceiros.<\/p>\n<p>Existem diversas formas de se fazer setup de aplica\u00e7\u00f5es, e esta nem \u00e9 a melhor, nem a pior, mas funciona. Se voc\u00ea estiver trabalhando em um projeto pequeno e que voc\u00ea n\u00e3o est\u00e1 preocupado em ter acesso root a m\u00e1quina, eu recomendo fortemente que voc\u00ea utilize o Heroku para deploy de suas aplica\u00e7\u00f5es node\/ruby\/whatever.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Neste post, estou assumindo que voc\u00ea j\u00e1 possui sua VPS instalada e configurada com o Ubuntu Server. Optei pelo Ubuntu, por ser uma distribui\u00e7\u00e3o super simples de configurar. Caso voc\u00ea n\u00e3o possua, aqui vai uma indica\u00e7\u00e3o: ClusterWeb &#8211; Internet Data Center Ap\u00f3s o jab\u00e1 gratuito, o primeiro passo, \u00e9 voc\u00ea facilitar futuros acessos a m\u00e1quina, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[730,1,42,51,439,495,514,68,271,548],"tags":[378,731,732,355,733,72,370],"class_list":["post-2115","post","type-post","status-publish","format-standard","hentry","category-clusterweb","category-viazap","category-leitura-recomendada","category-linux-linuxrs","category-midia","category-profissional-de-ti","category-programacao","category-redes-2","category-seguranca-2","category-ubuntu-2","tag-como","tag-configurar","tag-node-js","tag-para","tag-producao","tag-servidor","tag-um"],"_links":{"self":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2115","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2115"}],"version-history":[{"count":2,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2115\/revisions"}],"predecessor-version":[{"id":2119,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2115\/revisions\/2119"}],"wp:attachment":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2115"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2115"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2115"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}