Ce guide installe WordPress sur un VPS vierge avec la pile la plus performante à ressources égales : Nginx, PHP-FPM 8.3 et MariaDB. Comptez une vingtaine de minutes. Les commandes sont écrites pour Ubuntu 24.04 LTS, qui fournit PHP 8.3 par défaut ; les différences avec Debian 12 sont signalées.
Vous préférez une interface graphique ? Un hébergement avec Plesk installe WordPress en un clic : voyez notre hébergement web. Et si vous hésitez sur la taille du serveur, lisez d'abord quel VPS pour héberger WordPress.
1. Prérequis
- Un VPS avec au moins 2 Go de RAM (4 Go conseillés pour un site professionnel), fraîchement installé.
- Un accès root en SSH. Si ce n'est pas encore fait, suivez les premiers pas sur votre VPS.
- Un nom de domaine dont l'enregistrement
Apointe vers l'adresse IP du VPS. Voir configurer les DNS.
Dans tout le guide, remplacez monsite.fr par votre domaine.
2. Installer Nginx, MariaDB et PHP 8.3
apt update && apt upgrade -y
apt install -y nginx mariadb-server \
php8.3-fpm php8.3-mysql php8.3-curl php8.3-gd php8.3-intl \
php8.3-mbstring php8.3-xml php8.3-zip php8.3-bcmath php-imagick
Ces extensions couvrent ce que WordPress demande dans son écran « Santé du site » : intl pour les langues, gd et imagick pour les images, zip pour installer des extensions depuis l'administration.
php8.3 par php8.2 partout dans ce guide, ou ajoutez le dépôt de Sury pour obtenir PHP 8.3. WordPress recommande PHP 8.3 ou plus récent.Sécurisez ensuite MariaDB : cette commande supprime les comptes anonymes et la base de test.
mariadb-secure-installation
Répondez Y à toutes les questions. Sur Ubuntu, le compte root de MariaDB s'authentifie par le système : mariadb lancé en root ne demande pas de mot de passe, et c'est voulu. Pour aller plus loin, voir sécuriser MariaDB.
3. Créer la base de données
Générez d'abord un mot de passe robuste, puis créez une base et un utilisateur dédiés à ce site :
openssl rand -base64 24
mariadb
CREATE DATABASE monsite CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'monsite'@'localhost' IDENTIFIED BY 'LE_MOT_DE_PASSE_GENERE';
GRANT ALL PRIVILEGES ON monsite.* TO 'monsite'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Un utilisateur par site : si un site est compromis, l'attaquant n'accède pas aux bases des autres.
4. Télécharger et configurer WordPress
cd /var/www
wget https://wordpress.org/latest.tar.gz
tar xzf latest.tar.gz && rm latest.tar.gz
mv wordpress monsite.fr
cd monsite.fr
cp wp-config-sample.php wp-config.php
Ouvrez wp-config.php et renseignez DB_NAME, DB_USER et DB_PASSWORD. Remplacez ensuite le bloc des clés de sécurité (les lignes AUTH_KEY à NONCE_SALT) par des valeurs uniques, générées par le service officiel :
curl -s https://api.wordpress.org/secret-key/1.1/salt/
Ajoutez aussi ces deux lignes au-dessus de /* That's all, stop editing! */ :
define('DISABLE_WP_CRON', true); // remplace par un vrai cron, voir étape 8
define('DISALLOW_FILE_EDIT', true); // pas d'éditeur de code dans l'administration
Donnez enfin les fichiers à l'utilisateur du serveur web :
chown -R www-data:www-data /var/www/monsite.fr
find /var/www/monsite.fr -type d -exec chmod 755 {} \;
find /var/www/monsite.fr -type f -exec chmod 644 {} \;
chmod 640 /var/www/monsite.fr/wp-config.php
5. Configurer Nginx
Créez le fichier /etc/nginx/sites-available/monsite.fr :
server {
listen 80;
listen [::]:80;
server_name monsite.fr www.monsite.fr;
root /var/www/monsite.fr;
index index.php;
client_max_body_size 64M;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
# fichiers sensibles
location ~ /\.(?!well-known) { deny all; }
location = /xmlrpc.php { deny all; }
location ~* /(?:uploads|files)/.*\.php$ { deny all; }
location ~* \.(?:css|js|jpe?g|png|gif|webp|avif|svg|ico|woff2?)$ {
expires 30d;
add_header Cache-Control "public";
access_log off;
}
}
Trois règles méritent une explication. Le \. dans \.php$ est important : sans l'antislash, le point accepte n'importe quel caractère. Le blocage de xmlrpc.php coupe une porte d'entrée très utilisée pour les attaques par force brute ; retirez-le seulement si vous utilisez l'application mobile WordPress ou Jetpack. Enfin, aucun fichier PHP ne doit pouvoir s'exécuter depuis le dossier des médias envoyés.
ln -s /etc/nginx/sites-available/monsite.fr /etc/nginx/sites-enabled/
rm -f /etc/nginx/sites-enabled/default
nginx -t && systemctl reload nginx
6. Régler PHP
Les limites par défaut de PHP bloquent l'envoi de médias de plus de 2 Mo. Créez un fichier de surcharge plutôt que de modifier php.ini : il survit aux mises à jour.
cat > /etc/php/8.3/fpm/conf.d/99-wordpress.ini <<'EOF'
upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 256M
max_execution_time = 120
EOF
systemctl restart php8.3-fpm
Gardez upload_max_filesize aligné avec client_max_body_size dans Nginx, sinon c'est la plus petite des deux valeurs qui s'applique.
7. Activer HTTPS
apt install -y certbot python3-certbot-nginx
certbot --nginx -d monsite.fr -d www.monsite.fr --redirect
Certbot obtient le certificat, ajoute la configuration HTTPS et redirige le HTTP. Le renouvellement est automatique. Détails et dépannage dans Nginx et Let's Encrypt.
8. Finaliser l'installation
Ouvrez https://monsite.fr : l'assistant WordPress vous demande le nom du site et le compte administrateur. Choisissez un identifiant qui n'est pas admin et un mot de passe long.
Mettez ensuite en place le cron système, déclaré à l'étape 4. Par défaut, WordPress lance ses tâches planifiées pendant les visites, ce qui ralentit certaines pages et ne s'exécute pas quand le site n'a pas de trafic.
echo '*/5 * * * * www-data /usr/bin/php /var/www/monsite.fr/wp-cron.php >/dev/null 2>&1' > /etc/cron.d/wordpress-monsite
Enfin, dans Réglages → Permaliens, choisissez « Titre de la publication » : des adresses lisibles sont meilleures pour le référencement.
9. Sécuriser et optimiser
Le site fonctionne. Voici ce qui le rend durable, par ordre de priorité :
- Pare-feu : seuls les ports SSH, 80 et 443 ouverts. Voir configurer UFW.
- SSH par clé et connexion root désactivée. Voir sécuriser SSH.
- Fail2ban sur SSH et sur
wp-login.php. Voir Fail2ban avancé. - Sauvegardes quotidiennes hors du serveur, fichiers et base. Voir sauvegardes avec Borg.
- Performances : OPcache, cache de pages Nginx et Redis. Voir optimiser PHP-FPM et le cache Nginx.