Installation du serveur Apache
Installer Apapche2
Activer les modules que vous souhaitez et surtout mod_reverse
Listes des modules actifs
access_compat.load authz_core.load deflate.load http2.load mpm_event.load proxy.conf proxy_http2.load rewrite.load ssl.load
alias.conf authz_host.load dir.conf log_debug.load negotiation.conf proxy_connect.load proxy_http.load setenvif.conf status.conf
alias.load authz_user.load dir.load log_forensic.load negotiation.load proxy_ftp.conf proxy.load setenvif.load status.load
auth_basic.load autoindex.conf env.load mime.conf proxy_ajp.load proxy_ftp.load proxy_wstunnel.load slotmem_shm.load xml2enc.load
authn_core.load autoindex.load filter.load mime.load proxy_balancer.conf proxy_html.conf reqtimeout.conf socache_shmcb.load
authn_file.load deflate.conf headers.load mpm_event.conf proxy_balancer.load proxy_html.load reqtimeout.load ssl.conf
Paramétrage Apache
Paramétrage global
Configurer votre 1er Vhost
Exemple de Vhost http
################# Exemple Vhost #################
<VirtualHost *:80>
ServerName exemple.fr
DocumentRoot /var/www/exemple.fr
TransferLog /var/log/apache2/exemple.fr_access.log
ErrorLog /var/log/apache2/exemple.fr_error.log
</VirtualHost>
Créer le dossier du vhost
mkdir /var/www/exemple.fr
chown www-data:www-data /var/www/exemple.fr
Normalement votre site est accessible à votre adresse “exemple.fr”
Pensez à faire pointer vos DNS au bon endroit et à faire les règles de par-feu (port 80 entrant vers port 80 de votre IP-serveurWEB)
Voila là ça doit marcher !
Paramétrage du SSL via ACME
Je passe les commandes d’installation de ACME accessible ICI.
Générez votre certificat SSL
acme.sh --issue -d exemple.fr -w /var/www/exemple.fr/
Paramétrage du reverse proxy
Activer Module proxy de apache commande : a2enmod "lemodule"
Modifier votre vhost en ajoutant la partie SSL et reverse
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName exemple.fr
SSLEngine on
SSLStrictSNIVHostCheck Off
SSLCertificateFile /root/.acme.sh/exemple.fr/exemple.fr.cer
SSLCertificateKeyFile /root/.acme.sh/exemple.fr/exemple.fr.key
SSLCertificateChainFile /root/.acme.sh/exemple.fr/ca.cer
SSLCACertificateFile /root/.acme.sh/exemple.fr/fullchain.cer
SSLProxyEngine On
SSLProxyCheckPeerCN Off
SSLProxyCheckPeerName Off
SSLProxyVerify none
ProxyPreserveHost On
ProxyPass / https://exemple.local/
ProxyPassReverse / https://exemple.local/
TransferLog /var/log/apache2/exemple.fr-ssl_access.log
ErrorLog /var/log/apache2/exemple.fr-ssl_error.log
</VirtualHost>
</IfModule>
Quelques explications sur les directives.
Tout d’abord la partie serveur https
- VirtualHost *:443 : précise que l’on écoute sur le port 443 (https)
- ServerName : le nom de domaine du serveur (FQDN)
- DocumentRoot : c’est juste pour information, car tout le trafic sera redirigé (d’ailleurs on ne met pas de directive Directory)
- SSLEngineOn, SSLCertificateFile, SSLCertificateKeyFile, SSLCertificateChainFile, SSLCACertificateFile : paramétrage du SSL, avec le certificat et la clé
Viennent ensuite les directives relatives à la partie Reverse proxy :
- SSLProxyEngine : activation du mode Proxy en SSL
- SSLProxyCheckPeerCN et SSLProxyCheckPeerName : permet de ne pas vérifier le CN et le nom du serveur distant
- SSLProxyVerify : pas de vérification du serveur distant
- SSLProxyMachineCertificateFile : concaténation de la clé et du certificat de la machine (pas nécessaire si on désactive les vérifications)
- ProxyPass et ProxyPassReverse : il s’agit du paramétrage “standard” du mode reverse proxy
- ProxyPreserverHost On : garde le nom DNS du reverse proxy (sinon on récupère l’adresse IP du serveur cible)
On test et redémarre apache :
apachectl -t
service apache2 reload
On vérifie que le serveur apache s’est lancé :
root@reverse:~# systemctl status apache2.service
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2018-08-22 19:25:21 CEST; 2 weeks 0 days ago
Process: 16647 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/SUCCESS)
Main PID: 9935 (apache2)
Tasks: 129 (limit: 4915)
CGroup: /system.slice/apache2.service
├─ 9935 /usr/sbin/apache2 -k start
├─16653 /usr/sbin/apache2 -k start
└─16718 /usr/sbin/apache2 -k start
sept. 06 16:51:11 reverse systemd[1]: Reloading The Apache HTTP Server.
sept. 06 16:51:11 reverse apachectl[16647]: [Thu Sep 06 16:51:11.831280 2018] [so:warn] [pid 16650:tid 139911641449664] AH01574: module authn_core_module is already loaded, skipping
sept. 06 16:51:11 reverse apachectl[16647]: [Thu Sep 06 16:51:11.831860 2018] [so:warn] [pid 16650:tid 139911641449664] AH01574: module authz_core_module is already loaded, skipping
sept. 06 16:51:11 reverse apachectl[16647]: [Thu Sep 06 16:51:11.832190 2018] [so:warn] [pid 16650:tid 139911641449664] AH01574: module proxy_module is already loaded, skipping
sept. 06 16:51:11 reverse apachectl[16647]: [Thu Sep 06 16:51:11.832507 2018] [so:warn] [pid 16650:tid 139911641449664] AH01574: module proxy_http_module is already loaded, skipping
sept. 06 16:51:11 reverse apachectl[16647]: [Thu Sep 06 16:51:11.832822 2018] [so:warn] [pid 16650:tid 139911641449664] AH01574: module proxy_wstunnel_module is already loaded, skipping
sept. 06 16:51:11 reverse apachectl[16647]: [Thu Sep 06 16:51:11.833171 2018] [so:warn] [pid 16650:tid 139911641449664] AH01574: module headers_module is already loaded, skipping
sept. 06 16:51:11 reverse apachectl[16647]: [Thu Sep 06 16:51:11.833551 2018] [so:warn] [pid 16650:tid 139911641449664] AH01574: module setenvif_module is already loaded, skipping
sept. 06 16:51:11 reverse apachectl[16647]: [Thu Sep 06 16:51:11.833873 2018] [so:warn] [pid 16650:tid 139911641449664] AH01574: module ssl_module is already loaded, skipping
sept. 06 16:51:11 reverse systemd[1]: Reloaded The Apache HTTP Server.
Enfin vous pouvez ajouter une directive pour forcer la redirection entre http et https en entrant
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
En cas de souci, les commandes systemctl status et journalctl -xe permettent de débugguer les erreurs.
J’ai notamment eu un cas où le service ne voulait pas démarrer car le ServerName n’était pas renseigné dans le fichier de configuration global.
Mon vhost complet
################# exemple.fr #################
<VirtualHost *:80>
ServerName exemple.fr
DocumentRoot /var/www/exemple.fr
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
TransferLog /var/log/apache2/exemple.fr_access.log
ErrorLog /var/log/apache2/exemple.fr_error.log
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName exemple.fr
SSLEngine on
SSLStrictSNIVHostCheck Off
SSLCertificateFile /root/.acme.sh/exemple.fr/exemple.fr.cer
SSLCertificateKeyFile /root/.acme.sh/exemple.fr/exemple.fr.key
SSLCertificateChainFile /root/.acme.sh/exemple.fr/ca.cer
SSLCACertificateFile /root/.acme.sh/exemple.fr/fullchain.cer
SSLProxyEngine On
SSLProxyCheckPeerCN Off
SSLProxyCheckPeerName Off
SSLProxyVerify none
ProxyPreserveHost On
ProxyPass / https://exemple.local/
ProxyPassReverse / https://exemple.local/
TransferLog /var/log/apache2/exemple.fr-ssl_access.log
ErrorLog /var/log/apache2/exemple.fr-ssl_error.log
</VirtualHost>
</IfModule>