it-swarm.com.de

Wie führe ich Node.js auf Port 80 aus?

Mein Ziel ist es, Node.js auf Port 80 auszuführen. Dies liegt daran, dass Node.js von bestimmten Netzwerken blockiert wird, die keinen Datenverkehr von einem anderen Port zulassen.

Es scheint, dass der beste Weg, dies zu tun, darin besteht, Apache über Node.js zu vertreten. Ich habe versucht, Node-http-Proxy zu verwenden, aber ich hatte kein Glück.

Der Code, den ich benutze, ist hier:

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);

Aber ich bekomme immer wieder den Fehler "Address in use" für Port 80. Ich muss etwas falsch machen.

Wie Proxy ich Apache durch node.js mit Node-http-Proxy? Kann ich auf diese Weise node.js auf Port 80 ausführen? Und ist Node-http-Proxy der beste Weg, um dies zu erreichen?

Vielen Dank.

65
Kit

Sie müssen lediglich 2 IP-Adressen für den Server haben, den Sie ausführen. Apache hat 1 IP an Port 80 gebunden und node.js hat die andere IP an Port 80 gebunden.

Die Verwendung von node und seiner listen-Direktive hat 2 Werte, z. .listen (80, NODEJS_IP oder DNS NAME);

Einige andere Ratschläge.

Ich würde Apache nicht mit nodejs verwenden, da es nicht ereignisgesteuert ist. Das ist also wirklich nicht zu empfehlen. Eigentlich würde ich NGINX als viel bessere Kombination mit Node in Betracht ziehen.

29
PaulM

führen Sie Ihre App auf einem hohen Port 8080 oder was auch immer

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

Wenn Sie nicht ngnix oder Apache verwenden

98
fullstacklife

Die einfachste Lösung: Konfigurieren Sie Ihre Node-App sicher für die Ausführung auf Port 80 .

  • Sudo apt-get install libcap2-bin
  • Sudo setcap cap_net_bind_service=+ep /path/to/node
  • Ta da! Sie sind fertig.

Warum mag ich es?

  • Sie müssen weder Apache noch Nginx verwenden
  • Sie müssen Ihre Anwendung nicht als root ausführen
  • Sie müssen keine Ports weiterleiten (und dies bei jedem Systemstart erledigen)

Referenzlink: https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps (Ein großartiger Artikel zum Einrichten Ihrer Node-App auf Cloud-Hosting).

28
Kyle Chadha

Es wird derzeit nicht empfohlen, den Knoten auf Port 80 auszuführen, da hierfür der Knoten als Root ausgeführt werden muss.

Wie sehr bist du an Apache gebunden? Das Proxyen von Knoten über Nginx ist eine bewährte Lösung mit einer Nginx-Konfiguration wie dieser:

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;
    }
}

Nginx-Dokumentation:

http://wiki.nginx.org/HttpProxyModule

http://wiki.nginx.org/HttpUpstreamModule

18
Waquo

Ihr Code sieht aus wie ein Beispielcode, in dem Sie einen knotenbasierten Proxy von Port 80 bis Port 9000 erstellen und anschließend einen knotenbasierten HTTP-Server auf Port 9000 erstellen. (D. H. Node:80 -> Node:9000)

Wenn Sie Node starten, wird "address in use" angezeigt, da Apache bereits Port 80 verwendet. Wenn Sie Apache als Proxy verwenden möchten, müssen Sie Node = auf einem anderen Port (sagen wir 9000) und Apache lauscht auf Port 80 und leitet die Anfragen an Node auf Port 9000) weiter. (dh Apache:80 -> Node:9000)

Es sieht so aus, als würde die von Ihnen verwendete Bibliothek genau das Gegenteil bewirken: Verwenden von Node als Proxy und Weiterleiten von Anforderungen an Apache. In diesem Fall müssen Sie Apache so konfigurieren, dass es auf einem anderen Port als Port 80 ausgeführt wird . (dh Node:80 -> Apache:9000).

Möchten Sie am Ende Node:80 -> Apache:9000 Oder Apache:9000 -> Node:80 Ausführen?

BEARBEITEN nach Kommentaren: Wenn Sie Apache:80 -> Node:9000 Ausführen möchten, können Sie mod_proxy Für Apache verwenden und die Direktiven ProxyPass/ProxyPassReverse verwenden

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

dabei ist nodeurls die URL-Familie, die Apache an Node weiterleiten soll.

8
nicolaskruchten

Ich hatte das gleiche Problem, hier ist, wie ich es mit Node-http-Proxy gelöst habe, um auf Port 80 zu lauschen und dann entweder an Express oder Apache weiterzuleiten.

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

3
uglymunky