2014-10-26 5 views
6

Ich erstelle einen HTTPS-Server zum ersten Mal in Node, und der Code (siehe unten) funktioniert für einen zufälligen Port wie 6643, aber an Port 443 wird es nicht funktionieren. Ich erhalte diesen Fehler:Node.js https-Server: Port 443 kann nicht angehört werden - Warum?

[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) 

Dies ist auf einem Amazon Linux EC2-Server. Sobald ich den DNS A Name Record meiner Domain auf die IP des Servers gesetzt habe, sucht der Browser bei der Suche nach https://mydomain.com die IP meines Servers an Port 443, der angeblich der Standardport für HTTPS-Verkehr ist.

Also mein Verständnis ist, dass ich https Inhalt über den Port 443.

Was mache ich falsch dienen müssen?


Hier ist mein Server-Code:

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

Wahrscheinlich nicht der Code, werfen Sie einen Blick [hier] (http://stackoverflow.com/questions/5004159/opening-port-80-ec2-amazon-web-services/10454688#10454688). –

+0

@ BrendanAshworth wenn es so einfach ist, dass es weh tut ... –

+0

nur der Grund, ich wusste, war, weil ich die gleiche Frage beantwortet habe :) auch möglicherweise mit Root-Benutzer Privilegien zu tun, wenn diese Antwort nicht behoben –

Antwort

24

Unter Linux (und, wie ich glaube, die meisten anderen Unix-ähnlichen Betriebssystemen), hat ein Service als root ausführen, um einen Port binden zu können nummeriert weniger als 1024.

Ich habe überprüft, es nur auf eine Node App hatte ich herumliegen, und ich sah genau den gleichen Fehler, Zeile für Zeile identische Sperrung der Dateipfade, wenn ich den Port von 5000 auf 443 geändert.

In der Entwicklung werden die meisten Menschen den Dev-Server auf einem laufen B. in der 8080. In der Produktion möchten Sie vielleicht einen geeigneten Webserver wie Nginx verwenden, um statischen Inhalt bereitzustellen und alles andere auf die Node-App umzustellen, was es weniger problematisch macht, da Nginx recht einfach sein kann glücklich als root laufen.

BEARBEITEN: Da in Ihrem Anwendungsfall statische Inhalte bereitgestellt werden müssen, sollten Sie einen Webserver wie Nginx oder Apache verwenden, um die statischen Dateien zu verarbeiten und den Proxy an einen anderen Port für Ihren dynamischen Inhalt umzustellen. Reverse-Proxy ist mit Nginx ganz einfach - hier ein Beispiel-Konfigurationsdatei:

server { 
    listen 443; 
    server_name example.com; 
    client_max_body_size 50M; 

    access_log /var/log/nginx/access.log; 
    error_log /var/log/nginx/error.log; 

    location /static { 
     root /var/www/mysite; 
    } 

    location/{ 
     proxy_pass http://127.0.0.1:8000; 
    } 
} 

Dies setzt voraus, Ihre Web-App auf Port 443, zugänglich sein und läuft auf Port 8000. Wenn die Position des/statischen Ordner übereinstimmt, Es wird von/var/www/mysite/static geliefert. Andernfalls gibt Nginx es an die laufende Anwendung von Port 8000 weiter, die eine Node.js-App oder eine Python-Datei oder was auch immer sein könnte.

Dies löst auch ganz ordentlich Ihr Problem, da die Anwendung auf Port 443 zugegriffen werden kann, ohne tatsächlich an diesen Port binden zu müssen.

+0

Sie hatten Recht, nur warf das Zauberwort ein und es hat sofort funktioniert. Liebe zu 'sudo' –

+3

@ jt0dd - es ist generell eine schlechte Übung, Ihren Webserver unter root-Zugang zu betreiben, da er die Anzahl der Sicherheitslücken erhöht, denen Sie ausgesetzt sein könnten. Sehen Sie sich die zwei Posts in meinem Kommentar zu Ihrer Frage an, um alternative Möglichkeiten zum Abhören eines niedrigen Ports zu erhalten, ohne den Knotenprozess als root auszuführen. Ich persönlich benutze die iptable Lösung. – jfriend00

+0

@ jfriend00 Beat mich einfach dazu! Die iptables-Lösung ist eine gute Lösung, solange Sie keine statischen Dateien bereitstellen müssen. Wenn Sie das tun, denke ich, dass es besser ist, das zu tun, was ich bereits erwähnt habe - diene ihnen mit Nginx und reverse-proxy alles andere an den Port, auf dem die Node.js-Anwendung läuft. –

Verwandte Themen