Configurare Apache e Node.js
Oggi vediamo come configurare Apache per far girare una applicazione Node.js usando sempre la porta 80.
Adesso mi spiego meglio andando per punti; considerate che è un caso reale:
- sul dominio https://www.sito.it ho un sito che gira con PHP e Wordpress
- ho caricato la mia applicazione scritta con Node.js ed Express sul server nella sottodirectory api
- dopo averla caricata e lanciata, l'applicazione è raggiungibile all'url http://www.sito.it:8080; notate che sto usando HTTP e non HTTPS in questo caso ovviamente, in quanto non è configurato per la 8080
- voglio raggiungere la app all'indirizzo https://www.sito.it/api senza indicare la porta
- il tutto lasciando il sito principale in funzione
Dobbiamo fare qualche configurazione ad Apache, ma nulla di così difficile.
Dopo ogni operazione vi conviene controllare che il sito sia raggiungibile.
Primva di tutto avviamo due moduli:
# a2enmod proxy
# a2enmod proxy_http
# systemctl restart apache2
Adesso modificate la configurazione del vostro sito; nel mio caso /etc/apache2/sites-enabled/default-ssl.conf:
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost
ServerName www.sito.it
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/www.sito.it/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.sito.it/privkey.pem
<FilesMatch ".(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
# INIZIO AGGIUNTE
ProxyRequests Off
ProxyPreserveHost On
ProxyVia Full
<Proxy *>
Require all granted
</Proxy>
<Location /api>
ProxyPass http://127.0.0.1:8080
ProxyPassReverse http://127.0.0.1:8080
</Location>
# INIZIO AGGIUNTE
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
Vi ho segnalato quello che ho aggiunto; in sostanza si tratte delle impostazione relative al ProxyPass.
Riavviate di nuovo Apache:
# systemctl restart apache2
Adesso dovreste essere in grado di raggiungere sia il sito normale che l'applicazione Express, rispettivamente a questi url:
- https://www.sito.it
- https://www.sito.it/api
- https://www.sito.it/api/PARAM_ID
Questa la mia applicazione Express:
const express = require('express');
const MongoClient = require('mongodb').MongoClient;
const ObjectID = require('mongodb').ObjectID;
const app = express();
const cors = require('cors');
const uri = "mongodb://HOST:27017";
const client = new MongoClient(uri, {useNewUrlParser: true, useUnifiedTopology: true});
const port = 8080;
app.use(cors());
app.get('/api', function (request, response, next) {
// DO STUFF
);
app.get('/api/:id', function (request, response, next) {
// DO STUFF
);
app.listen(port);
Enjoy!
server apache proxypass proxy proxy_http nodejs express
Commentami!