Tous les produits
Search
Centre de documentation

Elastic Compute Service:Déployer une pile LNMP

Dernière mise à jour :Sep 22, 2026

Installez et configurez manuellement Nginx, MySQL et PHP sur une instance ECS pour héberger des sites web dynamiques tels que WordPress ou Magento, tout en conservant un contrôle total sur chaque composant.

Architecture de la solution

image
  1. Le navigateur d'un utilisateur envoie une requête HTTP au port 80 de l'instance ECS.

  2. Nginx reçoit et achemine les requêtes. Il sert directement les ressources statiques (fichiers HTML, CSS et images) et transfère les requêtes PHP (fichiers se terminant par .php) à PHP-FPM via FastCGI.

  3. PHP-FPM exécute le code PHP. Si le code nécessite un accès à la base de données, il se connecte à MySQL.

  4. MySQL exécute les requêtes SQL provenant du script PHP et renvoie les résultats.

  5. PHP-FPM génère le HTML à partir du résultat et le renvoie à Nginx, qui transmet la réponse au navigateur.

Procédure

Nous recommandons une instance ECS disposant d'au moins 2 GiB de mémoire.

Étape 1 : Préparer l'instance

Configurez l'accès public, ouvrez le port 80 dans le groupe de sécurité et mettez à jour les packages système.

  1. Configurez l'accès public.

    Assurez-vous que votre instance ECS dispose d'une adresse IP publique ou d'une Elastic IP Address (EIP). Consultez la rubrique Activer l'accès public pour une instance.

  2. Ajoutez une règle de groupe de sécurité.

    Dans le groupe de sécurité de votre instance ECS, ajoutez une règle entrante pour autoriser le trafic TCP sur le port 80. Consultez la rubrique Ajouter une règle de groupe de sécurité.

  3. Mettez à jour les packages système.

    Alibaba Cloud Linux 3 / CentOS 8

    1. Connectez-vous à l'instance ECS.

      1. Accédez à Console ECS - InstancesECS console - Instances. Dans le coin supérieur gauche, sélectionnez la région et le groupe de ressources correspondant à la ressource cible.

      2. Sur la page des détails de l'instance, cliquez sur Connect puis sélectionnez Workbench. Suivez les instructions affichées à l'écran pour vous connecter.

    2. Mettez à jour tous les packages.

      sudo dnf update -y

    Alibaba Cloud Linux 2 / CentOS 7

    1. Connectez-vous à l'instance ECS.

      1. Accédez à Console ECS - InstancesECS console - Instances. Dans le coin supérieur gauche, sélectionnez la région et le groupe de ressources correspondant à la ressource cible.

      2. Sur la page des détails de l'instance, cliquez sur Connect puis sélectionnez Workbench. Suivez les instructions affichées à l'écran pour vous connecter.

    2. Mettez à jour tous les packages.

      sudo yum update -y

    Ubuntu

    1. Connectez-vous à l'instance ECS.

      1. Accédez à Console ECS - InstancesECS console - Instances. Dans le coin supérieur gauche, sélectionnez la région et le groupe de ressources correspondant à la ressource cible.

      2. Sur la page des détails de l'instance, cliquez sur Connect puis sélectionnez Workbench. Suivez les instructions affichées à l'écran pour vous connecter.

    2. Mettez à jour tous les packages.

      sudo apt update -y && sudo apt upgrade -y

Étape 2 : Installer Nginx

  1. Ajoutez le dépôt Nginx et installez Nginx.

    Alibaba Cloud Linux 3 / CentOS 8

    # Add the official Nginx repository.
    sudo tee /etc/yum.repos.d/nginx.repo <<-'EOF'
    [nginx-stable]
    name=nginx stable repo
    baseurl=https://nginx.org/packages/centos/8/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true
    EOF
    
    # Install Nginx.
    sudo dnf -y install nginx

    Alibaba Cloud Linux 2 / CentOS 7

    # Add the official Nginx repository.
    sudo tee /etc/yum.repos.d/nginx.repo <<-'EOF'
    [nginx-stable]
    name=nginx stable repo
    baseurl=https://nginx.org/packages/centos/7/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true
    EOF
    
    # Install Nginx.
    sudo yum -y install nginx

    Ubuntu

    # Install dependencies for Nginx.
    sudo apt install -y curl gnupg2 ca-certificates lsb-release ubuntu-keyring
    
    # Import the official Nginx signing key to verify package authenticity.
    curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
    
    # Set up the APT repository for Nginx.
    echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
    
    # Install Nginx.
    sudo apt update
    sudo apt install -y nginx
  2. Démarrez Nginx et activez-le au démarrage.

    L'option enable --now démarre le service et l'active au démarrage.
    sudo systemctl enable --now nginx
  3. Vérifiez que Nginx est en cours d'exécution. Exécutez curl http://127.0.0.1. Si la sortie contient le code HTML de la page d'accueil de Nginx, l'installation a réussi.

