NodeJS su un unico server Apache
Come far convivere i due server web contemporaneamente?
Ciao ragazzi, state gestendo un server web e avete un'applicazione Node.JS da far partire che rimarrà in ascolto sulla porta 80 erogando un certo servizio? Benissimo, avete anche a disposizione un solo server dove magari ci sono già siti web attivi (magari in PHP) che girano con il server web Apache? Benissimo, allora perché monopolizzare la porta 80, con un'unica applicazione (o un unico sito, come preferite), se è una porta universalmente troppo importante e, a meno che non abbiate un server fisico per ogni esigenza, utilizzata da tutto l'Internet che ci circonda? Se non vuoi rinunciare alla comodità dei siti web facili in PHP sotto Apache e allo stesso tempo alla potenza di Node.JS sullo stesso server, sei nel posto giusto.
Questa piccola e semplice guida di aiuterà a risolvere il problema.
In realtà il problema ce lo risolve Apache stesso, o meglio chi per lui ha creato un comodo modulo (plugin di Apache) che si chiama ProxyPass.
Ora la procedura che vedremo viene svolta su un server Apache già installato e funzionante su un sistema Linux con sistema apt-get (come Ubuntu, Debian etc...).
Di solito il modulo è già installato con il pacchetto Apache2, se così non fosse lo installiamo:
sudo apt-get install libapache2-mod-proxy-html
Nello specifico in realtà i moduli che servono sono 3 per una questione di dipendenze e dunque dobbiamo abilitarli così:
sudo a2enmod proxy sudo a2enmod proxy_html sudo a2enmod proxy_http
Ora quello che dobbiamo fare è cambiare la porta 80 dal nostro server NodeJS, di modo che non giri più su quella porta ma lo mettiamo in ascolto per esempio sulla porta 8081, quindi modifichiamo il nostro file di configurazione del sito attivo Apache che sarà qualcosa di simile:
vim /etc/apache2/sites-enabled/000-default.conf
... e ci mettiamo dentro un contenuto come questo, di modo da sfruttare il nostro modulo ProxyPass che farà tutto il giro delle porte per noi:
<VirtualHost *:80> ServerName node.miosito.it #qui ci va il nome a dominio del sito ProxyPreserveHost on ProxyPass / http://localhost:8081/ ProxyPassReverse / http://localhost:8081/ </VirtualHost>
Sarà sufficiente un riavvio del server per apportare le modifiche e notare che non ci siano errori che facciano fallire il processo (se così fosse e non riuscite ad andare avanti, vi invito a commentare e sarò felicissimo di aiutarvi!):
sudo service apache2 restart
A questo punto il nostro server è pronto a ricevere qualsiasi cosa sulla porta 8081 e rigirare tutto sulla 80, senza bloccarla. Dunque possiamo verificare tutto ciò e che di fatto funzioni, interrogando via browser il nostro sito sempre dalla porta 80 solita, semplicemente entrando su http://node.miosito.it
Ovviamente prima di questa verifica ricordiamoci di far partire la nostra applicazione Node.JS e che sia in ascolto di fatto sulla porta 8081 (per quanto riguarda il nostro esempio).
Se vi interessa a questo proposito un comando semplice per far partire un'applicazione Node.JS in background, quindi senza tenerci occupata la schermata del terminare con il cursore che segnala il server in ascolto (come spesso capita con i server Node.JS) potete utilizzare:
node /srv/www/MyUserAccount/server/server.js > stdout.txt > stderr.txt &
Con questo comando il vostro terminale rimarrà libero e in più nella stessa directory del server che avete fatto partire troverete due file, nel primo verranno memorizzati tutti gli standard output che il programma genererà (per intenderci i console.log() ), finché il processo sarà vivo, e nel secondo gli errori che appariranno (e che se non ci fosse questo file di testo, non vedrete mai).
Spero di esservi stato di aiuto, alla prima difficoltà, ricordatevi, nessun problema. Commentate e la risolviamo insieme!