Je vous propose cette procédure d'installation sur un serveur linux sous Debian, vous disposerez d'un serveur web propulsé par Apache, prêt à l'emploi avec PHP et HTTPS, dans des conditions de production. Les certificats vous seront fournis pas Let's Encrypt et ils se renouvelleront tous les ans.
J'utilise l'éditeur de texte Nano pour éditer les fichiers de configuration mais libre à vous d'utiliser l'éditeur que vous souhaitez. Vous veillerez à remplacer "www.mon-site.fr" par votre propre nom de domaine dans les différentes configurations qui vous sont proposées.
Installation d'Apache
Pour installer Apache, rien de plus simple, il suffit de taper la commande suivante :
apt install apache2 -y
Pour un serveur de production, je vous conseille d'éditer le fichier de configuration de sécurité d'Apache en modifiant la valeur de ServerTokens OS en ServerTokens Prod et ServerSignature On en ServerSignature Off. L'intérêt étant de disposer d'Apache en mode production et de cacher sa "signature" aux utilisateurs pour éviter une attaque ciblée sur une version précise du logiciel.
nano /etc/apache2/conf-available/security.conf
Nous allons ensuite configurer un virtualhost allégé dans un premier temps en attendant de récupérer les certificats SSL par la suite. Éditez le fichier suivant :
nano /etc/apache2/sites-available/www.mon-site.fr.conf
Je vous propose cette configuration :
ServerTokens Prod
<VirtualHost *:80>
ServerName www.mon-site.fr
DocumentRoot "/var/www/html/"
<Directory "/var/www/html/">
AllowOverride None
Require all granted
</Directory>
ErrorLog "/var/log/apache2/www.mon-site.fr.error.log"
CustomLog "/var/log/apache2/www.mon-site.fr.access.log" combined
ServerSignature Off
</VirtualHost>
Rien de particulier ici, nous initialisons notre serveur web sur le répertoire /var/www/html/ et nous spécifions des fichiers logs pour ce virtualhost. Vous pouvez maintenant appliquer les changements et redémarrer Apache :
rm /etc/apache2/sites-enabled/000-default.conf
ln -s /etc/apache2/sites-available/www.mon-site.fr.conf /etc/apache2/sites-enabled/www.mon-site.fr.conf
a2enmod ssl && a2enmod rewrite && a2enmod headers && a2enmod proxy
systemctl restart apache2
Nous allons maintenant installer les certificats SSL avec Let's Encrypt de façon assez simple via un certbot avec cette suite de commandes :
apt install snapd
snap install core
snap refresh core
apt-get remove certbot
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot
certbot certonly --apache
ls /etc/letsencrypt/live/
Avec ces commandes, nous avons installé le service snapd qui nous permet à son tour d'installer certbot (nous nous assurons dans un premier temps que certbot n'est pas déjà installé avec la commande "remove"). Une fois installé, certbot va lire la configuration apache est vous proposer la création de certificats SSL pour le ou les domaines qu'il trouve, ici "www.mon-site.fr". Une fois la procédure terminée, vous pouvez vérifier la présence de ces certificats avec la commande "ls".
Maintenant que nous avons nos certificats, il convient de donner à Apache une configuration plus appropriée qui lui permettra de servir des contenus sous HTTPS. Éditez à nouveau le fichier suivant :
nano /etc/apache2/sites-enabled/www.mon-site.fr.conf
Je vous propose cette nouvelle configuration qui écrasera l'ancienne :
ServerTokens Prod
<VirtualHost *:80>
ServerName www.mon-site.fr
DocumentRoot "/var/www/html/"
<Directory "/var/www/html/">
AllowOverride None
Require all granted
</Directory>
ErrorLog "/var/log/apache2/www.mon-site.fr.error.log"
CustomLog "/var/log/apache2/www.mon-site.fr.access.log" combined
ServerSignature Off
Redirect permanent / //www.mon-site.fr/
</VirtualHost>
<VirtualHost *:443>
ServerName www.mon-site.fr
DocumentRoot "/var/www/html/"
<Directory "/var/www/html/">
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog "/var/log/apache2/www.mon-site.fr.error.log"
CustomLog "/var/log/apache2/www.mon-site.fr.access.log" combined
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/www.mon-site.fr/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.mon-site.fr/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.mon-site.fr/fullchain.pem
ServerSignature Off
FileETag None
<IfModule mod_headers.c>
<Directory />
Header set X-XSS-Protection "1; mode=block"
Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure
Header always append X-Frame-Options SAMEORIGIN
</Directory>
</IfModule>
</VirtualHost>
Ainsi nous avons un virtualhost sous le port 80 (HTTP) qui redirigera systématiquement vers HTTPS. Nous initialisons toujours notre serveur web sur le répertoire /var/www/html/ et nous spécifions toujours des fichiers logs pour le virtualhost 443 (HTTPS). La configuration est agrémentée de diverses directives destinées à rendre votre site internet plus sécurisé, libre à vous de les conserver ou non. Vous pouvez maintenant appliquer les changements et redémarrer Apache :
systemctl restart apache2
Pour être certain que nos certificats SSL seront renouvellés automatique, il suffit de faire un test avec la commande suivante, si tout est bon vous en serez informé (le contraire également) :
certbot renew --dry-run
Installation de PHP
Si vous disposez d'un site internet dynamique sous PHP, voici une suite de commande qui vous permettra d'installer PHP dans sa version 8.3 (à adapter en cas de montée de version). Libre à vous d'éditer les différentes librairies qui accompagne PHP dans la dernière ligne, vous avez les principales, vous n'aurez peut-être pas besoin de toutes celles-ci et vous aurez peut-être besoin d'une ou plusieurs autres en particulier.
dpkg -l | grep php | tee packages.txt
apt install apt-transport-https
curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg //packages.sury.org/php/apt.gpg
sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] //packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
apt update
apt install php8.3 php8.3-{bz2,cli,curl,gd,iconv,intl,json,ldap,mbstring,mysql,xml,zip}
Vous pouvez éditer les limitations de PHP dans la configuration suivante :
nano /etc/php/8.3/apache2/php.ini
Voici les différentes variables que vous pourriez souhaiter modifier :
- max_execution_time
- max_input_time
- memory_limit
- post_max_size
- upload_max_filesize
Conclusion
Vous disposez maintenant d'un serveur web accessible via votre nom de domaine.
Pour information, j'ai utilisé cette documentation pour installer plusieurs serveurs web et notamment un serveur personnel sur un Raspberry Pi hébergé chez moi qui me permet de servir du contenu via plusieurs domaines et sous domaines.
Pour aller plus loin, il serait sans doute utile d'installer un service de base de données comme par exemple Mariadb histoire d'avoir le LAMP (Linux Apache Mysql PHP) complet.
Si vous avez des questions ou des remarques, je vous invite à utiliser les commentaires plus bas !