Étape 3 : Installer MySQL

  1. Installez MySQL.

    Alibaba Cloud Linux 3 / CentOS 8

    # Alibaba Cloud Linux 3 requires compat-openssl10 for compatibility with older OpenSSL versions.
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        if [ "$ID" = "alinux" ] && [ "$VERSION_ID" = "3" ]; then
            sudo yum install -y compat-openssl10
        fi
    fi
    
    # Add the YUM repository for MySQL 8.4.
    sudo rpm -Uvh https://repo.mysql.com/mysql84-community-release-el8-1.noarch.rpm
    
    # Install the MySQL service.
    sudo dnf install -y mysql-server

    Alibaba Cloud Linux 2 / CentOS 7

    # Add the repository for MySQL 8.4.
    sudo rpm -Uvh https://repo.mysql.com/mysql84-community-release-el7-1.noarch.rpm
    
    # Install the MySQL service.
    sudo yum install -y mysql-server

    Ubuntu

    # The default Ubuntu repository includes MySQL, so you can install it directly.
    # Ubuntu 20.04 and later versions install MySQL 8.0 by default.
    # Ubuntu 18.04 and earlier versions install MySQL 5.x by default.
    sudo apt install -y mysql-server
  2. Démarrez MySQL et activez-le au démarrage.

    Alibaba Cloud Linux / CentOS

    sudo systemctl enable --now mysqld

    Ubuntu

    sudo systemctl enable --now mysql
  3. Sécurisez l'installation.

    La configuration par défaut de MySQL autorise les utilisateurs anonymes et la connexion root à distance. Exécutez le script de sécurité pour renforcer l'installation.

    1. Récupérez le mot de passe root initial.

      Cette étape s'applique uniquement à Alibaba Cloud Linux et CentOS. Ubuntu utilise l'authentification par socket pour root par défaut.

      # Extract and display the temporary password from the log.
      sudo grep 'temporary password' /var/log/mysqld.log
    2. Exécutez le script de sécurité.

      Exécutez sudo mysql_secure_installation et suivez les instructions :

      1. Réinitialisez le mot de passe root : utilisez le mot de passe temporaire pour vous connecter et définissez un nouveau mot de passe.

        Utilisez un mot de passe robuste d'au moins 12 caractères, comprenant des majuscules, des minuscules, des chiffres et des caractères spéciaux.
      2. Supprimez les utilisateurs anonymes : saisissez Y.

      3. Interdisez la connexion root à distance : saisissez Y.

      4. Supprimez la base de données de test : saisissez Y.

      5. Rechargez les tables de privilèges : saisissez Y.

Étape 4 : Installer PHP

