Node.js serveur https: impossible d'écouter sur le port 443 - Pourquoi?
Je suis de la création d'un serveur HTTPS pour la première fois dans le Nœud, et le code (voir ci-dessous) fonctionne pour un port aléatoire comme 6643 mais sur le port 443, ça ne marchera pas. J'obtiens cette erreur:
[Debug][Server]: Initialized...
[Debug][Control Center]: Application initialized...
events.js:72
throw er; //Unhandled 'error' event
^
Error: listen EACCES
at errnoException (net.js:904:11)
at Server._listen2 (net.js:1023:19)
at listen (net.js:1064:10)
at Server.listen (net.js:1138:5)
at Object.module.exports.router (/home/ec2-user/Officeball/Versions/officeball_v0.0.5/server/custom_modules/server.js:52:5)
at Object.<anonymous> (/home/ec2-user/Officeball/Versions/officeball_v0.0.5/server/control_center.js:15:59)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
C'est sur un Linux Amazon EC2 serveur. C'est ma compréhension que une fois que j'ai mis mon DNS du domaine UN Nom de Dossier à l'adresse IP du serveur, quand un utilisateur recherche https://mydomain.com, le navigateur va chercher mon IP du serveur sur le port 443, qui est censé être le port standard pour le trafic HTTPS.
Si ma compréhension est que j'ai besoin pour servir le contenu https via le port 443.
Ce que je fais mal?
Voici mon code serveur:
control_center.js (init)
/* Control Center */
//DEFINE GLOBALS
preloaded = {};
//GET DIRECT WORKING PATH
var dirPath = process.cwd();
//REQUIRE CUSTOM MODULES
var debug = new (require(dirPath +
"/custom_modules/debug"))("Control Center");
var socket = require(dirPath +
"/custom_modules/socket")(4546);
//! this is the relevant line
var server = require(dirPath + "/custom_modules/server").router(443);
//APP INITIALIZE
debug.log("Application initialized...");
server.js
/* Server */
//REQUIRE NPM MODULES
var fs = require('fs'),
https = require('https'),
url = require('url'),
path = require('path');
//GET DIRECT WORKING PATH
var dirPath = process.cwd();
//REQUIRE CUSTOM MODULES
//Snip!
var debug = new (require(dirPath +
"/custom_modules/debug"))("Server");
//Preload requests
var preload = require(dirPath +
'/custom_modules/preload').init();
//INIT MODULE
debug.log("Initialized...");
//DEFINE MODULE VARIABLES
var options = {
key: fs.readFileSync('SSL/evisiion_private_key.pem'),
cert: fs.readFileSync('SSL/evisiion_ssl_cert.pem')
};
//LISTEN FOR PATH REQUESTS
//route requests to server
module.exports.router = function(port) {
https.createServer(options, function(req, res) {
//Snip!
}).listen(port);
};
- Probablement pas le code, prendre un coup d'oeil here.
- quand il est si simple que ça fait mal...
- seule raison pour laquelle je savais, c'est parce que j'ai répondu à la même question avant 🙂 pourraient également avoir à faire avec les privilèges de l'utilisateur root si cette réponse n'ont pas le fixer
- Voir here pour un iptable solution de contournement qui permet de ports inférieurs à 1024 à fonctionner quand pas en cours d'exécution de la racine. Voir aussi here pour un doublon question avec des réponses.
Vous devez vous connecter pour publier un commentaire.
Sur Linux (et, je crois, la plupart des autres systèmes de type Unix), un service de a à exécuter en tant que root pour être capable de se lier à l'un des ports numérotés de moins de 1024.
Je viens de vérifié sur un Nœud de l'application que j'ai eu qui traînent, et j'ai vu exactement la même erreur, ligne de ligne identique sauf les chemins d'accès aux fichiers, quand j'ai changé le port de 5000 à 443.
En développement, la plupart des gens va exécuter le serveur de dev sur un port de numéro supérieur comme 8080. En production, vous souhaiterez peut-être d'utiliser un serveur web comme Nginx pour servir du contenu statique et reverse proxy tout le reste de votre Nœud de l'application, ce qui le rend de moins en moins une question depuis Nginx peut être tout à fait heureux exécuter en tant que root.
EDIT: Comme votre cas d'utilisation, nécessite pour servir du contenu statique, vous pouvez utiliser un serveur web comme Nginx ou Apache pour gérer les fichiers statiques, et reverse proxy à un autre port de votre contenu dynamique. Proxy inverse est assez simple avec Nginx - voici un exemple de fichier de configuration:
Cela suppose que votre application web est accessible sur le port 443, et est en cours d'exécution sur le port 8000. Si l'emplacement correspond à l' /static dossier, il est servi à partir de /var/www/monsite/statique. Sinon, Nginx mains à l'application en cours d'exécution sur le port 8000, qui pourrait être un Node.js app ou un Python l'un, ou quoi que ce soit.
Ce aussi très habilement permet de résoudre votre problème de depuis l'application sera accessible sur le port 443, sans avoir à se lier à ce port.
sudo
process.setgid()
etprocess.setuid()
.