내가 한 노력들

[ AWS ] EC2에서 Docker 기반, nginx-php환경 구축후 RDS 연결하기 본문

IT 공부/PHP

[ AWS ] EC2에서 Docker 기반, nginx-php환경 구축후 RDS 연결하기

JONGI-N CHOI 2022. 1. 29. 17:49

nginx와 php 환경은 Docker을 이용해서 구축을 하고, DB는 AWS의 RDS의 서비스를 이용해서 연동하는 것을 해보겠습니다. 

 

이번과정에는 AWS의 프리티어로 이용가능한 범위 내에서 사용하기 때문에, 사용 후에 인스턴스를 삭제하면 따로 비용은 청구되지 않습니다. 

 

반대로, 삭제하지 않으면 ㅎㅎ;; 

 


EC2 인스턴스 생성

첫 번째로, AMI 선택에서 ubuntu 20.04 버전을 선택해줍니다.

 

인스턴스 유형 선택에서는 역시나 프리티어로 이용할 수 있는 t2.micro를 선택

 

검토 및 시작을 누르면, 

 키페어를 선택 및 생성하는 팝업이 나옵니다.

 

SSH를 이용해서, 해당 EC2 인스턴스에 접속하기 위해서 필요한 비밀번호와 같은 역할을 하게 됩니다.

SSH로 EC2에 접속하는 방법은, 아래의 링크에서 자세히 설명이 되어있습니다. 

https://bill1224.tistory.com/311

 

인바운드 규칙 

인바운드 규칙을 지정할려고 하는데, Docker를 통해서 nginx서버를 구축할 때, 8000번 포트와 nginx의 80번으로 연결했기 때문에, 인바운드 규칙에서는 8000번 포트를 포워딩해줘야합니다. 
SSH는 위에서 만든 키페어를 통한 접속을 위한 인바운드 규칙입니다. 

 

putty 접속

window환경에서는 putty를 통해서 ssh 접속을 할 수 있습니다. 

putty 접속하는 것도 위의 키페어 부분에 추가한 링크부분에 자세히 나와있습니다. 

 


RDS 생성 

Mysql을 이용해서 RDS를 생성합니다. 

그리고, DB이름 관리자 이름, 비밀번호 등 필요한 설정을 마친뒤에 인스턴스 생성을 합니다.

 

저는 5.7버전을 사용했고, 파라미터 그룹도 추가했는데 파라미터 그룹은 CHARACTER SET과 COLLATE설정을 위해 따로 설정해둔 것 입니다. 

 

 

인바운드 규칙 편집

인바인드 규칙을 편집해야하는데, 외부에서 RDS로 접근하기 위해서 포트 포워딩작업을 해주는 것 입니다. 

위에서 생성한 EC2에서 접근할 수 있게 EC2의 보안 그룹을 지정하고, 또 하나는 내 PC에서만 접근할 수 있도록 설정해 두 었습니다. 

 

그러면, RDS의 구축은 끝났습니다. 

 


Docker 설치 

https://dongle94.github.io/docker/docker-ubuntu-install/

 

[Docker] Ubuntu에 Docker 설치하기

우분투에서 도커(Docker) 설치하는 방법을 알아본다.

dongle94.github.io

위에 사이트에 정말 상세하게 설명이 되어있습니다. 

 

apt update & install package

$ sudo apt update
$ sudo apt-get install -y ca-certificates \ 
    curl \
    software-properties-common \
    apt-transport-https \
    gnupg \
    lsb-release

키 및 저장소 추가

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository \
  "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

도커 엔진 설치

$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io

버전 확인

$ sudo docker info

 

Docker-compose 설치 

nginx와 php를 따로따로 컨테이너로 구축하기 위해, docker-compose를 이용

 

sudo curl -L "https://github.com/docker/compose/releases/download/2.2.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose -version

도커 최신버전은 아래의 링크에서 확인 가능 

https://github.com/docker/compose/releases

 

 

