wake-up-neo.net

Heroku + node.js: Ich habe einen Server, der mehrere Ports verwendet. Wie kann ich Heroku dazu bringen, sie zuzuweisen?

Umm ich werde versuchen klarer zu werden ..

Auf einem Anwendungsserver, den ich in node.js geschrieben habe, habe ich einen inneren Proxy für mehrere Ports:

  • in meinem 8080 port habe ich meine rest api .
  • in meinem 3000 port habe ich meinen push server und chat .

Ich benutze das npm-Paket subdomain-router für das interne Routing zum Port, um Subdomains im 'Front-End' freizugeben, die den Proxy zurück zu diesen Ports senden.
Code-Demonstration: (<some-app> ist offensichtlich nicht der wirkliche Name der App)

require('subdomain-router')
({
  Host: '<some-app>.herokuapp.com',
  subdomains:
  {
    '': 8080,   // <some-app>.herokuapp.com <=> ::8080   --WORKS--
    'api': 8080,  // api.<some-app>.herokuapp.com <=> ::8080
    'chat': 3000, // chat.<some-app>.herokuapp.com <=> ::3000
    'Push': 3000  // Push.<some-app>.herokuapp.com <=> ::3000
  }
}).listen(process.env.PORT || 5000);

Die API funktioniert hervorragend, obwohl ich nicht über <some-app>.herokuapp.com:8080 darauf zugreifen kann, sondern nur über <some-app>.herokuapp.com und das innere subdomain-router-Modul es magisch machen lasse.
Außerdem kann ich nicht auf die Subdomains zugreifen. Beim Versuch, auf api.<some-app>.herokuapp.com zuzugreifen, erhalte ich eine No such app-Fehlerseite von heroku.

TL; DR Der Zugriff auf <some-app>.herokuapp.com funktioniert (leitet den /v1-Pfad für meine API weiter), kann jedoch nicht auf <some-app>.herokuapp.com:8080, <some-app>.herokuapp.com:3000 oder chat.<some-app>.herokuapp.com zugreifen.

Beim Versuch, durch Angabe des Ports in der URL (wie folgt: <some-app>.herokuapp.com:8080) auf meine API zuzugreifen, wird in meinem Browser (Google Chrome) die folgende Fehlermeldung angezeigt: ERR_CONNECTION_REFUSED.

Meine Vermutung sagt, dass es etwas mit Öffnen von Ports in Heroku zu tun haben könnte, aber ich habe keine Ahnung, wie es geht (versuchtes googeln von c).
Es erklärt jedoch nicht, warum ich nicht auf die Subdomains zugreifen kann.

Würde mich über jegliches Licht für dieses Thema freuen.
Ich bin neu in Heroku und es wird sehr frustrierend.

Vielen Dank!
Amit

16
Amit Evron

Okay, nach einigen Recherchen habe ich herausgefunden, dass das Öffnen von Ports in Heroku deaktiviert und nicht erlaubt ist.

Der einzige Weg um dieses herum ist die Verwendung von Subdomains und dann in-app, um ein Proxy-Modul zu verwenden (wie subdomain-router, das ich verwende).

BUT - Heroku lässt Sie keine Unterdomänen in ihrer Domäne erstellen. Dies bedeutet, dass your-app.herokuapp.com festgelegt ist und keine Unterdomänen haben kann.
In Heroku-Handbüchern verlangen Sie von Ihnen, dass Sie über eine eigene Domain und einen eigenen DNS-Anbieter verfügen, indem Sie einen A-Alias ​​(CNAME) in der DNS-Tabelle in Ihren Domain-Einstellungen erstellen, der auf Ihre Herokuapp-App verweist Domäne und verwenden Sie dann den Befehl heroku domains:add, um Ihre Domäne der zulässigen Origin-Liste hinzuzufügen.

Sie können mehr hier lesen. Es bietet alle Informationen, die Sie benötigen.

Hoffe es hat einigen geholfen.

15
Amit Evron

Ich weiß, dass dies ein alter Beitrag ist, aber ich wollte eine aktuelle Antwort zur Referenz und zukünftigen Verwendung bereitstellen:

Wenn Sie Socket-io verwenden, ist das Binden an denselben Port einfach. Andere Websocket-Bibliotheken sollten einen ähnlichen Ansatz verfolgen (von https://github.com/socketio/socket.io ):

In Verbindung mit Express Ab Version 3.0 sind Expressanwendungen zu Request-Handler-Funktionen geworden, die Sie an http- oder http-Serverinstanzen übergeben. Sie müssen den Server an socket.io übergeben und nicht an die Expressanwendungsfunktion. Stellen Sie außerdem sicher, dass Sie .listen auf dem Server aufrufen, nicht auf der App.


const app = require('express')();
const server = require('http').createServer(app);
const io = require('socket.io')(server);
io.on('connection', () => { /* … */ });
server.listen(3000);

Der http & ws-Verkehr fließt nun über einen einzelnen Port (Heroku leitet http/tcp nicht separat weiter, wenn dies der Fall wäre, würden Ihre Websockets nicht funktionieren). Das Binden mit anderen Frameworks als Express ist möglich: ( https://github.com/socketio/socket.io ).

Ich bevorzuge diese Methode aufgrund von Umgebungsparität und -tests, d. H. Keine Notwendigkeit, Unterdomänen oder Portrouting einzurichten

2
myf4ult

Ich habe auch heute darüber erfahren, dass ich, wenn Sie einen Dienst in einem Hafen in Heroku betreiben, immer noch lokal darauf zugreifen können. Funktioniert nicht für das Problem des Benutzers, aber es wurde mein Problem behoben, das mich zu dieser Frage führte.

1
Antoine