Come non far litigare Apache e Node.js

Appunto qui due cose, visto che derivano da vari posti sull’interwebz e magari può servire a qualcun altro (tipo me nel futuro… e anche perché mi dava un connection refused, che ho risolto non sono sicuro come). Ho appena cominciato con Node.js e non vorrei sbattere più volte contro gli stessi muri.

Devo creare un app da far girare sul serverino di casa: per quello che deve fare l’app ritengo più adeguato usare un database NoSQL, per cui, già che ci siamo, perché non provare anche Node.js?

Problema: finora ho sviluppato su piattaforme LAMP, e sul serverino girano altre app che usano Apache e che non vorrei toccare. In sintesi, devo far andare Apache e Node.js senza che si ammazzino tra di loro.

Soluzione: Apache gestisce tutto e inoltra il traffico verso una determinata directory a Node, che ascolta sulla porta 8080. Savanzaddir, usiamo https per cui mod_ssl e certificati vari si suppongono già a posto, come pure il redirect http -> https.

Lato Node:

var https = require('https');
var fs = require('fs');

var options = {
key: fs.readFileSync('/dove/sono/le/chiavi/key.pem'),
cert: fs.readFileSync('/dove/sono/le/chiavi/cert.pem')
};

https.createServer(options, (req, res) => {
res.writeHead(200);
res.end('hello world\n');
}).listen(8080);

Lato Apache, servono mod_proxy, mod_proxy_http (e magari qualcosa per bilanciare il traffico, cosa di cui non mi occuperò qui).

In qualche file di configurazione di Apache (che ha tre milioni duecentosettananovemila e tre nomi diversi: in questo caso andava inserito in /etc/apache2/sites-enabled/000-default-ssl.conf) nella sezione <VirtualHost _default_:443>
vanno aggiunte le seguenti righe:


SSLProxyEngine On
ProxyPreserveHost On
ProxyPass /node https://localhost:8080
ProxyPassReverse /node https://localhost:8080

dove /node è la cartella dove gira Node e 8080 è la porta che abbiamo inserito nel server Node. Alcuni siti mettono 127.0.0.1 invece di localhost: a me non funzionava.

Per certificati self-signed, aggiungere:


SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off

Non ho approfondito, ma suppongo che senza quelle righe il server tema (giustamente) che possa essere in corso un attacco MITM sul proxy o qualcosa del genere, visto che non può verificare chi ha emesso i certificati. Non è un problema in questo caso, visto che la stretta di mano ce la facciamo da soli: l’importante è che le direttive succitate mantengano la criptazione del traffico.

sudo service apache2 restart e dovremmo essere a posto.