웹서버 DB서버 분리 - webseobeo DBseobeo bunli

개인 홈페이지 또는 블로그를 운영하는 사람들에게는 작은 고민거리가 있다. 바로 무료로 제공하는 네이버나 카카오의 블로그 서비스를 이용할 것이냐 아니면 개인적으로 호스팅 또는 클라우드에 작은 서버를 두고 직접 구축하여 운영할 것이냐 하는 문제다.

나 또한 그런 고민을 하지 않는 것은 아니지만 이미 이용하고 있는 포털의 무료 블로그 서비스를 이탈하는 결정은 쉽게 내릴 수 없다. 

기존에 운영하고 있는 블로그에 이미 올려져 있는 포스트를 모두 옮기는 것도 문제고 이미 검색엔진에 등록되어 있는 글의 전체 URL을 맞추는 것도 문제다.

거기에 더해 무료로 사용할 수 있는 호스팅이나 클라우드도 없었다. 게다가 가장 저렴한 월5,000~6,000원 정도의 비용으로 사용할 수 있는 클라우드에서 제공하는 1 vCPU, 1 GB 램에서는 웹서버와 PHP, MySQL을 한꺼번에 설치하고 실행하여 워드프레스를 구동하게 되면 CPU는 모르겠지만 램은 조금 부족한 상황이 올 가능성도 있다. 

그러던 중 모 클라우드에서 제공하는 평생 무료인 가상서버 2개를 이용해 웹서버와 DB서버를 분리하면 어떨까라는 생각을 하게 됐고 이번에 시도해보게 되었고 그 결과가 무척 만족스러워서 기록을 남긴다.

웹서버에 Apache 2 설치

LAMP에서 아파치와 PHP를 설치하는 웹서버와 MySQL을 설치할 DB서버를 분리하고자 하는 경우 웹서버에는 Apache, PHP를 설치하고 웹서버에서 DB서버의 접속을 시험하기 위해 MySQL의 Client 모듈을 설치한다.

이 과정은 Ubuntu 20.04 LTS 버전을 기준으로 진행된다.

먼저 운영체제와 설치되어 있는 기본 응용프로그램을 최신으로 업데이트 하기 위해 다음 두 명령을 차례대로 실행한다.

sudo 명령은 apt 명령이 root 권한으로 실행되도록 해준다.

웹서버 DB서버 분리 - webseobeo DBseobeo bunli
sudo apt update
웹서버 DB서버 분리 - webseobeo DBseobeo bunli
sudo apt upgrade

그리고 Apache 2 버전을 설치한다.

웹서버 DB서버 분리 - webseobeo DBseobeo bunli
sudo apt install -y apache2 apache2-utils

정상적으로 설치되면 다음과 같은화면으로 설치가 완료된다.

웹서버 DB서버 분리 - webseobeo DBseobeo bunli
Apache 2와 관련 패키지 설치 완료

설치가 완료되면 자동으로 Apache 2 웹서버가 실행되어 다음과 같이 ps 명령으로 확인할 수 있다.

웹서버 DB서버 분리 - webseobeo DBseobeo bunli

설치한 뒤 작업을 진행하고 있는 PC에서 해당 웹서버의 IP를 웹브라우저를 통해 접속하면 다음과 같이 Apache 2 기본페이지가 보인다.

웹서버 DB서버 분리 - webseobeo DBseobeo bunli
설치된 Apache 2 기본 웹페이지

만약 이 단계에서 접속이 되지 않는다면 우분투 리눅스의 iptable에서 TCP 80번 포트가 차단되어 있을 가능성이 높다. 다음과 같이 iptables 명령으로 TCP 80번 포트를 출발지 Any (0.0.0.0/0)를 선택하여 허용 정책을 추가해줘야 한다.

웹서버 DB서버 분리 - webseobeo DBseobeo bunli
sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT

만약 정상적으로 보인다면 Apache 2의 기본 DocumentRoot 디렉토리를 기본 웹서버 실행계정과 그룹의 소유로 변경해준다. 이 작업이 되지 않으면 DocumentRoot 경로의 퍼미션 문제로 워드프레스 설치 등 작업 시 오류가 발생할 가능성이 높다.

