Come far coesistere Apache e Node.js sullo stesso server

Una delle prime domande che mi sono posto quando ho iniziato a creare server web con Node.js è stata: come faccio a far coesistere Node.js e Apache sullo stesso server? Infatti, chi utilizza Apache e possiede una minima conoscenza di come funziona un server web ed un browser, sa che Apache è in ascolto sulla porta 80 ed implicitamente un browser fa richieste su quest’ultima. E quindi, come può Node.js gestire le richieste del browser senza spodestare Apache dal trono della porta 80? Perché mai dovrei rinunciare a tutti i benefici di PHP ad esempio?

Vediamo come risolvere in modo semplice e veloce utilizzando un ProxyPass!

La prima cosa da fare è installare il modulo necessario, a scopo didattico utilizzo Ubuntu come sistema operativo:

sudo apt-get install libapache2-mod-proxy-html

Subito dopo posso procedere all’attivazione del modulo di Apache:

sudo a2enmod proxy
sudo a2enmod proxy_html
sudo a2enmod proxy_http

Ora, tiriamo fuori l’asso dalla manica ed andiamo a modificare il VirtualHost che ci interessa (ovviamente fate riferimento al vostro):

vim /etc/apache2/sites-enabled/000-default.conf

ed aggiungiamo ad esempio:

<VirtualHost *:80>
    ServerName node.miosito.it
    ProxyPreserveHost on
    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/
</VirtualHost>

Infine, riavviamo Apache per rendere effettive le modifiche con un:

sudo service apache2 restart

In questa maniera, supponendo di avere Node.js in ascolto sulla porta 3000 e collegandoci su http://node.miosito.it (da notare che la richiesta viene fatta alla porta 80) verremo automaticamente dirottati sulla porta 3000 di Node.js, il qualche ci fornirà il risultato della richiesta come se fosse stata fatta direttamente sulla porta 3000.

Semplice, no?