APM 구성 방법

가상서버에 APM를 구성하는 방법은 아래와 같습니다.

1. APM이란?

APM은 Apache + PHP + MySQL/MariaDB의 조합으로, 이 3가지가 연동되어 운영되도록 만든 환경을 APM이라고 합니다.

APM의 동작 원리는 아래와 같습니다.

① 클라이언트가 서버에 웹 페이지의 정보를 요청

② Apache는 해당되는 정보를 주기 위해 PHP에게 스크립트 실행을 요청

③ PHP는 MySQL/MariaDB에 쿼리 질의를 요청

④ MySQL/MariaDB은 질의에 대한 결과 데이터를 PHP에게 응답

⑤ PHP는 받은 결과 데이터와 스크립트 실행 결과를 HTML 코드로 Apahce에게 응답

⑥ Aapche는 받은 HTML 코드를 클라이언트의 웹 브라우저에 응답

이러한 과정을 거쳐 서버는 클라이언트에 정보를 주게 됩니다.

즉, Apache는 웹 서버, PHP는 해석기(웹 프로그래밍 언어), MySQL/MariaDB은 데이터베이스 서버의 역할을 합니다.

이제 APM을 설치해보도록 하겠습니다.

2. Apache 설치하기

(1) 패키지 업데이트하기

등록된 저장소 내 패키지 정보를 최신으로 업데이트합니다.

$ sudo yum update

(2) Apache 설치하기

설치할 Apache 버전을 확인한 후, 설치를 진행합니다.

$ yum info httpd
$ sudo yum install httpd

(3) Apache 설치 확인하기

설치가 완료되었다면 Apahce 서비스를 구동한 후, active 상태인지 확인합니다.

$ sudo systemctl start httpd
$ sudo systemctl enable httpd
$ systemctl status httpd

그리고 http://가상서버의 공인 IP로 접속하여 잘 설치되었는지 확인합니다.

3. PHP 설치하기

(1) PHP 설치하기

설치할 PHP 버전을 확인한 후, 설치를 진행합니다.

$ yum info php
$ sudo yum install php

(2) PHP 설치 확인하기

설치가 완료되었다면 /var/www/html 디렉터리에 index.php 파일을 생성하여 phpinfo 페이지를 출력할 수 있도록 합니다.

$ sudo vi /var/www/html/index.php
<?php phpinfo(); ?>
$ sudo systemctl restart httpd

그리고 http://가상서버의 공인 IP/index.php로 접속하여 잘 설치되었는지 확인합니다.

참고사항

설치가 확인되었다면 생성한 index.php 파일 삭제를 권장드립니다.

(3) PHP 모듈 추가하기

설치 가능한 PHP 모듈을 검색한 후, 추가로 필요한 모듈을 설치할 수 있습니다.

여기서는 MySQL/MariaDB와 연동하기 위해 필요한 php-mysqlnd 모듈을 설치했습니다.

$ yum info php-*
$ sudo yum install php-mysqlnd

4. MySQL 설치하기

(1) MySQL 설치하기

MySQL Community Downloads에 접속하여 설치할 OS 버전의 RPM Package를 선택한 후, MySQL Yum Repository 링크를 복사합니다.

복사한 링크를 통해 MySQL Repository를 설치한 후, MySQL 설치를 진행합니다.

ubuntu의 경우, Package Configuration 화면을 통해 비밀번호를 설정합니다.

$ sudo yum install https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm
$ sudo yum install mysql-server

(2) MySQL 설치 확인하기

설치가 완료되었다면 MySQL 서비스를 구동한 후, active 상태인지 확인합니다.

$ sudo systemctl start mysqld
$ sudo systemctl enable mysqld
$ systemctl status mysqld

그리고 MySQL에 접속해봅니다.

root 계정의 임시 비밀번호를 확인한 후, MySQL에 접속합니다.