실행하고자 하는 docker-compose.yml 파일이 있는 위치로 이동한 후에, docker-compose 명령어를 사용해서 컨테이너를 실행합니다. 

sudo docker-compose up -d

-d 옵션은 백그라운드로 실행시키는 옵션입니다. 

 

그러면, yml파일에 작성해둔, 두개의 서비스 (컨테이너) nginx와, php (codeigniter 환경으로 구축해서 만든 이미지 기반)

이 실행중인 것을 확인할 수 있습니다.

 

원래는, mysql 컨테이너도 띄어서 연동시켜야하지만, 이번에 RDS를 통해서 mysql을 대체했기 때문에 없어도 됩니다.

 

php 컨테이너 환경 설정 (프로젝트 설정)

이 과정은, codeigniter 4를 이용한 저의 프로젝트에만 적용되는 내용입니다. 

sudo docker exec -it 컨테이너ID /bin/bash

 

php컨테이너로 들어가서, 조금의 환경설정 과정이 필요합니다. 

저는 크롤링하는 php 프로젝트가 들어가있고, cron을 이용해서 1시간마다 크롤링하는 명령어를 실행시키기 위함입니다.

 

또한, 프로젝트 폴더의 주인을 변경해야지 nginx에서 프로젝트에 접근할 수 있습니다. 

이 과정은 아마 dockerfile로 설정해두면, 이렇게 따로 컨테이너에 들어가서 변경안해줘도 될 것  같습니다. 

 

sudo chown -R www-data:www-data 디렉토리

위의 명령어로 프로젝트 폴더에있는 파일이나 디렉토리의 주인을 www-data로 변경을 합니다. 

 

그리고, codeigniter 프로젝트에서 Database.php과 App.php 파일에서 변경해줘야하는 부분이 있습니다. 

 

App.php

public $baseURL = 'http://localhost:8000/';

localhost 부분을, EC2 인스턴스의 퍼블릭 IP로 변경해줍니다. 

 

 

Database.php

public $default = [
    'DSN'      => '',
    'hostname' => RDS엔드포인트,
    'username' => USERNAME,
    'password' => USERPASSWORD,
    'database' => DB명,
    'DBDriver' => 'MySQLi',
    'DBPrefix' => '',
    'pConnect' => false,
    'DBDebug'  => (ENVIRONMENT !== 'production'),
    'charset'  => 'utf8',
    'DBCollat' => 'utf8_general_ci',
    'swapPre'  => '',
    'encrypt'  => false,
    'compress' => false,
    'strictOn' => false,
    'failover' => [],
    'port'     => 3306,
];

위와 같에 RDS를 생성했을 때, 설정해두었던 username, password, db명을 입력해주고, hostname에는 RDS의 엔드포인트를 넣어줍니다. 

 

위의 db설정까지 끝났으면, 이젠 spark 명령어를 이용해서 table을 생성합니다. 

php spark migrate

 

table생성까지 끝났으니, 크롤링코드를 cron으로 자동으로 실행시켜서 DB에 데이터가 쌓이도록 합니다. 

service cron start
0 */1 * * * php /application/public/index.php cli/storeScraping >> /application/writable/logs/cronScraping.log 2>&1

매시각 정각에 php의 코드를 실행시켜 크롤링하고, 그 내용을 log파일로 저장하도록 설정했습니다.

https://bill1224.tistory.com/382

cron은 위 링크에 자세히 설명해두었습니다.


정리

이번에는, EC2 인스턴스와 RDS를 이용해서 Docker환경에서 실행되는 nginx-php를 구축했습니다.  

EC2인스턴스안에 Docker를 설치하고, Docker 환경에서 nginx, php 컨테이너를 docker-compose를 통해서 연동 및 실행

RDS 인스턴스를 생성해, 인바운드 규치그로 EC2 보안규칙을 넣어줌으로써 EC2인스턴스에서 접근이 가능하도록 했습니다.