

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Installer un serveur web sur votre instance EC2
<a name="CHAP_Tutorials.WebServerDB.CreateWebServer"></a>

Installez un serveur Web sur l’instance EC2 que vous avez créée dans [Lancement d’une instance EC2 pour vous connecter à votre cluster de bases de données](CHAP_Tutorials.WebServerDB.LaunchEC2.md). Le serveur Web se connecte au cluster de bases de données Amazon Aurora que vous avez créé dans [Créer un cluster de bases de données Amazon Aurora](CHAP_Tutorials.WebServerDB.CreateDBCluster.md). 

## Installer un serveur Web Apache avec PHP et MariaDB
<a name="CHAP_Tutorials.WebServerDB.CreateWebServer.Apache"></a>

Connectez-vous à votre instance EC2 et installez le serveur web.

**Pour vous connecter à votre instance EC2 et installer le serveur Web Apache avec PHP**

1. Connectez-vous à l’instance EC2 que vous avez précédemment créée en suivant la procédure spécifiée dans [Connectez-vous à votre instance Linux](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstances.html) dans le *Guide de l’utilisateur Amazon EC2*.

   Nous vous recommandons de vous connecter à votre instance EC2 en utilisant SSH. Si l’utilitaire client SSH est installé sur Windows, Linux ou Mac, vous pouvez vous connecter à l’instance à l’aide du format de commande suivant :

   ```
   ssh -i location_of_pem_file ec2-user@ec2-instance-public-dns-name
   ```

   Supposons, par exemple, que `ec2-database-connect-key-pair.pem` soit stocké dans `/dir1` sur Linux et que le DNS IPv4 public de votre instance EC2 soit `ec2-12-345-678-90.compute-1.amazonaws.com`. Votre commande SSH se présenterait comme suit :

   ```
   ssh -i /dir1/ec2-database-connect-key-pair.pem ec2-user@ec2-12-345-678-90.compute-1.amazonaws.com
   ```

1. Obtenez les dernières corrections de bogues et mises à jour de sécurité en mettant à jour le logiciel sur votre instance EC2. Pour ce faire, exécutez la commande suivante.
**Note**  
L’option `-y` installe les mises à jour sans demander de confirmation. Pour examiner les mises à jour avant de les installer, omettez cette option.

   ```
   sudo dnf update -y
   ```

1. Une fois les mises à jour terminées, installez le serveur web Apache, PHP et le logiciel MariaDB ou PostgreSQL à l’aide des commandes suivantes. Cette commande installe plusieurs packages logiciels et les dépendances connexes au même moment.

------
#### [ MariaDB & MySQL ]

   ```
   sudo dnf install -y httpd php php-mysqli mariadb105
   ```

------
#### [ PostgreSQL ]

   ```
   sudo dnf install -y httpd php php-pgsql postgresql15
   ```

------

   Si vous recevez une erreur, votre instance n’a probablement pas été lancée avec une AMI Amazon Linux 2023. Vous utilisez peut-être une AMI Amazon Linux 2 à la place. Vous pouvez afficher votre version d’Amazon Linux avec la commande suivante

   ```
   cat /etc/system-release
   ```

   Pour plus d’informations, consultez [Mise à jour du logiciel de l’instance](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/install-updates.html).

1. Démarrez le serveur web avec la commande illustrée ci-dessous.

   ```
   sudo systemctl start httpd
   ```

   Vous pouvez vérifier que votre serveur web est correctement installé et démarré. Pour ce faire, saisissez le nom DNS (Domain Name System) public de votre instance EC2 dans la barre d’adresse d’un navigateur web, par exemple : `http://ec2-42-8-168-21.us-west-1.compute.amazonaws.com`. Si votre serveur Web est en cours d’exécution, vous voyez la page de test Apache. 

   Si la page de test Apache ne s’affiche pas, vérifiez vos règles entrantes pour le groupe de sécurité du VPC que vous avez créé dans [Tutoriel : Création d'un VPC à utiliser avec un cluster d' de base de données (uniquement) IPv4](CHAP_Tutorials.WebServerDB.CreateVPC.md). Assurez-vous que vos règles entrantes incluent un accès HTTP (port 80) à l’adresse IP pour vous connecter au serveur Web.
**Note**  
La page de test Apache apparaît uniquement en l’absence de contenu dans le répertoire racine des documents, `/var/www/html`. Après l’ajout de contenu dans le répertoire racine des documents, votre contenu apparaît à l’adresse DNS publique de votre instance EC2. Avant cela, il apparaît sur la page de test d’Apache.

1. Configurez le serveur web pour qu’il démarre à chaque redémarrage du système à l’aide de la commande `systemctl`.

   ```
   sudo systemctl enable httpd
   ```

