Je configure mon premier serveur _Node.js
_ sur un _cloud Linux node
_ et je suis assez nouveau en ce qui concerne _Linux admin
_. (BTW je n'essaie pas d'utiliser Apache en même temps.)
Tout est installé correctement, mais j'ai constaté que, sauf si j'utilise le _root login
_, je ne parviens pas à écouter _port 80
_ avec nœud. Cependant, je préférerais ne pas l'exécuter en tant que root pour des raisons de sécurité.
Quelle est la meilleure pratique pour:
Devrais-je transférer le trafic du port 80 vers un autre port d'écoute?
Merci
Ce que je fais sur mes instances de cloud, je redirige le port 80 sur le port 3000 avec cette commande:
Sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
Ensuite, je lance mon Node.js sur le port 3000. Les demandes du port 80 seront mappées sur le port 3000.
Vous devez également éditer votre fichier /etc/rc.local
et ajouter cette ligne moins le Sudo
. Cela ajoutera la redirection au démarrage de la machine. Vous n'avez pas besoin de Sudo
dans /etc/rc.local
parce que les commandes qui y sont exécutées sont exécutées en tant que root
au démarrage du système.
Utilisez le module forever pour lancer votre Node.js avec. Il s'assurera qu'il redémarre s'il se bloque et redirigera les journaux de la console vers un fichier.
Ajoutez votre script de démarrage Node.js au fichier que vous avez modifié pour la redirection de port, /etc/rc.local
. Cela lancera votre script de lancement Node.js au démarrage du système.
Cela s'applique non seulement à Linode, mais également à Digital Ocean, AWS EC2 et à d'autres fournisseurs de VPS. Cependant, sur les systèmes basés sur RedHat, /etc/rc.local
est /ect/rc.d/local
.
Autoriser l'utilisateur sûr à utiliser le port 80
N'oubliez pas que nous ne voulons PAS exécuter vos applications en tant qu'utilisateur root, mais il y a un problème: votre utilisateur sécurisé n'est pas autorisé à utiliser le port HTTP par défaut (80). Votre objectif est de pouvoir publier un site Web que les visiteurs peuvent utiliser en sélectionnant une URL simple à utiliser, telle que http://ip:port/
.
Malheureusement, sauf si vous vous connectez en tant que root, vous devrez normalement utiliser une URL telle que http://ip:port
- où numéro de port> 1024.
Beaucoup de gens restent bloqués ici, mais la solution est simple. Il y a quelques options mais c'est celle que j'aime bien. Tapez les commandes suivantes:
Sudo apt-get install libcap2-bin
Sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``
Désormais, lorsque vous indiquez à une application Node que vous souhaitez qu'elle s'exécute sur le port 80, il ne se plaindra pas.
Vérifiez ceci lien de référence
Supprimez les privilèges root après avoir été lié au port 80 (ou 443).
Cela permet au port 80/443 de rester protégé, tout en vous empêchant de répondre aux demandes en tant que root:
function drop_root() {
process.setgid('nobody');
process.setuid('nobody');
}
Un exemple de travail complet utilisant la fonction ci-dessus:
var process = require('process');
var http = require('http');
var server = http.createServer(function(req, res) {
res.write("Success!");
res.end();
});
server.listen(80, null, null, function() {
console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
drop_root();
console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
});
Voir plus de détails sur ceci référence complète .
Pour le port 80 (qui était la question initiale), Daniel a parfaitement raison. Je suis récemment passé à https
et je devais passer de iptables
à un proxy nginx léger gérant les certificats SSL. J'ai trouvé un réponse utile avec un Gist par gabrielhpugliese sur la façon de gérer cela. Fondamentalement je
Création d'une demande de signature de certificat SSL (CSR) via OpenSSL
openssl genrsa 2048 > private-key.pem
openssl req -new -key private-key.pem -out csr.pem
Modifié la location
dans /etc/nginx/conf.d/example_ssl.conf
à
location / {
proxy_pass http://localhost:3000;
proxy_set_header X-Real-IP $remote_addr;
}
Formatté le certificat pour nginx par cat
- associer les certificats individuels et lié à celui-ci dans mon fichier nginx example_ssl.conf
(et des éléments non commentés, supprimés de 'l'exemple' dans le Nom,...)
ssl_certificate /etc/nginx/ssl/cert_bundle.cert;
ssl_certificate_key /etc/nginx/ssl/private-key.pem;
Espérons que cela puisse sauver quelqu'un d'autres maux de tête. Je suis sûr qu'il y a une manière pure de faire cela, mais nginx a été rapide et cela a fonctionné.
Linode fournit-il un "mur avant" ou un pare-feu sur lequel vous devez ouvrir le port pour la machine? Peut-être que ce sera un bon endroit pour trouver une meilleure solution que le routage sur chaque machine? Lorsque je déploie un serveur sur Azure, je dois définir ce que l'on appelle des points de terminaison. Le point final contient le port public, le port privé (sur la machine) et le protocole (TCP/UDP). Ainsi, si vous exécutez une application sur le port 3000 sur le serveur, elle est accessible sur le port 80 et le routage est effectué par plate-forme, et non par machine. Je peux également définir des ACL sur des ordinateurs d'extrémité.