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.
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 .
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');
}
})
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.
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:
pour le coureur de tâche j'utilise npm PM2
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
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.
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.
Il suffit d’exécuter le serveur NodeJS sur le port
8080
.Supposons maintenant que votre serveur Apache se trouve dans http://example.com , créez un dossier dans votre
public_html
ouwww
. Disons que le nom estserver
. Ainsi, votre nouveau chemin de dossier est http://example.com/server- créer un fichier
.htaccess
dans le dossier du serveurajoutez 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.