Práticas recomendadas ao executar o Node.js com porta 80 (Ubuntu / Linode) [fechado]

260

Estou configurando meu primeiro Node.jsservidor em um servidor cloud Linux nodee sou bastante novo nos detalhes de Linux admin. (BTW, 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 consigo ouvir o port 80nó. No entanto, prefiro não executá-lo como root por motivos de segurança.

Qual é a melhor prática para:

  1. Definir boas permissões / usuário para o nó, de modo que ele seja seguro / protegido por sandbox?
  2. Permita 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 encaminhar o tráfego da porta 80 para uma porta de escuta diferente?

obrigado

Robotbugs
fonte

Respostas:

532

Porta 80

O que faço nas instâncias da nuvem é redirecionar 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. As solicitações para a porta 80 serão mapeadas para a porta 3000.

Você também deve editar seu /etc/rc.localarquivo e adicionar essa linha menos o sudo. Isso adicionará o redirecionamento quando a máquina inicializar. Você não precisa sudoentrar /etc/rc.localporque os comandos são executados como rootquando o sistema é inicializado.

Histórico

Use o módulo forever para iniciar o seu Node.js. Ele garantirá que seja reiniciado se travar e redirecionará os logs do console para um arquivo.

Iniciar na inicialização

Adicione o script inicial do Node.js. ao arquivo que você editou para o redirecionamento de porta /etc/rc.local,. Isso executará o script de inicialização do Node.js. quando o sistema iniciar.

Oceano digital e outros VPS

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

Daniel
fonte
3
Obrigado por essa resposta, agradável e direto ao ponto.
Robotbugs
21
BTW, no Ubuntu, é /etc/rc.local
kehers 14/10
12
Geralmente, o sinalizador "-i eth0" é um problema para servidores privados virtuais. Substitua eth0 conforme necessário.
precisa
7
Se eu adicionar meu script inicial do Node.js. /etc/rc.local, ele não será executado como rootna inicialização do sistema? Isso anularia o objetivo do redirecionamento da porta 80.
jamix
4
Observe que, para que o redirecionamento de porta funcione, a porta de destino também deve estar aberta no seu firewall. WRT iniciando uma instância de nó na inicialização, simplesmente usamos os scripts de init / distribuição systemd das distribuições que permitem especificar um usuário.
bk138
116

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

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

Infelizmente, a menos que você faça login como root, normalmente precisará usar um URL como http://ip:port- em que número da porta> 1024.

Muitas pessoas ficam presas aqui, mas a solução é fácil. Existem algumas opções, mas é essa 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 Node que deseja que ele seja executado na porta 80, ele não irá reclamar.

Verifique este link de referência

Conheça Mehta
fonte
9
Essa é a resposta melhor e mais simples.
precisa saber é o seguinte
2
Além disso, adicionou uma resposta detalhada aqui stackoverflow.com/questions/23281895/…
Meet Mehta
1
Como um servidor Web como o NGINX é executado na porta 80? Faz algo semelhante?
Eric Andrew Lewis
1
@EricAndrewLewis: Vou dizer que depende. Este erro será exibido quando você estiver executando o servidor no modo não raiz. E se você estiver executando o servidor Nginx como usuário root! Além disso, se estiver executando como usuário normal e obtendo erro. Execute os comandos acima para fornecer permissões seguras para acessar a porta. Consulte também stackoverflow.com/questions/31369480/…
Meet Mehta
16

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

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

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

Um exemplo de trabalho completo usando a função 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 .

desprezível
fonte
9

Para a porta 80 (que era a pergunta original), Daniel está exatamente certo. Recentemente, mudei para httpse tive que mudar iptablespara um proxy nginx leve que gerenciava os certificados SSL. Encontrei uma resposta útil, juntamente com uma essência de gabrielhpugliese sobre como lidar com isso. Basicamente eu

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

Nick Benes
fonte