web-dev-qa-db-fra.com

NodeJS HTTP - écoutez sur un autre port que 80

J'exécute XAMPP sous Windows pour héberger un serveur Apache sur le port 80. J'essaie maintenant de faire fonctionner un script NodeJS en arrière-plan, mais le problème est qu'il ne peut écouter que sur le port 80. Si c'est le cas, tout fonctionne comme prévu mais je ne peux pas faire fonctionner Apache en même temps, car Apache est prioritaire et sert uniquement mon site Web. Le script NodeJS ne parvient même pas à écouter.

Ma question est la suivante: comment puis-je changer le port d'écoute du script NodeJS (le port spécifique importe peu) pour qu'Apache puisse toujours fonctionner sur le port 80 et que je puisse accéder au script NodeJS du monde entier?.

Une partie du code NodeJS:

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 + "'");}
 });

Des informations supplémentaires sont dans mon autre question qui a été marqué comme un doublon.

8
Sv443

En regardant votre autre question , marquée comme une copie de celle-ci, vous avez quelques informations supplémentaires qui aideront probablement à élucider ce dont vous avez besoin. Plus précisément, vous mentionnez les éléments suivants:

Je souhaite héberger plusieurs serveurs http avec NodeJS, qui reçoivent et envoient des requêtes http. En même temps, je veux faire fonctionner Apache, qui occupe le port 80. Si je désactive Apache et laisse NodeJS s'exécuter sur le port 80, cela fonctionnera mais je ne peux pas les faire fonctionner en même temps. 

Ce script s'exécutera et recevra les demandes localement sur le port 8081, mais je n'arrive pas à lui envoyer une demande AJAX via Internet, même après avoir transféré le port avec mon routeur:

Je pense que @ ankit-agarwal a probablement raison en ce sens qu'il vous faut une configuration de proxy inverse pour transférer le trafic vers vos différents serveurs. En supposant que vous ayez une adresse IP externe, vous devriez pouvoir accéder à chacun de vos serveurs en utilisant les ports sur lesquels ils écoutent. Par exemple, si l'adresse IP publique exposée de votre machine est 100.120.110.43:

+---------+------+-------------------------------------+
| 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                 |
+---------+------+-------------------------------------+

Si vous souhaitez accéder à chacun des serveurs sans spécifier le port, vous devez avoir un moyen de dire à votre réseau interne quel serveur utiliser en fonction de la demande. Une solution consiste à utiliser le routage basé sur le chemin, où vous configurez votre proxy inverse pour acheminer le trafic vers les différents serveurs en fonction du chemin indiqué dans l’URL. Vous n'avez pas publié votre configuration Apache, mais vous pouvez utiliser votre serveur Apache actuel pour gérer cela à l'aide des directives ProxyPass et ProxyPassReverse similaires à ci-dessous:

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/"

La bonne chose à propos de l’utilisation d’un proxy inverse est qu’il n’est pas nécessaire d’exposer le backend de vos nœuds au public. Supposons que ce n’est pas le cas et qu’ils ne sont accessibles que depuis le réseau interne à 0.0.0.0:port.

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>

Vous pouvez également indiquer différents hôtes/ips auxquels vous seul avez accès. 

Enfin, vous pouvez également utiliser VirtualHost et ServerName si vous avez différents enregistrements DNS pour pointer vers les différents serveurs. 

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>

Pour que l'un des éléments ci-dessus fonctionne, vous devez activer mod_proxy et mod_proxy_http dans Apache. 

Ce ne sont probablement pas les exemples les plus robustes et je ne les ai pas testés, mais ils devraient démontrer l'idée. Vous pouvez en apprendre plus ici .

4
willascend

Je n'ai pas vraiment compris ce que vous vouliez dire par vous n'obtenez aucune réponse, car j'ai utilisé le même code et cela fonctionne bien pour moi.

J'ai seulement remarqué quelque chose ici (j'ai gardé une note pour vous dans le commentaire)

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

Lorsque vous exécutez votre demande de publication, n'oubliez pas d'ajouter "" dans votre zone body, sélectionnez raw puis choisissez JSON (application/json). Cela devrait fonctionner correctement pour vous, sauf que vous pourriez obtenir un reference error comme indiqué ci-dessous, mais vous devriez quand même recevoir votre réponse de received request successfully.

Erreur 

            doStuff(body);
            ^

ReferenceError: doStuff is not defined

Assurez-vous de faire la même chose et faites-nous savoir si votre problème est résolu.

0
antzshrek

Si je veux utiliser Apache et Nodejs sur le même port: npm http-proxy-middleware

1. Définissez Apache Port = 81

[Répertoire Apache] /conf/httpd.conf

~ 59: Ecoute 81

2. Définir le port APP nodejs = 3050

server.listen (3050); // sur les ports linux <1000 nécessitent le privilège root

3. Utiliser une troisième application proxy (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);

Ensuite:

  1. localhost: 80 - est le site Apache 
  2. sub.localhost: 80 - noeud 
  3. localhost: 80/sous-noeud, si vous définissez

pour le coureur de tâche j'utilise npm PM2  

0
mdimai666

Semblez quelque chose qui fonctionne déjà sur votre port 8080. Il suffit de changer pour un autre port. Par exemple, 7000 Et assurez-vous que toutes les demandes que vous appelez à l'application nodejs sont les suivantes

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

Il suffit de changer le port de votre serveur node.js comme suit:

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

où 8080 est le nouveau port du serveur node.js.

0
Hendro Febrian

Ceci est le même scénario que l'utilisation de NodeJs dans un hébergement partagé. J'ai écrit un article sur ce blog ici

Laissez-moi vous donner un extrait.

  1. Il suffit d’exécuter le serveur NodeJS sur le port 8080.

  2. Supposons maintenant que votre serveur Apache se trouve dans http://example.com , créez un dossier dans votre public_html ou www. Disons que le nom est server. Ainsi, votre nouveau chemin de dossier est http://example.com/server

  3. créer un fichier .htaccess dans le dossier du serveur
  4. ajoutez les lignes suivantes,

    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
    

Cela redirigera toutes les demandes de http://example.com/server vers votre serveur de nœud.

0
Aritra Chakraborty