본문 바로가기
  • 클라우드야 나랑 친해지자!
클라우드/AWS

웹 서버에서 실행되는 PHP 애플리케이션에 MySQL 데이터베이스 연결하기

by 정민규 2021. 3. 30.
반응형

수업을 듣고 배운 내용과 연습한 내용을 정리하였습니다

개인 공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.

 

잘못된 부분이 있거나 질문사항은 댓글로 남겨주시면 성심성의껏 답변해드리겠습니다. 감사합니다!


 

교재 <아마존 웹 서비스 AWS Discovery Book - 권영환 지음>를 토대로 실습을 진행하였습니다.

 

 

VPC, EC2, RDS, 보안그룹 등 기본설정은 구성됐다는 가정하에 진행하도록 하겠습니다.

 

* 실습요약

1. RDS 설정

2. EC2 설정

3. RDS DB 인스턴스에 Apache 웹 서버 연결

 

 

 

1. RDS 설정

 

RDS 서브넷 그룹을 생성합니다.

 

 

 

 

RDS DB 인스턴스 아래와 같은 설정으로 생성합니다.

 

 

위의 설정대로 만들면 10분 정도 후에 DB 인스턴스가 생성됩니다.

아래와 같이 엔드포인트 주소를 확인하실 수 있습니다.

 

 

 

2. EC2 설정

 

DB인스턴스를 만들었으니 이제 EC2에 접속하여 DB인스턴스에 접속하기 위한 작업을 하도록 하겠습니다.

먼저 Putty를 통해 EC2에 접속하여 PHP가 포함된 Apache 웹서버를 설치하도록 하겠습니다.

 

 

 

터미널에서 아래 명령을 차례대로 실행합니다.

$sudo yum update -y   // 최신 버그 수정 및 보안 업데이트
$sudo yum install -y httpd php php-mysqlnd   // PHP 소프트웨어 패키지가 포함된 Apache 웹 서버 설치
$sudo service httpd start   // 웹 서버 실행

 

 

설치가 완료되면 인스턴스의 퍼블릭IP 주소를 웹브라우저 검색창에 접속합니다.

'웹 브라우저에서 EC2의 Apache 웹 서버가 정상적으로 설정되면 아래와 같이 [Test Page]가 출력됩니다.

 

 

 

"chkconfig" 명령을 사용하여 서버 부팅 시 웹 서버가 자동으로 시작될 수 있도록 설정합니다.

$sudo chkconfig httpd on   // 서버 부팅 시 웹 서버 자동시작

 

 

 

지금 로그인 중인 ec2-user로 웹 서버의 기본 루트 페이지 파일을 수정 변경 가능하도록 설정하기 위해 /var/www 디렉터리의 소유권 및 권한을 변경합니다.

$sudo groupadd www
$sudo usermod -a -G www ec2-user
$exit

 

 

EC2에 재접속 후 다음 명령어를 입력하여 ec2-user가 group에 추가되었는지 확인합니다.

$groups

 

 

/var/www 디렉터리 및 해당 콘텐츠의 그룹 소유권을 www 그룹으로 변경합니다.

$sudo chown -R root:www /var/www

 

 

/var/www 및 그 하위 디렉터리의 권한을 변경해서 그룹 쓰기 권한을 추가하고, 나중에 생성 될 하위 디렉터리에서 그룹 ID를 설정합니다.

$sudo chmod 2775 /var/www
$find /var/www -type d -exec sudo chmod 2775 {} +

 

 

/var/www 및 하위 디렉터리의 파일 권한을 계속 변경해서 그룹 쓰기 권한을 추가합니다.

$find /var/www -type f -exec sudo chmod 0664 {} +

 

 

 

 

 

3. RDS DB 인스턴스에 Apache 웹 서버 연결

 

RDS DB 인스턴스에 연결되는 Apache 웹 서버에 콘텐츠를 추가합니다.

 

디렉터리를 /var/www로 변경하고 inc라는 새로운 하위 디렉터리를 생성합니다.

$cd /var/www
$mkdir inc
$cd inc

 

 

dbinfo.inc라는 파일을 생성한 다음 vi로 다음의 콘텐츠를 dbinfo.inc 파일을 추가합니다.

이 때, endpoint는 RDS MySQL DB 인스턴스의 엔드포인트이며, Master password는 자신이 설정한 DB 인스턴스의 마스터 암호입니다.

 

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

?>

 

 

 

 

디렉터리를 /var/www/html로 변경합니다.

cd /var/www/html

 

 

SamplePage.php라는 html 디렉터리에서 새 파일을 생성한 다음 파일을 편집합니다.

 

DB_SERVER : RDS endpoint 주소

DB_DATABASE : sample

DB_USERNAME : tutorial_user

DB_PASSWORD : 자신이 지정한 암호

 

저같은 경우는 $connection = mysqli_connect('RDS endpoint 주소', 'tutorial_user', 'DB_PASSWORD');

아래 DB_DATABASE 부분에 sample 을 입력했습니다.

 

DB_SERVER, DB_USERNAME, DB_PASSWORD 에서는 따옴표('') 를 꼭 붙여야합니다.

 

<?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;
}
?>                        
                

 

 

 

 

 

퍼블릭 IP주소 뒤에 SamplePage.php를 붙이면 아래와 같이 정상적으로 작동되는 것을 확인할 수 있습니다.

 

 

 

이로써 웹서버와 RDS DB를 연동하는 실습을 진행하였습니다. 고생하셨습니다!!!

반응형

댓글