Installez PHP, PHP-FPM et l'extension MySQL.

  1. Ajoutez un dépôt PHP et installez PHP.

    Alibaba Cloud Linux 3 / CentOS 8

    # Add the Remi repository.
    cat > /etc/yum.repos.d/remi.repo << 'EOF'
    [remi]
    name=Remi\'s RPM Repository for Enterprise Linux 8 - x86_64
    baseurl=https://rpms.remirepo.net/enterprise/8/remi/x86_64/
    enabled=1
    gpgcheck=1
    gpgkey=https://rpms.remirepo.net/RPM-GPG-KEY-remi2024
    
    [remi-safe]
    name=Remi Safe Repository
    baseurl=https://rpms.remirepo.net/enterprise/8/safe/x86_64/
    enabled=1
    gpgcheck=1
    gpgkey=https://rpms.remirepo.net/RPM-GPG-KEY-remi2024
    EOF
    
    # Import the GPG key.
    rpm --import https://rpms.remirepo.net/RPM-GPG-KEY-remi2024
    
    # Install yum-utils.
    dnf install -y yum-utils
    
    # Install PHP, PHP-FPM, and the MySQL extension.
    dnf install -y php php-fpm php-mysqlnd

    Alibaba Cloud Linux 2 / CentOS 7

    # Install the Remi repository.
    sudo yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm
    
    # Install yum-utils and enable the PHP 8.2 repository.
    sudo yum install -y yum-utils
    sudo yum-config-manager --enable remi-php82
    
    # Install PHP, PHP-FPM, and the MySQL extension.
    sudo yum install -y php php-fpm php-mysqlnd

    Ubuntu

    # Install the tool for managing PPAs.
    sudo apt install -y software-properties-common
    
    # Add the ondrej/php PPA repository.
    sudo add-apt-repository -y ppa:ondrej/php
    
    # Install PHP 8.2, PHP-FPM, and the MySQL extension.
    sudo apt install -y php8.2 php8.2-fpm php8.2-mysql
  2. Démarrez PHP-FPM et activez-le au démarrage.

    Alibaba Cloud Linux / CentOS

    sudo systemctl enable --now php-fpm

    Ubuntu

    sudo systemctl enable --now php8.2-fpm

Étape 5 : Configurer Nginx pour traiter PHP

