Configuració del host virtual d’Apache (Wordpress)
Passos previs
L’objectiu dels hosts virtuals és accedir directament al docker, sense necessitat d’especificar el nom genèric del VPS i el port del docker.
Per realitzar aquesta feina amb Apache requerim de la habilitació dels següents mòduls:
- proxy
- proxy_http
- ssl
Tots tres es poden habilitar amb l’ordre sudo a2enmod <nomModul>
Configuració del host virtual
En el host virtual definirem el nom de domini wordpress.gserrat.cat i l’àlies www.wordpress.gserrat.cat.
En cas d’accedir al servidor amb algun d’aquests dos noms de domini, redirigirem a l’usuari a “http://127.0.0.1:8081”, és a dir, al localhost al port 8081, on s’està exportant el docker amb Wordpress.
La “/” indica que accedim a l’arrel del directori, és a dir, wordpress.gserrat.cat i no wordpress.gserrat.cat/altre.html. En cas de fer-ho, redirigirà igualment al localhost pel port 8081
Això ho realitzarem especificant la directiva ProxyPass, i mitjançant la directiva ProxyPassReverse reescriu la capçalera de resposta i redireccionament per tal de que mostri el nom de domini.
Certificació SSL del host virtual
La certificació SSL ens permet encriptar el tràfic HTTP mitjançant HTTPS, fet imprescindible quan allotjem una pàgina web.
Primerament, haurem d’instal·lar les utilitats necessàries i preparar l’entorn:
- Instal·lar certbot amb l’ordre sudo apt install certbot python3-certbot-apache -y, l’eina que permet emetre certificats gratuïts
- Verificar que el domini ja està creat al DNS
- Assegurar que el host virtual està activat (sudo a2ensite <hostVirtual>)
Per certificar els dos noms de domini executarem la següent ordre sudo certbot --apache -d wordpress.gserrat.cat -d www.wordpress.gserrat.cat
Un cop certificat ens generarà un nou host virtual que escoltarà pel port 443 d’Apache i on tindrà els mòduls de certificació en HTTPS.
És important modificar aquest host virtual i afegir la directiva RequestHeader set X-Forwarded-Proto “https”. Això és important un cop entenem el funcionament del proxy invers:
- Quan el client es comunica amb el servidor fa servir HTTPS
- El servidor rep la petició i actúa com a servidor intermediari
- El servidor es comunica amb el Docker, però ho fa amb HTTP
- El Docker respon la petició del servidor en HTTP
- El servidor repon al client amb la informació del Docker però en HTTPS
Això, en cas de Wordpress és un problema, ja que si comprova que accedim mitjançant una URL amb HTTPS però la comunicació realment és HTTP, no funcionarà correctament
Amb la directiva anteriorment esmentada, el servidor modifica la capçalera HTTP per “fer veure” que la petició és HTTPS, tot i no estar certificada, per tal de que Wordpress conclogui que la connexió és HTTPS
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName wordpress.gserrat.cat
ServerAlias www.wordpress.gserrat.cat
RequestHeader set X-Forwarded-Proto "https"
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8081/
ProxyPassReverse / http://127.0.0.1:8081/
# Logs
ErrorLog ${APACHE_LOG_DIR}/wiki-error.log
CustomLog ${APACHE_LOG_DIR}/wiki-access.log combined
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/wordpress.gserrat.cat/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/wordpress.gserrat.cat/privkey.pem
</VirtualHost>
</IfModule>