Pour autoriser `ec2-user` à gérer les fichiers dans le répertoire racine par défaut pour votre serveur Web Apache, modifiez l’appartenance et les autorisations du répertoire `/var/www`. Il existe plusieurs façons d’accomplir cette tâche. Dans ce didacticiel, vous ajoutez l’utilisateur `ec2-user` au groupe `apache` pour donner au groupe `apache` la propriété du répertoire `/var/www` et attribuer les autorisations d’écriture au groupe.

**Pour définir les autorisations sur les fichiers pour le serveur Web Apache**

1. Ajoutez l’utilisateur `ec2-user` au groupe `apache`.

   ```
   sudo usermod -a -G apache ec2-user
   ```

1. Pour actualiser vos autorisations et inclure le nouveau groupe `apache`, déconnectez-vous.

   ```
   exit
   ```

1. Reconnectez-vous et vérifiez que le groupe `apache` existe à l’aide de la commande `groups`.

   ```
   groups
   ```

   Votre sortie se présente comme suit :

   ```
   ec2-user adm wheel apache systemd-journal
   ```

1. Remplacez le groupe propriétaire du répertoire `/var/www` et de son contenu par le groupe `apache`.

   ```
   sudo chown -R ec2-user:apache /var/www
   ```

1. Modifiez les autorisations des répertoires `/var/www` et de ses sous-répertoires pour ajouter des autorisations d’écriture de groupe et définir l’ID de groupe sur les sous-répertoires créés à l’avenir.

   ```
   sudo chmod 2775 /var/www
   find /var/www -type d -exec sudo chmod 2775 {} \;
   ```

1. Modifiez de façon récursive les autorisations pour les fichiers figurant dans le répertoire `/var/www` et ses sous-répertoires pour ajouter des autorisations d’écriture de groupe.

   ```
   find /var/www -type f -exec sudo chmod 0664 {} \;
   ```

Maintenant, `ec2-user` (et tous les futurs membres du groupe `apache`) peut ajouter, supprimer et modifier les fichiers à la racine du document Apache. Cela vous permet d’ajouter du contenu, tel qu’un site Web statique ou une application PHP. 

**Note**  
Un serveur web exécutant le protocole HTTP ne fournit aucune sécurité de transport pour les données qu’il envoie ou reçoit. Lorsque vous vous connectez à un serveur HTTP via un navigateur Web, de nombreuses informations peuvent être vues par des personnes malveillantes sur le chemin d’accès réseau. Ces informations incluent les informations URLs que vous visitez, le contenu des pages Web que vous recevez et le contenu (y compris les mots de passe) de tous les formulaires HTML.   
Les bonnes pratiques en matière de sécurisation de votre serveur Web consistent à installer la prise en charge HTTPS (HTTP Secure). Ce protocole protège vos données grâce au SSL/TLS chiffrement. Pour plus d'informations, consultez [Tutoriel : Configuration SSL/TLS avec l'AMI Amazon Linux](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/SSL-on-amazon-linux-ami.html) dans le guide de l'*utilisateur Amazon EC2*.

## Connecter le serveur web Apache au cluster de bases de données
<a name="CHAP_Tutorials.WebServerDB.CreateWebServer.PHPContent"></a>

Ensuite, vous allez ajouter du contenu à votre serveur web Apache qui se connecte à votre cluster de bases de données Amazon Aurora.

**Pour ajouter du contenu au serveur web Apache qui se connecte à votre cluster de bases de données**

1. Alors que vous êtes encore connecté à votre instance EC2, remplacez le répertoire par `/var/www` et créez un sous-répertoire nommé `inc`.

   ```
   cd /var/www
   mkdir inc
   cd inc
   ```

1. Créez un fichier dans le répertoire `inc` nommé `dbinfo.inc`, puis modifiez le fichier en appelant nano (ou l’éditeur de votre choix).

   ```
   >dbinfo.inc
   nano dbinfo.inc
   ```

1. Ajoutez le contenu suivant au fichier `dbinfo.inc`. *db\$1instance\$1endpoint*Voici le point de de base de données, sans le port, pour votre cluster de base de données d' de base de données.
**Note**  
Nous vous recommandons de placer les informations de nom d’utilisateur et de mot de passe dans un dossier ne faisant pas partie de la racine du document de votre serveur web. Vous réduisez ainsi la possibilité d’exposer vos informations de sécurité.  
Veillez à remplacer `master password` par un mot de passe approprié dans votre application.

   ```
   <?php
   
   define('DB_SERVER', 'db_cluster_writer_endpoint');
   define('DB_USERNAME', 'tutorial_user');
   define('DB_PASSWORD', 'master password');
   define('DB_DATABASE', 'sample');
   ?>
   ```

