it-swarm.com.de

NodeJS HTTP - Überwachen Sie einen anderen Port als 80

Ich verwende XAMPP unter Windows, um einen Apache-Server auf Port 80 zu hosten. Jetzt versuche ich, ein NodeJS-Skript im Hintergrund auszuführen, aber das Problem ist, dass nur Port 80 abgehört werden kann. Wenn dies der Fall ist, funktioniert alles wie gewohnt sollte aber Apache nicht gleichzeitig laufen, da Apache Priorität hat und nur meine Website bedient. Das NodeJS-Skript kann nicht einmal zuhören.

Meine Frage ist: Wie kann ich den Abhörport des NodeJS-Skripts umschalten (der bestimmte Port spielt wirklich keine Rolle), so dass Apache weiterhin auf Port 80 laufen kann und ich das NodeJS-Skript von überall auf der Welt erreichen kann.

Teil des NodeJS-Codes:

const http = require('http');

const port = 8080;
const Host = '0.0.0.0';




server = http.createServer( function(req, res) {
    if (req.method == 'POST') {
        var body = '';
        req.on('data', function (data) {
            body += data;
            doStuff(body);
        });
        res.writeHead(200, {'Content-Type': 'text'});
        res.end('received request successfully');
    }
    else {
        res.writeHead(405, {'Content-Type': 'text'});
        res.end('not allowed method ' + req.method + ', try again with GET or POST');
    }

})

server.listen(port, null, function(error){
  if(!!error){
    console.log("\x1b[41m%s\x1b[0m", "error while initializing listener on port " + port + ": " + error);
   }
   else{
    console.log("\x1b[32m%s\x1b[0m", "started listener at 'http://" + Host + ':' + port + "'");}
 });

Weitere Informationen finden Sie in meiner anderen Frage, die als doppelt markiert wurde.

8
Sv443

Wenn Sie Ihre andere Frage betrachten, die als Duplikat dieser hier markiert wurde, haben Sie dort einige zusätzliche Informationen, die wahrscheinlich helfen werden, zu erklären, was Sie brauchen. Sie erwähnen insbesondere Folgendes:

Ich möchte mehrere http-Server mit NodeJS hosten, die alle http-Anforderungen erhalten und senden. Zur gleichen Zeit möchte ich, dass Apache ausgeführt wird, der Port 80 belegt. Wenn ich Apache deaktiviere und NodeJS auf Port 80 laufen lasse, funktioniert es, aber ich kann sie nicht gleichzeitig ausführen. 

Dieses Skript wird ausgeführt und empfängt Anforderungen lokal an Port 8081, aber ich kann anscheinend keine AJAX - Anforderung über das Internet an es senden, auch wenn der Port mit meinem Router weitergeleitet wurde:

Ich denke, @ ankit-agarwal hat wahrscheinlich Recht, dass Sie ein Reverse-Proxy-Setup benötigen, um den Verkehr an Ihre verschiedenen Backends weiterzuleiten. Vorausgesetzt, Sie haben eine nach außen gerichtete IP-Adresse, sollten Sie in der Lage sein, auf jedes Ihrer Backends über die Ports zuzugreifen, die sie abhören. Wenn die öffentliche IP-Adresse Ihres Computers beispielsweise 100.120.110.43 lautet:

+---------+------+-------------------------------------+
| Backend | Port |             Web Address             |
+=========+======+=====================================+
| Apache  |   80 | 100.120.110.43 or 100.120.110.43:80 |
| Node1   | 8080 | 100.120.110.43:8080                 |
| Node2   | 8081 | 100.120.110.43:8081                 |
+---------+------+-------------------------------------+

