2016-04-24 1 views
2

Ich habe eine node.js App, die auf Port 3000 läuft. Ich habe es auf Amazon Web Services (ec2) bereitgestellt und es funktioniert dort. Meine server.js Datei sagt:Ich führe gerade meine Amazon ec2-Instanz auf Port 3000. Ich möchte es stattdessen auf Port 80 ausführen. Wie kann ich es tun?

var port   = process.env.PORT || 3000; 
(...) 
app.listen(port); 
console.log('App listening on port ' + port); 

Meine Sicherheitsgruppe in aws Einstellungen scheint den Port 80 auch geöffnet zu haben:

enter image description here

so dachte ich, es ist genug, um nur die var port-= 80 und Neustart zu ändern der Server. Aber wenn ich es tat, dass ich einen Fehler bekam:

[email protected]:~/apps/myproject/www/myproject$ sudo node server.js 
App listening on port 80 
events.js:141 
     throw er; // Unhandled 'error' event 
    ^

Error: listen EADDRINUSE :::80 
    at Object.exports._errnoException (util.js:856:11) 
    at exports._exceptionWithHostPort (util.js:879:20) 
    at Server._listen2 (net.js:1237:14) 
    at listen (net.js:1273:10) 
    at Server.listen (net.js:1369:5) 
    at Function.app.listen (/opt/bitnami/apps/myproject/www/myproject/node_modules/express/lib/application.js:542:24) 
    at Object.<anonymous> (/opt/bitnami/apps/myproject/www/myproject/server.js:43:5) 
    at Module._compile (module.js:398:26) 
    at Object.Module._extensions..js (module.js:405:10) 
    at Module.load (module.js:344:32) 
    at Function.Module._load (module.js:301:12) 
    at Function.Module.runMain (module.js:430:10) 
    at startup (node.js:141:18) 
    at node.js:1003:3 

Ich bin mit dem Bitnami MEAN 3.2.1-0 System auf Amazon.

Auch der Grund, warum ich diesen Port ändern möchten, ist dies:

bisher alle meine Web Service auf Port betreiben 3000. Allerdings habe ich es auch einen public_html Ordner mit dem index.html Datei. Wenn also ein Benutzer meine Webseite anzeigen möchte, muss er nicht nur die Webseite eingeben, sondern auch den Port (3000), was nicht gerade praktisch ist.

Bis jetzt bleibt die ganze App unter www.ec2-some-random-amazom-numbers.eu-west-1.compute.amazonaws.com:3000/index.html so werde ich eine normale Top Level Domain kaufen zeigen Sie darauf (zB something.com) aber dann - muss ich in diesem Fall immer noch den Port 3000 auf 80 ändern? Oder ist es üblich, Apps auf einem anderen Port als 80 zu lassen?

Wenn letzteres, dann wird es mir möglich sein, den Port zu verlassen, wie es ist, und nur die Top-Level-Domain auf diesem ganzen langen Amazonas mit einem Port 3000 am Ende zeigen?

Also zum Beispiel: wenn Benutzer www.something.com gibt, wird es ihn auf www.ec2-some-random-amazom-numbers.eu-west-1.compute.amazonaws.com:3000/index.html umleiten?

Antwort

2

So etwas sollte für Sie arbeiten:

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

Sie wollen iptables verwenden Anfrage auf Port 80 3000 intern auf den Hafen kommen in weiterleiten.

+0

Danke. Könntest du mir einen Hinweis geben, ob die App auf Port '3000' sicher ist und als Produktionsumgebung funktionieren könnte? Dann würde ich nur meine Top-Level-Domain auf die Adresse "address.com: 3000/index.html" verweisen und alle Webservices auf Port "3000" arbeiten lassen. – user3766930

+0

Ich glaube nicht, dass es "unsicher" wäre. Ich persönlich mag es einfach nicht, dass Benutzer sich daran erinnern müssen, einen Port einzugeben, aber wenn Sie eine kleine Anzahl von Benutzern haben und sie "trainiert" werden können, dann glaube ich nicht, dass es ein Problem geben würde. –

4

Basierend auf dem Fehler, den Sie erhalten, (EADDRINUSE), überwacht ein anderer Webserver Port 80 bereits auf Ihrem Server. Wenn Sie diesen Server nicht ausgeführt werden kann, dann können Sie Ihre App auf Port 80 laufen ändern Sie wie folgt:

  1. Abbildung heraus, was bereits läuft auf Port 80 auf dem Server. Es ist eine gute Chance, dass es Apache ist. Versuchen Sie es mit netstat zu verifizieren.
  2. Töten Sie es (und verhindern Sie, dass es neu gestartet wird). Dies hängt davon ab, was Sie hören.
  3. Verschieben Sie Ihre App auf Port 80, so wie Sie es bereits versucht haben.

Zusätzliche Ressourcen:

-1

ich das gleiche Problem konfrontiert.

Die Lösung ist Ihre NodeJs oder ExpressJs App starten Hafen mit 80, ich meinen var port = 80 und starten Sie die App sudo node bin/www

Mein Problem nicht in der Lage ist, die App aus dem Internet zuzugreifen, wenn der App auf Port läuft 3000: NodeJs App in AWS using port 3000 is not accessible from Internet

+1

Keine gute Idee, einen Server als root zu starten. – TGrif

1

Wenn Sie den Bitnami Mean Stack verwenden, hört Apache in Port 80 zu, daher der Konflikt. Sie können entweder die mitgelieferte Apache stoppen:

sudo /opt/bitnami/ctlscript.sh stop apache 

Oder Sie könnten einen Proxypass-Regel in der Apache-Konfiguration hinzufügen:

https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass

Verwandte Themen