1. Enregistrez et fermez le fichier `dbinfo.inc`. Si vous utilisez nano, enregistrez et fermez le fichier à l’aide des touches Ctrl\$1S et Ctrl\$1X.

1. Remplacez le répertoire par `/var/www/html`.

   ```
   cd /var/www/html
   ```

1. Créez un fichier dans le répertoire `html` nommé `SamplePage.php`, puis modifiez le fichier en appelant nano (ou l’éditeur de votre choix).

   ```
   >SamplePage.php
   nano SamplePage.php
   ```

1. Ajoutez le contenu suivant au fichier `SamplePage.php` :

------
#### [ MariaDB & MySQL ]

   ```
   <?php include "../inc/dbinfo.inc"; ?>
   <html>
   <body>
   <h1>Sample page</h1>
   <?php
   
     /* Connect to MySQL and select the database. */
     $connection = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD);
   
     if (mysqli_connect_errno()) echo "Failed to connect to MySQL: " . mysqli_connect_error();
   
     $database = mysqli_select_db($connection, DB_DATABASE);
   
     /* Ensure that the EMPLOYEES table exists. */
     VerifyEmployeesTable($connection, DB_DATABASE);
   
     /* If input fields are populated, add a row to the EMPLOYEES table. */
     $employee_name = htmlentities($_POST['NAME']);
     $employee_address = htmlentities($_POST['ADDRESS']);
   
     if (strlen($employee_name) || strlen($employee_address)) {
       AddEmployee($connection, $employee_name, $employee_address);
     }
   ?>
   
   <!-- Input form -->
   <form action="<?PHP echo $_SERVER['SCRIPT_NAME'] ?>" method="POST">
     <table border="0">
       <tr>
         <td>NAME</td>
         <td>ADDRESS</td>
       </tr>
       <tr>
         <td>
           <input type="text" name="NAME" maxlength="45" size="30" />
         </td>
         <td>
           <input type="text" name="ADDRESS" maxlength="90" size="60" />
         </td>
         <td>
           <input type="submit" value="Add Data" />
         </td>
       </tr>
     </table>
   </form>
   
   <!-- Display table data. -->
   <table border="1" cellpadding="2" cellspacing="2">
     <tr>
       <td>ID</td>
       <td>NAME</td>
       <td>ADDRESS</td>
     </tr>
   
   <?php
   
   $result = mysqli_query($connection, "SELECT * FROM EMPLOYEES");
   
   while($query_data = mysqli_fetch_row($result)) {
     echo "<tr>";
     echo "<td>",$query_data[0], "</td>",
          "<td>",$query_data[1], "</td>",
          "<td>",$query_data[2], "</td>";
     echo "</tr>";
   }
   ?>
   
   </table>
   
   <!-- Clean up. -->
   <?php
   
     mysqli_free_result($result);
     mysqli_close($connection);
   
   ?>
   
   </body>
   </html>
   
   
   <?php
   
   /* Add an employee to the table. */
   function AddEmployee($connection, $name, $address) {
      $n = mysqli_real_escape_string($connection, $name);
      $a = mysqli_real_escape_string($connection, $address);
   
      $query = "INSERT INTO EMPLOYEES (NAME, ADDRESS) VALUES ('$n', '$a');";
   
      if(!mysqli_query($connection, $query)) echo("<p>Error adding employee data.</p>");
   }
   
   /* Check whether the table exists and, if not, create it. */
   function VerifyEmployeesTable($connection, $dbName) {
     if(!TableExists("EMPLOYEES", $connection, $dbName))
     {
        $query = "CREATE TABLE EMPLOYEES (
            ID int(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            NAME VARCHAR(45),
            ADDRESS VARCHAR(90)
          )";
   
        if(!mysqli_query($connection, $query)) echo("<p>Error creating table.</p>");
     }
   }
   
   /* Check for the existence of a table. */
   function TableExists($tableName, $connection, $dbName) {
     $t = mysqli_real_escape_string($connection, $tableName);
     $d = mysqli_real_escape_string($connection, $dbName);
   
     $checktable = mysqli_query($connection,
         "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_NAME = '$t' AND TABLE_SCHEMA = '$d'");
   
     if(mysqli_num_rows($checktable) > 0) return true;
   
     return false;
   }
   ?>
   ```