Wenn Sie auf jedes der Backends zugreifen möchten, ohne den Port anzugeben, müssen Sie Ihrem internen Netzwerk auf der Grundlage der Anforderung mitteilen, welches Backend verwendet werden soll. Eine Möglichkeit hierzu ist das pfadbasierte Routing, bei dem Sie Ihren Reverse-Proxy so einrichten, dass der Verkehr basierend auf dem Pfad in der URL zu den verschiedenen Backends geleitet wird. Sie haben Ihre Apache-Konfiguration nicht gepostet, aber Sie können Ihren aktuellen Apache-Server verwenden, um dies mit den Anweisungen ProxyPass und ProxyPassReverse zu tun, die den folgenden Anweisungen ähneln:

ProxyPass "/node1"  "http://100.120.110.43:8080/"
ProxyPassReverse "/node1"  "http://100.120.110.43:8080/"

ProxyPass "/node2"  "http://100.120.110.43:8081/"
ProxyPassReverse "/node2"  "http://100.120.110.43:8081/"

Das Tolle an der Verwendung eines Reverse-Proxys ist, dass Sie Ihre Knoten-Backends nicht für die Öffentlichkeit verfügbar machen müssen. Nehmen wir an, Sie haben dies nicht und sind nur über das interne Netzwerk um 0.0.0.0:port erreichbar.

Listen 80
<VirtualHost *:80>
    DocumentRoot /www/Apache
    ServerName www.apachefrontend.com
    ProxyRequests off
    ProxyPass /node1  http://0.0.0.0:8080/
    ProxyPassReverse /node1  http://0.0.0.0:8080/
    ProxyPass /node2  http://0.0.0.0:8081/
    ProxyPassReverse /node2  http://0.0.0.0:8081/
</VirtualHost>

Sie können auch auf andere Hosts/IPs verweisen, auf die nur Sie Zugriff haben. 

Schließlich können Sie VirtualHost und ServerName auch verwenden, wenn Sie über unterschiedliche DNS-Einträge verfügen, um auf die verschiedenen Backends zu verweisen. 

Listen 80
<VirtualHost *:80>
    DocumentRoot /www/Apache
    ServerName www.apachefrontend.com
</VirtualHost>
<VirtualHost *:80>
    ServerName www.nodebackend1.com
    ProxyRequests off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    <Location />
        ProxyPass /  http://0.0.0.0:8080/
        ProxyPassReverse /  http://0.0.0.0:8080/
    </Location>
</VirtualHost>
<VirtualHost *:80>
    ServerName www.nodebackend2.com
    ProxyRequests off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    <Location />
        ProxyPass /  http://0.0.0.0:8081/
        ProxyPassReverse /  http://0.0.0.0:8081/
    </Location>
</VirtualHost>

Damit eines der oben genannten Elemente funktioniert, müssen Sie mod_proxy und mod_proxy_http in Apache aktiviert haben. 

Dies sind wahrscheinlich nicht die robustesten Beispiele und ich habe sie nicht getestet, aber sie sollten die Idee demonstrieren. Sie können mehr hier lernen.

4
willascend

Ich habe nicht wirklich verstanden, was Sie damit meinen, dass Sie keine Antwort erhalten, weil ich denselben Code ausgeführt habe und es für mich gut funktioniert.

Mir ist hier nur etwas aufgefallen (ich habe in dem Kommentar eine Notiz für Sie aufbewahrt)

server = http.createServer( function(req, res) {
    if (req.method == 'POST') {
        var body = '';
        req.on('data', function (data) {
            body += data;
            doStuff(body); //you haven't defined doStuff so you will end up with a error message on this line, but you sever will still run fine
        });
        res.writeHead(200, {'Content-Type': 'text'});
        res.end('received request successfully'); 
    }
    else {
        res.writeHead(405, {'Content-Type': 'text'});
        res.end('not allowed method ' + req.method + ', try again with GET or POST');
    }

})

 Postman image

Vergessen Sie nicht, "" in Ihrem Bereich body hinzuzufügen, wählen Sie raw und anschließend JSON (application/json). Das sollte für Sie gut laufen, außer dass Sie einen reference error wie unten gezeigt bekommen, aber Sie sollten trotzdem Ihre Antwort von received request successfully bekommen.