$ sudo grep 'temporary password' /var/log/mysqld.log
2022-10-05T06:33:51.116320Z 1 [Note] A temporary password is generated for root@localhost: y(>j2pun:AN/
$ mysql -u root -p

(3) MySQL 기본 보안 설정하기

mysql_secure_installation을 통해 root 비밀번호 변경과 기본 보안 설정을 합니다.

$ sudo mysql_secure_installation

=== root 계정의 임시 비밀번호 입력 ===
Enter password for user root:

=== root 계정의 새 비밀번호 입력 ===
New password:
Re-enter new password:

=== root 계정의 비밀번호 변경 여부 ===
Change the password for root ? ((Press y|Y for Yes, any other key for No) : n

=== 익명의 사용자 삭제 여부 ===
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y

=== 원격 접속 차단 여부 ===
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : n

=== test DB 및 접속 정보 삭제 여부 ===
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y

=== 현재 설정한 값들의 적용 여부 ===
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y

(4) PHP와 연동 확인하기

새로 설정한 비밀번호로 MySQL에 접속한 후, test 데이터베이스와 test 사용자를 생성합니다.

$ mysql -u root -p
mysql> create database test;
mysql> create user 'test'@'%' identified by '비밀번호';
mysql> grant all privileges on test.* to 'test'@'%';

그리고 PHP가 test 데이터베이스에 잘 접속하는지 확인하는 test.php 파일을 /var/www/html 디렉터리에 생성합니다.

$ sudo vi /var/www/html/test.php
<?php
error_reporting(E_ALL);
ini_set("display_errors",1);
$con = mysqli_connect("localhost","test","test 계정의 비밀번호","test");
if(!$con) {
        die ("fail: ".mysqli_connect_error());
}
echo "success!";
?>
$ sudo systemctl restart httpd

http://가상서버의 공인 IP/test.php로 접속하여 PHP와 MySQL이 잘 연동되는지 확인합니다.

주의사항

centos 7의 경우 php를 설치하면 5.x 버전으로 설치됩니다.

하지만 mysql 8.x를 사용하기 위해서는 php 7.x 이상으로 설치되어야 하기 때문에 버전을 업그레이드해야 합니다.

따라서 위와 같은 에러가 발생하였을 경우, 기존에 설치된 php 5.4를 삭제하고 다시 설치하면 됩니다.

여기서는 php 7.4로 재설치했습니다.

$ sudo yum remove php*
$ sudo yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
$ sudo yum-config-manager --enable remi-php74
$ sudo yum install php php-mysqlnd
$ php -v
PHP 7.4.32 (cli) (built: Sep 28 2022 09:09:55) ( NTS )
$ sudo systemctl restart httpd

5. MariaDB 설치하기

(1) MariaDB 설치하기

Download MariaDB Server에 접속하여 설치할 OS 버전과 원하는 MariaDB 버전을 선택한 후, 리포지토리 또는 명령어를 복사합니다.

복사한 리포지토리를 통해 Mariadb.repo를 생성하거나 복사한 명령어를 실행한 후, 설치를 진행합니다.

$ sudo vi /etc/yum.repos.d/MariaDB.repo
# MariaDB 10.3 CentOS repository list - created 2022-09-30 08:49 UTC
# https://mariadb.org/download/
[mariadb]
name = MariaDB
baseurl = https://tw1.mirror.blendbyte.net/mariadb/yum/10.3/centos7-amd64
gpgkey=https://tw1.mirror.blendbyte.net/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1
$ sudo yum install MariaDB-server MariaDB-client

(2) MariaDB 설치 확인하기

설치가 완료되었다면 MariaDB 서비스를 구동한 후, active 상태인지 확인합니다.

$ sudo systemctl start mariadb
$ sudo systemctl enable mariadb
$ systemctl status mariadb

그리고 MariaDB에 접속해봅니다.

초기에는 비밀번호가 없기 때문에 비밀번호 없이 MariaDB에 접속합니다.

$ mysql -u root

(3) MariaDB 기본 보안 설정하기

mysql_secure_installation을 통해 root 비밀번호 설정과 기본 보안 설정을 합니다.

$ sudo mysql_secure_installation

=== 현재 root 계정의 비밀번호가 없기 때문에 엔터 입력 ===
Enter current password for root (enter for none):

=== root 계정의 비밀번호 설정 ===
Set root password? [Y/n] y
New password:
Re-enter new password:

=== 익명의 사용자 삭제 여부 ===
Remove anonymous users? [Y/n] y

=== 원격 접속 차단 여부 ===
Disallow root login remotely? [Y/n] n

=== test DB 및 접속 정보 삭제 여부 ===
Remove test database and access to it? [Y/n] y

=== 현재 설정한 값들의 적용 여부 ===
Reload privilege tables now? [Y/n] y

(4) PHP와 연동 확인하기

새로 설정한 비밀번호로 MariaDB에 접속한 후, test 데이터베이스와 test 사용자를 생성합니다.

$ mysql -u root -p
MariaDB [(none)]> create database test;
MariaDB [(none)]> create user 'test'@'%' identified by '비밀번호';
MariaDB [(none)]> grant all privileges on test.* to 'test'@'%';

그리고 PHP가 test 데이터베이스에 잘 접속하는지 확인하는 test.php 파일을 /var/www/html 디렉터리에 생성합니다.

$ sudo vi /var/www/html/test.php
<?php
error_reporting(E_ALL);
ini_set("display_errors",1);
$con = mysqli_connect("localhost","test","test 계정의 비밀번호","test");
if(!$con) {
        die ("fail: ".mysqli_connect_error());
}
echo "success!";
?>
$ sudo systemctl restart httpd

http://가상서버의 공인 IP/test.php로 접속하여 PHP와 MariaDB가 잘 연동되는지 확인합니다.

참고사항

MySQL/MariaDB 접속 시, 접속한 IP에 대한 DNS 질의를 하여 호스트 이름을 확인하는 과정을 거칩니다.

하지만 DNS 응답이 느리거나 장애가 발생할 경우, MySQL/MariaDB 접속이 지연되는 현상이 발생할 수 있기 때문에

아래와 같이 skip-name-resolve 옵션 사용하여, DNS 질의를 하지 않고 향상된 속도로 접속할 수 있습니다.

my.cnf 설정 파일에 skip-name-resolve 옵션을 추가합니다.

$ sudo vi /etc/my.cnf
[mysqld]
skip-name-resolve

MySQL 또는 MariaDB 서비스를 재시작한 후, 설정을 확인합니다.

mysql> SHOW VARIABLES LIKE 'skip_name_resolve';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| skip_name_resolve | ON    |
+-------------------+-------+
1 row in set (0.001 sec)

Last updated