웹서버 DB서버 분리 - webseobeo DBseobeo bunli
sudo chown www-data:www-data  /var/www/html -R

해당 디렉토리가 다음과 같이 소유자와 그룹이 변경된다. 이는 실제 실행되는 Apache 2 의 프로세스의 오너(Owner)와 도큐먼트 루트의 파일들의 오너를 일치시켜주기 위함이다.

웹서버 DB서버 분리 - webseobeo DBseobeo bunli

PHP 7.4 설치

Apache 2를 설치한 다음은 PHP를 설치한다. PHP를 설치하기 위해서 SW 리포지토리를 하나 추가해야 한다. 외부 리포지토리 지원과 리포지토리를 등록해준다.

웹서버 DB서버 분리 - webseobeo DBseobeo bunli
sudo apt install software-properties-common apt-transport-https -y
웹서버 DB서버 분리 - webseobeo DBseobeo bunli
웹서버 DB서버 분리 - webseobeo DBseobeo bunli
sudo add-apt-repository ppa:ondrej/php -y
웹서버 DB서버 분리 - webseobeo DBseobeo bunli

리포지토리가 정상적으로 등록되었다. 

다음은 PHP 설치다. PHP는 버전 7.4와 mysql 연동을 위한 라이브러리 등을 설치한다.

웹서버 DB서버 분리 - webseobeo DBseobeo bunli
sudo apt install php7.4 libapache2-mod-php7.4 php7.4-mysql php-common php7.4-cli php7.4-common php7.4-json php7.4-opacache php7.4-redline

정상적으로 설치가 되었다.

웹서버 DB서버 분리 - webseobeo DBseobeo bunli

php7.4 모듈이 설치 완료되었으므로 php7.4 모듈을 enable 한다. 그리고 아파치 2 웹서버를 재구동 한다.

웹서버 DB서버 분리 - webseobeo DBseobeo bunli
sudo a2emo php7.4; sudo systemctl restart apache2

php 버전은 다음처럼 확인한다.

웹서버 DB서버 분리 - webseobeo DBseobeo bunli
php --version

php 모듈이 정상적으로 구동되는 것을 확인했으므로 보다 가볍고 빠른 동작을 할 수 있도록 php-fpm 모듈을 로드하기 위해 php 7.4 모듈을 disable 한다.

웹서버 DB서버 분리 - webseobeo DBseobeo bunli
sudo a2dismod php7.4

php7.4-fpm 모듈을 설치한다.

웹서버 DB서버 분리 - webseobeo DBseobeo bunli
sudo apt install php7.4-fpm

php7.4-fpm 모듈이 설치되는데 상단부에 FPM 모듈을 enable하기 위해서 실행해야 하는 명령어를 알려준다.

웹서버 DB서버 분리 - webseobeo DBseobeo bunli
php-fpm 설치

빠른 php의 실행을 위해 proxy_fcgi 모듈을 enable 한다.

웹서버 DB서버 분리 - webseobeo DBseobeo bunli
sudo sudo a2enmod proxy_fcgi setenvif

php7.4-fpm을 사용하기 위해 다음 명령을 실행한다.

웹서버 DB서버 분리 - webseobeo DBseobeo bunli
sudo a2enconf php7.4-fpm

Apache 2를 재구동 한다.

웹서버 DB서버 분리 - webseobeo DBseobeo bunli
sudo sstemct restart apacj

fpm 모듈과 fast-cgi가 설정되었는지 확인하게 위해 한줄짜리 php 소스코드를 설정한다.

웹서버 DB서버 분리 - webseobeo DBseobeo bunli
php 설정 확인용 php 파일을 만든다.

Apache 2 웹서버에 연결된 PHP Version에 다르기로 했다.

웹서버 DB서버 분리 - webseobeo DBseobeo bunli
server api가 FPM/FastCGI로 변경

여기까지 LAMP의 구성요소 중 Apache 웹서버와 PHP를 웹서버 역할을 수행할 하나의 리눅스 서버에 설치했다.

다음은 다른 리눅스 서버에 MariaDB를 설치하고 웹서버에서 DB에 접속할 수 있도록 MariaDB의 설정을 변경하고 원격에서의 접속권한을 부여해야 한다.

이 과정은 다음 포스트에서...!!