Par défaut, Nginx ne sert que des fichiers statiques. Configurez-le pour transférer les requêtes .php à PHP-FPM afin que les pages PHP soient rendues correctement au lieu d'être téléchargées.

  1. Sauvegardez le fichier de configuration par défaut de Nginx.

    sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
  2. Obtenez l'adresse de communication du service PHP-FPM.

    Nginx utilise cette adresse pour transférer les requêtes PHP à PHP-FPM.

    Alibaba Cloud Linux / CentOS

    PHP_FPM_LISTEN=$(sudo sed -n 's/^\s*listen\s*=\s*//p' /etc/php-fpm.d/www.conf | head -n 1)
    echo "$PHP_FPM_LISTEN"

    Ubuntu

    PHP_FPM_LISTEN=$(sudo sed -n 's/^\s*listen\s*=\s*//p' /etc/php/8.2/fpm/pool.d/www.conf | head -n 1)
    echo "$PHP_FPM_LISTEN"
  3. Configurez Nginx pour transférer les requêtes .php à PHP-FPM.

    Remplacez <PHP_FPM_ADDRESS> par l'adresse de communication obtenue à l'étape précédente et exécutez la commande.

    • Si la sortie est un chemin de fichier (par exemple, /run/php-fpm/www.sock), le service utilise un socket Unix. Le format de l'adresse est unix:FILE_PATH, par exemple unix:/run/php-fpm/www.sock.

    • Si la sortie est une adresse IP et un port (par exemple, 127.0.0.1:9000), le service utilise un socket TCP. Utilisez directement l'adresse IP et le port comme adresse de communication.

    sudo tee /etc/nginx/conf.d/default.conf <<-'EOF'
    server {
        listen       80;
        server_name  localhost;
        root /usr/share/nginx/html;
    
        # Set the default index files.
        index index.php index.html index.htm;
    
        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }
    
        # Forward .php requests to PHP-FPM.
        location ~ \.php$ {
            fastcgi_pass   <PHP_FPM_ADDRESS>;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
    EOF
  4. Testez le fichier de configuration.

    sudo nginx -t
    • Si la sortie contient successful, la configuration est correcte. Passez à l'étape suivante.

    • Si la sortie contient failed, vérifiez que vous avez correctement remplacé l'adresse, ou restaurez la sauvegarde :

      sudo mv /etc/nginx/conf.d/default.conf.bak /etc/nginx/conf.d/default.conf
  5. Redémarrez Nginx pour appliquer la nouvelle configuration.

    sudo systemctl restart nginx

Étape 6 : Vérifier la pile

Créez des fichiers de test pour confirmer que Nginx transfère les requêtes PHP et que PHP peut se connecter à MySQL.

  1. Vérifiez le traitement PHP par Nginx.

    1. Créez un fichier de test : générez un fichier avec phpinfo() pour afficher la configuration PHP.

      echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/html/phpinfo.php
    2. Vérifiez dans un navigateur : accédez à http://<ECS_PUBLIC_IP>/phpinfo.php.

      • Succès : la page affiche les détails de l'environnement PHP.

      • Échec : la page affiche « File not found » ou le navigateur télécharge le fichier.

    3. Nettoyez le fichier de test : supprimez ce fichier après la vérification. La page phpinfo expose des informations sensibles sur le serveur.

  2. Vérifiez la connectivité entre PHP et MySQL.

    Créez un script PHP pour tester la connectivité à la base de données à l'aide de l'extension mysqlnd.

    1. Créez une base de données et un utilisateur. Connectez-vous à MySQL avec le mot de passe root défini à l'Étape 3.

      sudo mysql -u root -p

      À l'invite mysql>, créez une base de données nommée webapp, un utilisateur nommé webuser, et accordez à cet utilisateur tous les privilèges sur cette base de données.

      CREATE DATABASE webapp;
      /* Replace <YourPassword> with a strong password. */
      CREATE USER 'webuser'@'localhost' IDENTIFIED BY '<YourPassword>';
      GRANT ALL PRIVILEGES ON webapp.* TO 'webuser'@'localhost';
      FLUSH PRIVILEGES;
      EXIT;
    2. Créez un fichier de test de connexion à la base de données. Remplacez <YourPassword> par le mot de passe de l'utilisateur défini à l'étape précédente et exécutez la commande.

      sudo tee /usr/share/nginx/html/test.php <<-'EOF'
      <?php
      $servername = "localhost";
      $username = "webuser";
      $password = "<YourPassword>";
      $dbname = "webapp";
      // Create a connection
      $conn = new mysqli($servername, $username, $password, $dbname);
      // Check the connection
      if ($conn->connect_error) {
          die("Database connection failed: " . $conn->connect_error);
      }
      echo "Database connection successful!";
      ?>
      EOF
      • Vérifiez dans un navigateur : accédez à http://<ECS_PUBLIC_IP>/test.php. Si la page affiche Database connection successful!, la connexion fonctionne.

      • Nettoyez le fichier de test : ce script contient des identifiants de base de données en texte clair. Supprimez-le immédiatement après le test.

FAQ

Délai d'attente du navigateur ou « site inaccessible »

Cette erreur indique généralement un problème réseau. Effectuez le dépannage dans l'ordre suivant :

  1. Groupe de sécurité : vérifiez que le groupe de sécurité autorise le trafic entrant sur le port 80.

  2. Pare-feu : vérifiez que le pare-feu du système d'exploitation (tel que firewalld ou ufw) autorise le trafic sur le port 80.

  3. Service Nginx : exécutez sudo systemctl status nginx pour vérifier si Nginx est en cours d'exécution. Sinon, consultez les journaux avec sudo journalctl -xeu nginx.

  4. Conflit de port : vérifiez si le port 80 est occupé par une autre application. Consultez la rubrique Résoudre les problèmes de connectivité des ports pour une instance ECS.

Le navigateur affiche « 502 Bad Gateway »

Cette erreur signifie que Nginx ne peut pas communiquer avec PHP-FPM.

  1. Service PHP-FPM : exécutez sudo systemctl status php-fpm (ou php8.2-fpm sur Ubuntu) pour vérifier si le service est en cours d'exécution.

  2. Chemin du socket : vérifiez que le chemin unix: dans la directive fastcgi_pass correspond au chemin listen dans la configuration de PHP-FPM.

  3. SELinux/AppArmor : sur CentOS ou Alibaba Cloud Linux, SELinux peut bloquer la communication entre Nginx et PHP-FPM. Exécutez sestatus et vérifiez les refus dans /var/log/audit/audit.log.

  4. Autorisations du socket : vérifiez que l'utilisateur Nginx dispose d'un accès en lecture/écriture au fichier socket.

Activer l'accès distant à MySQL

Par défaut, MySQL interdit la connexion à distance. Pour l'activer, créez un utilisateur dédié à l'accès distant plutôt que d'utiliser root. Consultez la rubrique Ajouter un utilisateur pour l'accès distant à MySQL.