SLBCloud
Intermédiaire10 min de lecture

Installer nginx, PHP et MariaDB

La pile classique pour héberger un site dynamique, montée proprement, avec les réglages PHP qui évitent les mauvaises surprises.

nginx sert les fichiers, PHP-FPM exécute le code, MariaDB garde les données. C'est la pile derrière la majorité des sites du web, et elle tourne sans effort sur le plus petit de nos VPS.

Installer

bash
sudo apt update
sudo apt install -y nginx mariadb-server php-fpm php-mysql \
  php-mbstring php-xml php-curl php-zip php-gd php-intl

Sécuriser la base

Le script ci-dessous supprime les comptes anonymes, la base de démonstration, et l'accès distant à root. Répondez oui à tout.

bash
sudo mariadb-secure-installation

Créer une base et son utilisateur — un par site

sql
CREATE DATABASE monsite CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'monsite'@'localhost' IDENTIFIED BY 'un-mot-de-passe-long';
GRANT ALL PRIVILEGES ON monsite.* TO 'monsite'@'localhost';
FLUSH PRIVILEGES;

utf8mb4, jamais utf8

Le jeu de caractères nommé utf8 dans MySQL et MariaDB est incomplet : il ne sait pas coder les émojis ni certains caractères asiatiques, et les tronque silencieusement. utf8mb4 est le vrai UTF-8. Choisissez-le à la création, le corriger après coup est pénible.

Le vhost qui envoie PHP à FPM

/etc/nginx/sites-available/monsite

nginx
server {
    listen 80;
    server_name monsite.fr;
    root /var/www/monsite/public;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php-fpm.sock;
    }

    # Ne jamais servir ce qui commence par un point : .env, .git…
    location ~ /\. {
        deny all;
    }
}

La règle qui protège votre .env

Sans le dernier bloc, un fichier .env ou un dossier .git déposé à la racine du site est téléchargeable par n'importe qui — avec les mots de passe de votre base dedans. C'est l'une des fuites les plus courantes du web, et elle se prévient en quatre lignes.

bash
ls /run/php/          # vérifier le nom exact du socket
sudo ln -s /etc/nginx/sites-available/monsite /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

Les réglages PHP qui comptent

Les valeurs par défaut sont pensées pour un hébergement mutualisé. Sur votre machine, quatre d'entre elles méritent d'être relevées, dans /etc/php/*/fpm/php.ini :

RéglagePar défautRaisonnablePourquoi
upload_max_filesize2M64MEnvoyer une image ou un PDF
post_max_size8M64MDoit être ≥ upload_max_filesize
memory_limit128M256MTraitement d'images, exports
max_execution_time30120Imports, migrations
bash
sudo systemctl restart php*-fpm

En production, coupez l'affichage des erreurs

display_errors doit rester à Off : un message d'erreur PHP affiché révèle des chemins, des noms de tables et parfois des identifiants. Les erreurs vont dans le journal, pas dans la page.

Bloqué malgré tout ? Ouvrez un ticket : on répond en français, et on regarde votre machine si besoin.

Ouvrir un ticket