Instalación de un servidor web en la instancia de EC2 - Amazon Relational Database Service

Instalación de un servidor web en la instancia de EC2

Instale un servidor web en una instancia de EC2 que creó en Lanzamiento de una instancia EC2 para conectarse con la instancia de base de datos. El servidor web se conecta a la instancia de base de datos de Amazon RDS que creó en Crear una instancia de base de datos de Amazon RDS.

Instalación de un servidor web Apache con PHP y MariaDB

Conéctese a su instancia de EC2 e instale el servidor web.

Para conectarse a la instancia de EC2 e instalar el servidor web Apache con PHP
  1. Conéctese a la instancia de EC2 que ha creado anteriormente siguiendo los pasos que se indican en Conexión con la instancia de Linux en la Guía del usuario de Amazon EC2.

    Le recomendamos que se conecte a la instancia de EC2 mediante SSH. Si la utilidad de cliente SSH está instalada en Windows, Linux o Mac, puede conectarse a la instancia con el siguiente formato de comando:

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

    Por ejemplo, suponga que ec2-database-connect-key-pair.pem está almacenado en /dir1 en Linux y que el DNS IPv4 público de su instancia de EC2 es ec2-12-345-678-90.compute-1.amazonaws.com. Su comando SSH tendría el siguiente aspecto:

    ssh -i /dir1/ec2-database-connect-key-pair.pem ec2-user@ec2-12-345-678-90.compute-1.amazonaws.com
  2. Obtenga las correcciones de errores y las actualizaciones de seguridad más recientes actualizando el software en su instancia de EC2. Para ello, utilice el siguiente comando.

    nota

    La opción -y instala las actualizaciones sin necesidad de confirmación. Para examinar las actualizaciones antes de la instalación, omita esta opción.

    sudo dnf update -y
  3. Una vez completadas las actualizaciones, instale el servidor web Apache, PHP y el software de MariaDB o PostgreSQL con los siguientes comandos. Este comando instala varios paquetes de software y dependencias relacionadas al mismo tiempo.

    MariaDB & MySQL
    sudo dnf install -y httpd php php-mysqli mariadb105
    PostgreSQL
    sudo dnf install -y httpd php php-pgsql postgresql15

    Si recibe un error, probablemente la instancia no se ha iniciado con una AMI de Amazon Linux 2023. Es posible que esté usando la AMI Amazon Linux 2 en su lugar. Puede ver la versión de Amazon Linux usando el comando siguiente:

    cat /etc/system-release

    Para obtener más información, consulte Actualización del software de instancia.

  4. Inicie el servidor web mediante el comando que se muestra a continuación.

    sudo systemctl start httpd

    Puede probar que el servidor web esté correctamente instalado e iniciado. Para ello, escriba el nombre público del Sistema de nombres de dominio (DNS) de su instancia de EC2 en la barra de direcciones de un navegador web, por ejemplo: http://ec2-42-8-168-21.us-west-1.compute.amazonaws.com. Si el servidor web se está ejecutando, se mostrará la página de prueba de Apache.

    Si no ve la página de prueba de Apache, compruebe las reglas de entrada para el grupo de seguridad de VPC que creó en Tutorial: Creación de una VPC para utilizarla con una instancia de base de datos (solo IPv4). Asegúrese de que las reglas de entrada incluyan una que permita el acceso HTTP (puerto 80) a la dirección IP que utiliza para conectarse al servidor web.

    nota

    La página de prueba de Apache aparece únicamente cuando el directorio raíz de documentos está vac, /var/www/html. Después de añadir contenido al directorio raíz de documentos, el contenido aparece en la dirección DNS pública de la instancia de EC2. Antes de este punto, aparece en la página de prueba de Apache.

  5. Configure el servidor web para que se inicie en cada arranque del sistema con el comando systemctl.

    sudo systemctl enable httpd

Para permitir a ec2-user administrar archivos en el directorio raíz predeterminado del servidor web Apache, modifique los propietarios y los permisos del directorio /var/www. Existen muchas formas de realizar esta tarea. En este tutorial se añade el usuario ec2-user al grupo apache, se otorga al grupo apache la propiedad del directorio /var/www y se asignan permisos de escritura al grupo.

