Bienvenue ! Vous avez eu raison de choisir un hébergement dédié (VPS, Public Cloud, Serveur dédié) pour votre WordPress, il sera plus rapide.
Voici le tutoriel pour installer manuellement un serveur Debian pour WordPress.
Bon tuto !
Nous allons installer ensemble WordPress :
- sur un VPS OVHCloud dédié à cette utilisation. (Vous pouvez démarrer sur la gamme starter et augmenter la puissance par la suite).
- MAIS : les instances Public Cloud disposent de plus de puissance CPU (sauf les gammes sandbox/discovery).
Ce tutoriel se concentre volontairement sur les actions minimum pour obtenir rapidement un WordPress en ligne. Certains aspects plus poussés seront abordés dans d’autres tutoriels.
N’ayant pas de VPS de test, ce tutoriel a été préparé sur une machive virtuelle proxmox.
1. Réservez une URL pour le site web
D’abord, vous avez besoin d’un nom de domaine sinon il n’y aura pas de site internet.
Mon URL sera : https://wordpress-dmo.libreok.ovh
2. Notez l'adresse IP du VPS
Il faut se rendre dans le manager OVH et lire l’IPv4 :
3. Configurez la zone DNS de votre nom de domaine
Mon nom de domaine est libreok.ovh., je me rends dans sa configuration pour ajouter une entrée de type A pour mon site de test :
4. Connectez-vous au compte root du VPS
Pour administrer le VPS, vous devez vous connecter au compte root par SSH.
(Beaucoup de tutoriels sur internet présentent les commandes à taper préfixées de la commande sudo afin de préciser que la commande se lance sous le compte root. Je ne vais préfixer ici aucune commande de sudo car je me connecte en permanence avec le compte root. Si vous suivez le tutoriel dans l’ordre, il n’y aura aucun soucis.)
Pour vous connecter au compte root des VPS OVH, vous devez passer par le compte intermédiaire créé par OVH : debian (pour le cas des distributions Debian).
Si vous travaillez sous Windows, je vous invite à utiliser Putty pour vous connecter par le protocole SSH au VPS. Vous pouvez aussi utiliser aussi le Powershell.
Si vous êtes déjà sous Linux ou Mac, c’est nettement plus simple, vous lancez juste un terminal :
ssh -4 debian@vps-xxxxxxxx.vps.ovh.net
Linux dmo1 5.10.0-15-cloud-amd64 #1 SMP Debian 5.10.120-1 (2022-06-09) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Jun 25 22:50:52 2022 from 2001:41d0:302:1100::9:ef69
debian@dmo1:~$
Puis passez root :
sudo su -
5. Mettez à jour le système
Avant de continuer, on va mettre à jour le système fraîchement installé et le redémarrer :
5.1 Mise à jour des index des paquets logiciels
apt update
Hit:1 http://deb.debian.org/debian bullseye InRelease
Hit:2 http://security.debian.org/debian-security bullseye-security InRelease
Hit:3 http://deb.debian.org/debian bullseye-updates InRelease
Hit:4 http://deb.debian.org/debian bullseye-backports InRelease
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.
root@dmo1:~#
5.2 Mise à jour des paquets (dans mon cas, c'est déjà à jour)
apt upgrade
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
5.3 Redémarrage
On redémarre le VPS et on attend une minute avant de se reconnecter en root :
reboot
6. Installation du service de base de données MariaDB (anciennement MySQL)
WordPress aura besoin d’enregistrer une partie de ses données en base de données. Voici comment préparer le service de base de données :
6.1 Connectez-vous de nouveau serveur en tant que root.
ssh debian@vps-xxxxxxxx.vps.ovh.net
sudo su -
6.2 Installez les paquets de base de données
apt install mariadb-server
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
galera-4 gawk libcgi-fast-perl libcgi-pm-perl libclone-perl libconfig-inifiles-perl libdbd-mariadb-perl libdbi-perl
libencode-locale-perl libfcgi-bin libfcgi-perl libfcgi0ldbl libgdbm-compat4 libhtml-parser-perl libhtml-tagset-perl
libhtml-template-perl libhttp-date-perl libhttp-message-perl libio-html-perl liblwp-mediatypes-perl libmariadb3
libmpfr6 libperl5.32 libsigsegv2 libsnappy1v5 libterm-readkey-perl libtimedate-perl liburi-perl lsof
mariadb-client-10.5 mariadb-client-core-10.5 mariadb-common mariadb-server-10.5 mariadb-server-core-10.5 mysql-common
perl perl-modules-5.32 rsync
Suggested packages:
gawk-doc libmldbm-perl libnet-daemon-perl libsql-statement-perl libdata-dump-perl libipc-sharedcache-perl libwww-perl
mailx mariadb-test netcat-openbsd perl-doc libterm-readline-gnu-perl | libterm-readline-perl-perl make
libtap-harness-archive-perl
The following NEW packages will be installed:
galera-4 gawk libcgi-fast-perl libcgi-pm-perl libclone-perl libconfig-inifiles-perl libdbd-mariadb-perl libdbi-perl
libencode-locale-perl libfcgi-bin libfcgi-perl libfcgi0ldbl libgdbm-compat4 libhtml-parser-perl libhtml-tagset-perl
libhtml-template-perl libhttp-date-perl libhttp-message-perl libio-html-perl liblwp-mediatypes-perl libmariadb3
libmpfr6 libperl5.32 libsigsegv2 libsnappy1v5 libterm-readkey-perl libtimedate-perl liburi-perl lsof
mariadb-client-10.5 mariadb-client-core-10.5 mariadb-common mariadb-server mariadb-server-10.5
mariadb-server-core-10.5 mysql-common perl perl-modules-5.32 rsync
0 upgraded, 39 newly installed, 0 to remove and 0 not upgraded.
Need to get 26.7 MB of archives.
After this operation, 208 MB of additional disk space will be used.
Do you want to continue? [Y/n]
Note importante : dans beaucoup de tutoriels sur internet, vous trouverez des exemples qui proposent de lancer la commande mysql_secure_installation. Cette commande ne sert, a priori, à rien sur Debian. Le service installé par défaut est déjà sécurisé. Il n’y a pas de bases de données « test », il n’y a pas de compte anonyme. Le compte root du système est autorisé à se connecter en root de façon sécurisée sur MariaDB par socket et sans mot de passe, c’est très bien comme ça.
6.3 Créez un utilisateur pour WordPress dans MariaDB
6.3.1 Connexion à l’utilisateur root de MariaDB
Note importante : l’utilisateur root de MariaDB n’a rien à voir avec l’utilisateur root du système.
mysql -u root mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 30
Server version: 10.5.15-MariaDB-0+deb11u1 Debian 11
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [mysql]>
6.3.2 Création de la base de données wordpress
Sous le prompt de MariaDB, tapez ces commandes suivantes :
CREATE DATABASE wordpress CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Query OK, 1 row affected (0.000 sec)
MariaDB [mysql]>
6.3.3 Création de l’utilisateur wordpress
Inventez un mot de passe pour l’utilisateur wordpress et notez-le pour plus tard (vous pouvez le conserver sur un gestionnaire de mot de passe).
Attention ! Remplacez mot_de_passe dans ce qui suite par un mot de passe !
CREATE USER 'wordpress'@'localhost' IDENTIFIED BY 'mot_de_passe';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'localhost';
FLUSH PRIVILEGES;
MariaDB [mysql]> CREATE USER 'wordpress'@'localhost' IDENTIFIED BY 'xxxxxxxxx';
Query OK, 0 rows affected (0.001 sec)
MariaDB [mysql]> GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'localhost';
Query OK, 0 rows affected (0.002 sec)
MariaDB [mysql]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.000 sec)
MariaDB [mysql]>
6.3.4 Quittez le prompt MariaDB
MariaDB [mysql]> \q
7. Installez PHP
apt install php-soap php-fpm php-curl php-intl php-mbstring php-gd php-zip php-xml php-mysql php-imap php-imagick php-redis
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
bzip2 fontconfig-config fonts-dejavu-core fonts-droid-fallback fonts-noto-mono fonts-urw-base35 ghostscript gsfonts
imagemagick-6-common libaom0 libavahi-client3 libavahi-common-data libavahi-common3 libc-client2007e libcups2
libdav1d4 libde265-0 libdeflate0 libfftw3-double3 libfontconfig1 libgd3 libgomp1 libgs9 libgs9-common libheif1
libidn11 libijs-0.35 libjbig0 libjbig2dec0 libjpeg62-turbo liblcms2-2 liblqr-1-0 libltdl7 libmagickcore-6.q16-6
libmagickwand-6.q16-6 libnuma1 libonig5 libopenjp2-7 libpaper-utils libpaper1 libsodium23 libtiff5 libwebp6
libwebpdemux2 libwebpmux3 libx11-6 libx11-data libx265-192 libxau6 libxcb1 libxdmcp6 libxext6 libxpm4 libxslt1.1
libzip4 mailcap mime-support mlock php-common php-igbinary php7.4-cli php7.4-common php7.4-curl php7.4-fpm php7.4-gd
php7.4-imap php7.4-intl php7.4-json php7.4-mbstring php7.4-mysql php7.4-opcache php7.4-readline php7.4-soap
php7.4-xml php7.4-zip poppler-data
Suggested packages:
bzip2-doc fonts-noto fonts-freefont-otf | fonts-freefont-ttf fonts-texgyre ghostscript-x uw-mailutils cups-common
libfftw3-bin libfftw3-dev libgd-tools liblcms2-utils libmagickcore-6.q16-6-extra redis-server php-pear poppler-utils
fonts-japanese-mincho | fonts-ipafont-mincho fonts-japanese-gothic | fonts-ipafont-gothic fonts-arphic-ukai
fonts-arphic-uming fonts-nanum
Recommended packages:
ttf-dejavu-core
The following NEW packages will be installed:
bzip2 fontconfig-config fonts-dejavu-core fonts-droid-fallback fonts-noto-mono fonts-urw-base35 ghostscript gsfonts
imagemagick-6-common libaom0 libavahi-client3 libavahi-common-data libavahi-common3 libc-client2007e libcups2
libdav1d4 libde265-0 libdeflate0 libfftw3-double3 libfontconfig1 libgd3 libgomp1 libgs9 libgs9-common libheif1
libidn11 libijs-0.35 libjbig0 libjbig2dec0 libjpeg62-turbo liblcms2-2 liblqr-1-0 libltdl7 libmagickcore-6.q16-6
libmagickwand-6.q16-6 libnuma1 libonig5 libopenjp2-7 libpaper-utils libpaper1 libsodium23 libtiff5 libwebp6
libwebpdemux2 libwebpmux3 libx11-6 libx11-data libx265-192 libxau6 libxcb1 libxdmcp6 libxext6 libxpm4 libxslt1.1
libzip4 mailcap mime-support mlock php-common php-curl php-fpm php-gd php-igbinary php-imagick php-imap php-intl
php-mbstring php-mysql php-redis php-soap php-xml php-zip php7.4-cli php7.4-common php7.4-curl php7.4-fpm php7.4-gd
php7.4-imap php7.4-intl php7.4-json php7.4-mbstring php7.4-mysql php7.4-opcache php7.4-readline php7.4-soap
php7.4-xml php7.4-zip poppler-data
0 upgraded, 88 newly installed, 0 to remove and 0 not upgraded.
Need to get 35.4 MB of archives.
After this operation, 133 MB of additional disk space will be used.
Do you want to continue? [Y/n]
8. Installez le service web NGINX
apt install nginx-extras
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
geoip-database libgeoip1 libluajit-5.1-2 libluajit-5.1-common libnginx-mod-http-auth-pam
libnginx-mod-http-cache-purge libnginx-mod-http-dav-ext libnginx-mod-http-echo libnginx-mod-http-fancyindex
libnginx-mod-http-geoip libnginx-mod-http-geoip2 libnginx-mod-http-headers-more-filter libnginx-mod-http-image-filter
libnginx-mod-http-lua libnginx-mod-http-ndk libnginx-mod-http-perl libnginx-mod-http-subs-filter
libnginx-mod-http-uploadprogress libnginx-mod-http-upstream-fair libnginx-mod-http-xslt-filter libnginx-mod-mail
libnginx-mod-nchan libnginx-mod-stream libnginx-mod-stream-geoip libnginx-mod-stream-geoip2 nginx-common
Suggested packages:
geoip-bin fcgiwrap nginx-doc ssl-cert
The following NEW packages will be installed:
geoip-database libgeoip1 libluajit-5.1-2 libluajit-5.1-common libnginx-mod-http-auth-pam
libnginx-mod-http-cache-purge libnginx-mod-http-dav-ext libnginx-mod-http-echo libnginx-mod-http-fancyindex
libnginx-mod-http-geoip libnginx-mod-http-geoip2 libnginx-mod-http-headers-more-filter libnginx-mod-http-image-filter
libnginx-mod-http-lua libnginx-mod-http-ndk libnginx-mod-http-perl libnginx-mod-http-subs-filter
libnginx-mod-http-uploadprogress libnginx-mod-http-upstream-fair libnginx-mod-http-xslt-filter libnginx-mod-mail
libnginx-mod-nchan libnginx-mod-stream libnginx-mod-stream-geoip libnginx-mod-stream-geoip2 nginx-common nginx-extras
0 upgraded, 27 newly installed, 0 to remove and 0 not upgraded.
Need to get 6620 kB of archives.
After this operation, 17.2 MB of additional disk space will be used.
Do you want to continue? [Y/n]
9. Créez un compte utilisateur système pour wordpress
Nous allons organiser les répertoires de façon à être un peu tout-terrain comme si on pourrait avoir d’autres applications et en séparant l’exécution de wordpress sous son propre utilisateur.
9.1 Création des répertoires d’accueil
Attention : remplacez « wordpress-dmo.libreok.ovh » par votre URL à vous (sans le https://)
SITEURL=wordpress-dmo.libreok.ovh
mkdir -p /var/www/users/wor /var/www/users/wor/home /var/www/users/wor/${SITEURL} /var/www/users/wor/${SITEURL}/app /var/www/users/wor/${SITEURL}/data /var/www/users/wor/${SITEURL}/scripts /var/www/users/wor/${SITEURL}/log /var/www/users/wor/${SITEURL}/tmp
9.2 Création de l’utilisateur
useradd wor --home /var/www/users/wor/home --gid users --shell /bin/bash
9.3 Attributions des droits et des accès aux répertoires
chmod 0751 /var/www/users /var/www/users/wor /var/www/users/wor/home /var/www/users/wor/${SITEURL} /var/www/users/wor/${SITEURL}/app
chmod 0701 /var/www/users/wor/${SITEURL}/tmp
chmod 0710 /var/www/users/wor/${SITEURL}/data
chmod 0700 /var/www/users/wor/${SITEURL}/scripts /var/www/users/wor/${SITEURL}/log
chgrp users /var/www/users/wor /var/www/users/wor/${SITEURL}
chown wor:users /var/www/users/wor/home /var/www/users/wor/${SITEURL}/app /var/www/users/wor/${SITEURL}/log /var/www/users/wor/${SITEURL}/tmp /var/www/users/wor/${SITEURL}/scripts
chown wor:www-data /var/www/users/wor/${SITEURL}/data
10. Téléchargement et décompression de WordPress
On passe sous l’utilisateur wor pour télécharger et décompresser puis on revient root :
Attention : remplacez « wordpress-dmo.libreok.ovh » par votre URL à vous (sans le https://)
su - wor
SITEURL=wordpress-dmo.libreok.ovh
SYSUSER=`whoami`
wget https://fr.wordpress.org/wordpress-latest-fr_FR.tar.gz
tar xvzf wordpress-latest-fr_FR.tar.gz -C /var/www/users/${SYSUSER}/${SITEURL}/app
exit
11. Création d’un lien symbolique vers le bon répertoire de l’application
Ce lien sera utilisé par le service web pour trouver le répertoire de l’application. Dans un contexte d’installation d’autres applications, ce système serait adaptable pour d’autres applications qui auraient une structure différente.
Attention : nous sommes de nouveaut root (suite à la commande « exit » de la commande précédente)
ln -s /var/www/users/wor/${SITEURL}/app/wordpress /var/www/users/wor/${SITEURL}/web
12. Configuration du pool PHP pour wordpress
Éditez un nouveau fichier :
nano /etc/php/7.4/fpm/pool.d/wordpress.conf
Puis mettez ce contenu (nous allons remplacer le mot clé SITEURL juste après) :
[wordpress]
user = wor
group = users
listen = /var/run/php7-fpm-wor.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0666
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 5
pm.max_requests = 1000
catch_workers_output = yes
security.limit_extensions = .php
php_value[include_path] = .
php_admin_value[error_log] = /var/www/users/wor/SITEURL/log/php-fpm.error.log
php_admin_value[max_input_time] = 180
php_admin_value[max_input_vars] = 3000
php_admin_value[memory_limit] = 256M
php_admin_value[open_basedir] = /var/www/users/wor/SITEURL/web/:/var/www/users/wor/SITEURL/app/:/var/www/users/wor/SITEURL/data/:/var/www/users/wor/SITEURL/log/:/var/www/users/wor/SITEURL/tmp/
php_admin_value[upload_tmp_dir] = /var/www/users/wor/SITEURL/tmp/
Sauvegardez le fichier : ctrl-X puis Y et touche entrée.
Maintenant on remplace le mot clé :
sed -i "s/SITEURL/${SITEURL}/g" /etc/php/7.4/fpm/pool.d/wordpress.conf
Relancez php-fpm :
systemctl restart php7.4-fpm
13. Création du certificat SSL
On installe maintenant l’outil certbot qui permet de demander un certificat SSL à letsencrypt :
apt -y install certbot
L’outil va couper le serveur nginx le temps de demander le certificat :
Attention : remplacez « votreemail@votrecomain.com » par votre adresse courriel :
certbot certonly --standalone --agree-tos --no-eff-email -m votreemail@votredomain.com -d ${SITEURL} --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx"
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Account registered.
Running pre-hook command: systemctl stop nginx
Requesting a certificate for wordpress-dmo.libreok.ovh
Performing the following challenges:
http-01 challenge for wordpress-dmo.libreok.ovh
Waiting for verification...
Cleaning up challenges
Running post-hook command: systemctl start nginx
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/wordpress-dmo.libreok.ovh/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/wordpress-dmo.libreok.ovh/privkey.pem
Your certificate will expire on 2022-10-26. To obtain a new or
tweaked version of this certificate in the future, simply run
certbot again. To non-interactively renew *all* of your
certificates, run "certbot renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
root@dmo1:~#
14. Configurez NGINX
On efface le fichier de configuration par défaut :
rm /etc/nginx/sites-enabled/default
On crée un répertoire pour écrire de petits bouts de configuration à inclure par la suite :
mkdir /etc/nginx/includes
On édite un nouveau fichier de configuration pour de futurs accès letsencrypt si on veut remplacer le renouvellement de la méthode standalone à la méthode webroot :
mkdir -p /var/acme/.well-known/acme-challenge/
nano /etc/nginx/includes/acme.conf
location ^~ /.well-known/acme-challenge/ {
root /var/acme;
autoindex off;
index index.html;
try_files $uri $uri/ =404;
auth_basic off;
}
On édite un nouveau fichier de configuration pour l’accès en HTTP (sans SSL) :
nano /etc/nginx/sites-available/${SITEURL}.conf
On met ceci dans l’éditeur (nous allons remplacer le mot clé SITEURL juste après) :
server {
listen *:80;
server_name SITEURL;
index index.html index.php;
access_log /var/log/nginx/SITEURL.access.log combined;
error_log /var/log/nginx/SITEURL.error.log;
location / {
index index.html index.php;
rewrite ^ https://$server_name$request_uri? permanent;
}
include includes/acme.conf;
}
On édite un nouveau fichier de configuration pour l’accès en HTTPS (pour le SSL) (nous allons remplacer le mot clé SITEURL juste après) :
nano /etc/nginx/sites-available/${SITEURL}_ssl.conf
server {
listen *:443 ssl http2;
listen [::]:443 ssl http2 ;
server_name SITEURL;
ssl_certificate /etc/letsencrypt/live/SITEURL/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/SITEURL/privkey.pem;
ssl_session_cache shared:SSL:20m;
ssl_session_timeout 1d;
ssl_session_tickets off;
ssl_buffer_size 4k;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA;
ssl_prefer_server_ciphers off;
ssl_stapling on;
ssl_stapling_verify on;
index index.html index.php;
access_log /var/log/nginx/ssl-SITEURL_ssl.access.log combined;
error_log /var/log/nginx/ssl-SITEURL_ssl.error.log;
root /var/www/users/wor/SITEURL/web/;
location ~ (.+\.php)(.*)$ {
include /etc/nginx/fastcgi.conf;
fastcgi_pass unix:/var/run/php7-fpm-wor.sock;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_hide_header X-Frame-Options;
fastcgi_intercept_errors on;
}
}
Maintenant on remplace le mot clé :
sed -i "s/SITEURL/${SITEURL}/g" /etc/nginx/sites-available/*
On active les configurations :
cd /etc/nginx/sites-enabled
ln -s ../sites-available/${SITEURL}.conf
ln -s ../sites-available/${SITEURL}_ssl.conf
systemctl restart nginx
15. Accès à WordPress
Utilisez votre navigateur en remplaçant l’URL par celle de votre site : https://wordpress-dmo.libreok.ovh/