Error 

            doStuff(body);
            ^

ReferenceError: doStuff is not defined

Stellen Sie sicher, dass Sie dasselbe tun, und lassen Sie uns wissen, ob das Problem behoben wurde.

0
antzshrek

Wenn ich Apache und Nodejs in demselben Port verwenden möchte: npm http-proxy-middleware

1. Setze Apache Port = 81

[Apache-Verzeichnis] ​​/conf/httpd.conf

~ 59: Hör auf 81

2. Setze nodejs APP-Port = 3050

server.listen (3050); // Bei Linux-Ports <1000 ist das Root-Privileg erforderlich

3. Dritte Proxy-APP verwenden (http-proxy-Middleware)

  // https://www.npmjs.com/package/http-proxy-middleware
  var express = require('express');
  var proxy = require('http-proxy-middleware');

  // proxy middleware options
  var options = {
      target: 'http://localhost:81', // target Host ROOT
      changeOrigin: true, // needed for virtual hosted sites
      ws: true, // proxy websockets
      pathRewrite: {
          // '^/api/old-path' : '/api/new-path',     // rewrite path
          // '^/api/remove/path' : '/path'           // remove base path        
      },
      router: {
          // Examples:
          // when request.headers.Host == 'dev.localhost:3000',
          // override target 'http://www.example.org' to 'http://localhost:8000'
          // 'dev.localhost:3000' : 'http://localhost:8000',
          // 'localhost:9000': 'localhost:9002/sub',                 
          // '/sub': 'http://localhost:9002',

          'localhost': 'http://localhost:81',         //Root to Apache
          'sub.localhost': 'http://localhost:3050',  // internal
          'sub.mydomain.com': 'http://localhost:3050', //external
      },
  };

  // create the proxy (without context)
  // var proxy_wp = proxy(options_wp);
  var proxy_node = proxy(options);

  // mount `exampleProxy` in web server
  var app = express();
  app.use(proxy_node);
  app.listen(80);

Dann:

  1. localhost: 80 - ist Apache-Site 
  2. sub.Localhost: 80 - Knoten 
  3. localhost: 80/Unterknoten, falls gesetzt

für Task Runner benutze ich npm PM2  

0
mdimai666

An Ihrem 8080-Port scheint bereits etwas zu laufen. Wechseln Sie einfach zu einem anderen Port. Zum Beispiel 7000 Und stellen Sie sicher, dass alle Anfragen, die Sie an nodejs app aufrufen, wie folgt aussehen

localhost:7000 // Normal we run at port 80 url simply localhost without port
0
Truong Dang

Ändern Sie einfach Ihren node.js-Serverport wie folgt:

var server = app.listen(8080, function() {
    console.log('Ready on port %d', server.address().port);
});

dabei ist 8080 der neue Port des node.js-Servers.

0
Hendro Febrian

Dies ist das gleiche Szenario wie bei der Verwendung von NodeJs in einem Shared Hosting. Ich habe einen Blogpost darüber geschrieben hier

Lass mich einen Auszug geben.

  1. Führen Sie einfach den NodeJS-Server am 8080-Port aus.

  2. Nehmen wir jetzt an, Ihr Apache arbeitet unter http://example.com und erstellt einen Ordner in Ihrem public_html oder www. Sagen wir, der Name ist server. Ihr neuer Ordnerpfad lautet also http://example.com/server

  3. erstellen Sie eine .htaccess-Datei im Serverordner
  4. füge folgende Zeilen hinzu,

    RewriteEngine On
    RewriteRule ^$ http://127.0.0.1:8080/ [P,L] #which is your node server ip:port
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ http://127.0.0.1:8080/$1 [P,L] #same ip:port
    

Dadurch werden alle Anforderungen von http://example.com/server an Ihren Knotenserver umgeleitet.

0