Melhores práticas ao executar o Node.js com a porta 80 (Ubuntu / Linode)

Estou configurando meu primeiro servidor Node.js em um cloud Linux node na cloud Linux node e sou relativamente novo nos detalhes do Linux admin do Linux admin . (BTW eu não estou tentando usar o Apache ao mesmo tempo.)

Tudo está instalado corretamente, mas descobri que, a menos que eu use o root login , não posso escutar na port 80 com o nó. No entanto, eu prefiro não executá-lo como root por razões de segurança.

Qual é a melhor prática para:

  1. Definir boas permissions / usuário para o nó para que ele seja seguro / seguro?
  2. Permitir que a porta 80 seja usada dentro dessas restrições.
  3. Inicie o nó e execute-o automaticamente.
  4. Manipular informações de log enviadas ao console.
  5. Quaisquer outras preocupações gerais de manutenção e segurança.

Devo estar encaminhando o tráfego da porta 80 para uma porta de escuta diferente?

obrigado

Porta 80

O que eu faço em minhas instâncias de nuvem é redirect a porta 80 para a porta 3000 com este comando:

 sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000 

Em seguida, inicio meu Node.js na porta 3000. Os pedidos para a porta 80 serão mapeados para a porta 3000.

Você também deve editar seu arquivo /etc/rc.local e adicionar essa linha menos o sudo . Isso adicionará o redirecionamento quando a máquina for inicializada. Você não precisa de sudo em /etc/rc.local porque os comandos são executados como root quando o sistema é inicializado.

Logs

Use o módulo forever para iniciar seu Node.js com. Ele irá certificar-se de que ele será reiniciado se ele falhar e redirectá os logs do console para um arquivo.

Lançar na boot

Adicione seu script de início do Node.js ao arquivo que você editou para redirecionamento de porta, /etc/rc.local . Isso executará seu script de boot do Node.js quando o sistema for iniciado.

Oceano Digital e outros VPS

Isso não se aplica apenas ao Linode, mas também ao Digital Ocean, AWS EC2 e outros provedores de VPS. No entanto, em sistemas baseados em RedHat, o /etc/rc.local é /ect/rc.d/local .

Dar permissão de usuário seguro para usar a porta 80

Lembre-se, não queremos executar seus aplicativos como usuário root, mas há um problema: o usuário seguro não tem permissão para usar a porta HTTP padrão (80). Seu objective é publicar um site que os visitantes possam usar navegando para um URL fácil de usar, como http://ip:port/

Infelizmente, a menos que você faça logon como root, você normalmente terá que usar um URL como http://ip:port – onde número da porta> 1024.

Muitas pessoas ficam presas aqui, mas a solução é fácil. Existem algumas opções, mas esta é a que eu gosto. Digite os seguintes comandos:

 sudo apt-get install libcap2-bin sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\`` 

Agora, quando você diz a um aplicativo do Node que deseja que ele seja executado na porta 80, ele não irá reclamar.

Verifique este link de referência

Elimine os privilégios de root depois de ligar à porta 80 (ou 443).

Isso permite que a porta 80/443 permaneça protegida, enquanto ainda impede que você atenda solicitações como root:

 function drop_root() { process.setgid('nobody'); process.setuid('nobody'); } 

Um exemplo de trabalho completo usando a function acima:

 var process = require('process'); var http = require('http'); var server = http.createServer(function(req, res) { res.write("Success!"); res.end(); }); server.listen(80, null, null, function() { console.log('User ID:',process.getuid()+', Group ID:',process.getgid()); drop_root(); console.log('User ID:',process.getuid()+', Group ID:',process.getgid()); }); 

Veja mais detalhes nesta referência completa .

Para a porta 80 (que era a pergunta original), Daniel está exatamente certo. Eu recentemente mudei para https e tive que mudar do iptables para um proxy nginx leve gerenciando os certificados SSL. Eu encontrei uma resposta útil, juntamente com uma essência por gabrielhpugliese sobre como lidar com isso. Basicamente eu

  • Criou uma solicitação de assinatura de certificado SSL (CSR) via OpenSSL

     openssl genrsa 2048 > private-key.pem openssl req -new -key private-key.pem -out csr.pem 
  • Recebi o certificado real de um desses lugares (aconteceu de eu usar o Comodo )
  • Nginx instalado
  • Alterou a location em /etc/nginx/conf.d/example_ssl.conf para

     location / { proxy_pass http://localhost:3000; proxy_set_header X-Real-IP $remote_addr; } 
  • Formatado o certificado para o nginx colocando os certs individuais juntos e vinculados a ele no meu arquivo nginx example_ssl.conf (e coisas não comentadas, me livrei de ‘example’ no nome, …)

     ssl_certificate /etc/nginx/ssl/cert_bundle.cert; ssl_certificate_key /etc/nginx/ssl/private-key.pem; 

Espero que isso possa salvar outras dores de cabeça. Tenho certeza de que há uma maneira de fazer isso com nó puro, mas o nginx foi rápido e funcionou.

O Linode fornece alguma “parede frontal” ou firewall onde Você deve abrir a porta para a máquina? Talvez seja bom lugar para encontrar uma solução melhor que o roteamento em todas as máquinas? Quando estou implantando o servidor no Azure, devo definir os chamados endpoints. O endpoint contém porta pública, porta privada (na máquina) e protocolo (TCP / UDP). Portanto, se você estiver executando o aplicativo na porta 3000 no servidor, ele poderá ser acessado na porta 80 e o roteamento será feito pela plataforma, não pela máquina. Eu também posso definir ACLs em endpoints.