web-dev-qa-db-fra.com

Comment exécuter Node.js sur le port 80?

Mon objectif est d'exécuter Node.js sur le port 80. C'est parce que je trouve que node.js est bloqué sur certains réseaux qui n'autorisent pas le trafic provenant d'un autre port.

Il semble que la meilleure façon de procéder consiste à utiliser Apache via Node.js. J'ai essayé d'utiliser node-http-proxy pour ce faire mais je n'ai pas eu de chance.

Le code que j'utilise est ici:

var util = require('util'),
    http = require('http'),
    httpProxy = require('http-proxy');

httpProxy.createServer(9000, 'localhost').listen(80);

http.createServer(function (req, res) {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.write('request successfully proxied to: ' + req.url + '\n' + JSON.stringify(req.headers, true, 2));
  res.end();
}).listen(9000);

Mais je reçois toujours l'erreur "Adresse en cours d'utilisation" pour le port 80. Je dois faire quelque chose de mal.

Comment puis-je proxy Apache via node.js en utilisant node-http-proxy? Est-ce que cela me permettra d'exécuter node.js sur le port 80? Et le proxy http-node est-il le meilleur moyen d'y parvenir?

Merci.

65
Kit

Ce que vous devez faire est d'avoir 2 ip pour le serveur que vous utilisez. Apache a 1 adresse IP liée au port 80, puis node.js a l'autre adresse IP liée au port 80.

L'utilisation de node et de sa directive listen a 2 valeurs par exemple. .listen (80, NODEJS_IP ou DNS NAME);

Quelques autres conseils.

Je n'utiliserais pas Apache avec nodejs car cela ne s'est pas produit. Donc ce n'est vraiment pas recommandé. En fait, je chercherais à utiliser NGINX car c'est un bien meilleur appariement avec Node.

29
PaulM

exécutez votre application sur un port haut 8080 ou whatev puis

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

Si vous n'utilisez pas ngnix ou Apache

98
fullstacklife

La solution la plus simple: configurez en toute sécurité votre application de nœud pour qu'elle s'exécute sur le port 80 .

  • Sudo apt-get install libcap2-bin
  • Sudo setcap cap_net_bind_service=+ep /path/to/node
  • Ta da! Vous avez terminé.

Pourquoi j'aime ça?

  • Vous n'avez pas besoin d'utiliser Apache ou nginx
  • Vous n'avez pas besoin d'exécuter votre application en tant que root
  • Vous n'aurez pas à transférer de ports (et à gérer cela à chaque démarrage de votre machine)

Lien de référence: https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps (Un excellent article sur la façon de configurer votre application de nœud sur l'hébergement cloud).

28
Kyle Chadha

Il n'est actuellement pas recommandé d'exécuter le nœud sur le port 80, car cela nécessite l'exécution du nœud en tant que root.

Dans quelle mesure êtes-vous attaché à apache? Le proxy par le biais de nginx est une solution éprouvée, avec une configuration nginx comme celle-ci:

upstream node_cluster {
    ip_hash;   
    server 127.0.0.1:8000;
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
}

server {
    listen 0.0.0.0:80;
    server_name foo;
    access_log /var/log/nginx/foo.log;

    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_Host;

      proxy_pass http://node_cluster/;
      proxy_redirect off;
    }
}

Documentation Nginx:

http://wiki.nginx.org/HttpProxyModule

http://wiki.nginx.org/HttpUpstreamModule

18
Waquo

Votre code ressemble à un exemple de code dans lequel vous créez un proxy basé sur un nœud du port 80 au port 9000, puis créez un serveur HTTP basé sur un nœud sur le port 9000. (c.-à-d. Node:80 -> Node:9000)

Vous obtenez une "adresse en cours d'utilisation" lorsque vous lancez Node car Apache utilise déjà le port 80. Si vous souhaitez utiliser Apache comme proxy, vous devez utiliser Node = sur un port différent (disons 9000) et demandez à Apache d'écouter sur le port 80 et de transmettre les demandes à Node sur le port 9000. (ie Apache:80 -> Node:9000)

Il semble que la bibliothèque que vous utilisez sert à faire le contraire: en utilisant Node comme proxy et en transférant les requêtes vers Apache. Dans ce cas, vous devez configurer Apache pour qu'il s'exécute sur un autre port que le port 80 . (c'est à dire Node:80 -> Apache:9000).

Voulez-vous faire Node:80 -> Apache:9000 ou Apache:9000 -> Node:80, à la fin?

MODIFIER après les commentaires: si vous voulez faire Apache:80 -> Node:9000, vous pouvez utiliser mod_proxy sur Apache et utilisez les directives ProxyPass/ProxyPassReverse, quelque chose comme

ProxyPass /nodeurls/ http://localhost:9000/
ProxyPassReverse /nodeurls/ http://localhost:9000/  

nodeurls est la famille d'URL que vous souhaitez qu'Apache transfère à Node.

8
nicolaskruchten

J'avais le même problème, voici comment je l'ai résolu en utilisant node-http-proxy pour écouter sur le port 80, puis transmettre à Express ou Apache.

https://stackoverflow.com/a/9645091/50027

3
uglymunky