Para configurar los permisos de archivo para el servidor web Apache
  1. Agregue el usuario ec2-user al grupo apache.

    sudo usermod -a -G apache ec2-user
  2. Cierre la sesión para actualizar los permisos e incluir el nuevo grupo apache.

    exit
  3. Inicie sesión nuevamente y compruebe que existe el grupo apache mediante el comando groups.

    groups

    El resultado tiene un aspecto similar al siguiente:

    ec2-user adm wheel apache systemd-journal
  4. Cambie la propiedad de grupo del directorio /var/www y su contenido al grupo apache.

    sudo chown -R ec2-user:apache /var/www
  5. Cambie los permisos del directorio /var/www y sus subdirectorios para añadir permisos de escritura de grupo y establecer el ID de grupo en los subdirectorios que se creen en el futuro.

    sudo chmod 2775 /var/www find /var/www -type d -exec sudo chmod 2775 {} \;
  6. Cambie recursivamente los permisos de los archivos del directorio /var/www y sus subdirectorios para añadir permisos de escritura de grupo.

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

Ahora ec2-user (y cualquier miembro futuro del grupo de apache) puede añadir, eliminar y editar archivos en la raíz de documentos de Apache. Esto le permite añadir contenido, como un sitio web estático o una aplicación PHP.

nota

Un servidor web que ejecuta el protocolo HTTP no proporciona seguridad de transporte de los datos que envía o recibe. Cuando se conecta a un servidor HTTP utilizando un navegador web, la mayor parte de la información es visible a cualquier acceso no autorizado en la ruta de la red. Esta información incluye las URL que visita, el contenido de las páginas web que recibe y el contenido (incluidas las contraseñas) de cualquier formulario HTML.

La práctica recomendada para proteger el servidor web es instalar soporte para HTTPS (HTTP seguro). Este protocolo protege los datos con el cifrado SSL/TLS. Para obtener más información, consulte Tutorial: Configurar SSL/TLS con la AMI de Amazon Linux en la Guía del usuario deAmazon EC2.

Conecte el servidor web Apache con la instancia de base de datos.

A continuación, agregue contenido al servidor web Apache que se conecta a su instancia de base de datos de Amazon RDS.

Para agregar contenido al servidor web Apache que se conecta a su instancia de base de datos
  1. Mientras está conectado a la instancia de EC2, cambie el directorio a /var/www y cree un subdirectorio nuevo denominado inc.

    cd /var/www mkdir inc cd inc
  2. Cree un archivo en el directorio inc, denominado dbinfo.inc y, a continuación, edite el archivo mediante nano (o a cualquier otro editor de su elección).

    >dbinfo.inc nano dbinfo.inc
  3. Añada el siguiente contenido al archivo dbinfo.inc. Aquí, db_instance_endpoint es su punto de conexión de instancia de base de datos, sin el puerto, para su instancia de base de datos.

    nota

    Recomendamos colocar la información del nombre de usuario y la contraseña en una carpeta que no forme parte de la raíz del documento del servidor web. Al hacerlo, se reduce la posibilidad de que se exponga la información de seguridad.

    Asegúrese de cambiar la master password a una contraseña adecuada en su aplicación.

    <?php define('DB_SERVER', 'db_instance_endpoint'); define('DB_USERNAME', 'tutorial_user'); define('DB_PASSWORD', 'master password'); define('DB_DATABASE', 'sample'); ?>
  4. Guarde y cierre el archivo dbinfo.inc. Si utiliza nano, guarde y cierre el archivo con Ctrl+S y Ctrl+X.

  5. Cambie el directorio a /var/www/html.

    cd /var/www/html
  6. Cree un archivo en el directorio html, denominado SamplePage.php y, a continuación, edite el archivo mediante nano (o a cualquier otro editor de su elección).

    >SamplePage.php nano SamplePage.php
  7. Añada el siguiente contenido al archivo 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; } ?>
  8. Guarde y cierre el archivo SamplePage.php.

  9. Compruebe que el servidor web se conecta correctamente a su instancia de base de datos abriendo un navegador web y navegando a http://EC2 instance endpoint/SamplePage.php, por ejemplo: http://ec2-12-345-67-890.us-west-2.compute.amazonaws.com/SamplePage.php.

Puede utilizar SamplePage.php para agregar datos a su instancia de base de datos. Los datos que añada se mostrarán en la página. Para verificar que los datos se insertaron en la tabla, puede instalar el cliente MySQL en la instancia de Amazon EC2. A continuación, se conectará a la instancia de base de datos y ejecutará una consulta en la tabla.

Para obtener información acerca de la instalación del cliente MySQL y la conexión a la instancia de base de datos, consulte Conexión a una instancia de base de datos que ejecuta el motor de base de datos de MySQL.

Para asegurarse de que su instancia de base de datos es lo más seguro posible, compruebe que los orígenes fuera de la VPC no se pueden conectar a su instancia de base de datos.

Una vez que haya terminado de probar su servidor web y su base de datos, debe eliminar la instancia de base de datos y la instancia Amazon EC2.