------
#### [ PostgreSQL ]

   ```
   <?php include "../inc/dbinfo.inc"; ?>
   
   <html>
   <body>
   <h1>Sample page</h1>
   <?php
   
   /* Connect to PostgreSQL and select the database. */
   $constring = "host=" . DB_SERVER . " dbname=" . DB_DATABASE . " user=" . DB_USERNAME . " password=" . DB_PASSWORD ;
   $connection = pg_connect($constring);
   
   if (!$connection){
    echo "Failed to connect to PostgreSQL";
    exit;
   }
   
   /* Ensure that the EMPLOYEES table exists. */
   VerifyEmployeesTable($connection, DB_DATABASE);
   
   /* If input fields are populated, add a row to the EMPLOYEES table. */
   $employee_name = htmlentities($_POST['NAME']);
   $employee_address = htmlentities($_POST['ADDRESS']);
   
   if (strlen($employee_name) || strlen($employee_address)) {
     AddEmployee($connection, $employee_name, $employee_address);
   }
   
   ?>
   
   <!-- Input form -->
   <form action="<?PHP echo $_SERVER['SCRIPT_NAME'] ?>" method="POST">
     <table border="0">
       <tr>
         <td>NAME</td>
         <td>ADDRESS</td>
       </tr>
       <tr>
         <td>
       <input type="text" name="NAME" maxlength="45" size="30" />
         </td>
         <td>
       <input type="text" name="ADDRESS" maxlength="90" size="60" />
         </td>
         <td>
       <input type="submit" value="Add Data" />
         </td>
       </tr>
     </table>
   </form>
   <!-- Display table data. -->
   <table border="1" cellpadding="2" cellspacing="2">
     <tr>
       <td>ID</td>
       <td>NAME</td>
       <td>ADDRESS</td>
     </tr>
   
   <?php
   
   $result = pg_query($connection, "SELECT * FROM EMPLOYEES");
   
   while($query_data = pg_fetch_row($result)) {
     echo "<tr>";
     echo "<td>",$query_data[0], "</td>",
          "<td>",$query_data[1], "</td>",
          "<td>",$query_data[2], "</td>";
     echo "</tr>";
   }
   ?>
   </table>
   
   <!-- Clean up. -->
   <?php
   
     pg_free_result($result);
     pg_close($connection);
   ?>
   </body>
   </html>
   
   
   <?php
   
   /* Add an employee to the table. */
   function AddEmployee($connection, $name, $address) {
      $n = pg_escape_string($name);
      $a = pg_escape_string($address);
      echo "Forming Query";
      $query = "INSERT INTO EMPLOYEES (NAME, ADDRESS) VALUES ('$n', '$a');";
   
      if(!pg_query($connection, $query)) echo("<p>Error adding employee data.</p>"); 
   }
   
   /* Check whether the table exists and, if not, create it. */
   function VerifyEmployeesTable($connection, $dbName) {
     if(!TableExists("EMPLOYEES", $connection, $dbName))
     {
        $query = "CREATE TABLE EMPLOYEES (
            ID serial PRIMARY KEY,
            NAME VARCHAR(45),
            ADDRESS VARCHAR(90)
          )";
   
        if(!pg_query($connection, $query)) echo("<p>Error creating table.</p>"); 
     }
   }
   /* Check for the existence of a table. */
   function TableExists($tableName, $connection, $dbName) {
     $t = strtolower(pg_escape_string($tableName)); //table name is case sensitive
     $d = pg_escape_string($dbName); //schema is 'public' instead of 'sample' db name so not using that
   
     $query = "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_NAME = '$t';";
     $checktable = pg_query($connection, $query);
   
     if (pg_num_rows($checktable) >0) return true;
     return false;
   
   }
   ?>
   ```

------

1. Enregistrez et fermez le fichier `SamplePage.php`.

1. Vérifiez que votre serveur web se connecte avec succès à votre cluster de bases de données en ouvrant un navigateur web et en accédant à une page `http://EC2 instance endpoint/SamplePage.php`, par exemple : `http://ec2-12-345-67-890.us-west-2.compute.amazonaws.com/SamplePage.php`.

Vous pouvez utiliser `SamplePage.php` pour ajouter des données à votrecluster de bases de données. Les données que vous ajoutez sont ensuite affichées sur la page. Pour vérifier que les données ont été insérées dans la table, installez le client MySQL sur l’instance Amazon EC2. Connectez-vous ensuite au cluster de bases de données et interrogez la table. 

Pour plus d’informations sur la connexion au cluster de bases de données, consultez [Connexion à un cluster de bases de données Amazon Aurora](Aurora.Connecting.md).

Pour vérifier que la sécurité de votre cluster de bases de données est assurée, contrôlez que les sources extérieures du VPC ne peuvent pas se connecter à votre cluster de bases de données. 

Après avoir testé votre serveur Web et votre base de données, vous devez supprimer votre cluster de bases de données et votre instance Amazon EC2.
+ Pour supprimer un cluster de bases de données, suivez les instructions de la section [Suppression de clusters de bases de données Aurora et d’instances de bases de données](USER_DeleteCluster.md). Vous n’avez pas besoin de créer un instantané final.
+ Pour résilier une instance Amazon EC2, suivez les instructions de la page [Résilier votre instance](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html) dans le *Guide de l’utilisateur Amazon EC2*.