AWS EC2 인스턴스에서 LEMP 스택으로 서버 구축하기

JIYOON·2021년 6월 2일
0

Web Server

목록 보기
3/5
post-thumbnail

1️⃣ AWS EC2 인스턴스 생성

01. EC2 인스턴스 생성

Amazon Web Services
AWS 공식 자습서 사이트

❗️추가공부 : AWS 자습서 보고 좀 더 공부해보기


  1. AWS 웹사이트에 접속, 계정이 없다면 가입 후 AWS 관리 콘솔에 들어간다.
  2. 리전은 GCP를 사용했던 것과 마찬가지로 '아시아 태평양(서울)'지역을 설정하는 것이 유리하다.
  3. 컴퓨팅 > EC2 > 인스턴스 > 인스턴스 시작
  4. AMI 선택 (Ubuntu Server 20.04 LTS 버전 선택) > 인스턴스 유형 선택 (프리 티어 사용 가능으로 선택) > 스토리지 추가 (프리 티어 사용자는 최대 30GIB 까지 설정할 수 있다.)
  5. 보안 그룹 구성 > 인스턴스 시작 검토(넘어간다)
  6. 기존 키 페어 선택 또는 새 키페어 생성

    키 페어를 잃어버리면 EC2 인스턴스에 접속이 어려워지므로 안전한 위치에 저장해야 한다.

  7. 인스턴스 생성

(* MI(Machine Image) : 가상 머신(VM) 인스턴스를 만드는 데 필요한 구성들을 저장해놓은 템플릿)
(* 프리 티어 : AWS 서비스 등록 후 12개월 동안 무료로 사용할 수 있는 사용자)
(* 키 페어 : 사용자가 SSH를 통해 안전하게 EC2 인스턴스에 접속할 수 있게 만드는 일종의 인증서)


EC2 인스턴스 대시보드에 생성한 인스턴스가 보인다면 성공!




02. EC2 탄력적 IP 할당

처음에 EC2 인스턴스를 생성하여 서버를 구동시키면 고정 IP로 할당되지 않는다. 탄력적 IP를 이용하지 않으면 인스턴스(서버)를 중지하고 다시 실행시키면 IP가 변경되어 버린다. 이를 방지하기 위해 탄력적 IP(Elastic IP)를 이용해 고정 IP를 할당 받아서 사용한다.

  1. AWS Console > 네트워크 및 보안 > 탄력적 IP > 탄력적 IP 주소 할당
  2. 생성된 탄력적 IP 이름 > 탄력적 IP 주소 연결 > 리소스 유형(인스턴스), 인스턴스(생성한 EC2 인스턴스 선택)




2️⃣ EC2 인스턴스 접근

AWS EC2 인스턴스를 원격으로 접근하고 서버의 파일과 폴더를 전송, 관리, 수정하기 위한 GUI 환경을 제공하는 WinSCP 프로그램을 활용해야 한다. 하지만 WinSCP가 Mac을 지원하지 않아서 본 포스팅에서는 같은 기능을 지원하는 FileZilla를 사용했다.
WincSCP와 FileZilla가 제공하는 프로토콜 기능을 FTP라고 한다.


01. FTP

File Transfer Protocol의 약자로, 사용자의 PC와 호스팅 서버 간 파일을 송수신해주는 프로그램이다. 서버에 있는 코드나 파일을 직접 열어서 수정할 수 있다. 기본 포트는 21로, 보안에 취약한 단점이 있다.




02. 이외의 프로토콜

프로토콜 : 통신 프로토콜 또는 통신 규약은 컴퓨터나 원거리 통신 장비 사이에서 메시지를 주고 받는 양식과 규칙의 체계이다. 데이터를 주고받는 상호간에 정해진 규약이다.

  1. TCP/IP : 인터넷을 사용하는 모든 통신의 기본적인 프로토콜. 응용 계층, 전송 계층, 인터넷 계층, 네트워크 접속 계층이 있다.

  2. TCP, UDP : TCP/IP 프로토콜 중 전송 계층에 속하는 프로토콜이다. TCP는 신뢰성 있는 통신을 지원하고 UDP는 신뢰성을 보장할 수 없지만 속도가 빠르다.

  3. HTTP, HTTPS : TCP/IP 프로토콜 중 응용 계층에 속한다. 응용 계층은 네트워크를 통한 실제 사용자 데이터를 처리하는 응용 프로그램으로 구성되는 계층이며, 사용자와의 직접적인 인터페이스를 제공한다.

  4. FTPS(FTP-SSL) : FTP 서비스에 HTTPS와 같이 공개키 암호화 방식을 더한 프로토콜이다.

  5. SFTP(SSH-FTP) : Secure File Transfer Protocol을 의미한다. FTP는 파일을 그냥 전송하지만 SFTP는 전송 데이터를 암호화한다. 포트 번호는 22번이다.

  6. DNS : Domain Name Service/Server의 약자. 도메인 네임을 IP주소로 변환하여 특정 웹서버, FTP 서버등의 도메인 네임이 설정되어있는 서버에 접속할 수 있도록 도와주는 프로토콜이다.

프로토콜에 대한 더 자세한 설명 by IT's me
가장 많이 쓰이는 프로토콜 총정리 by 아찌




03. Filzilla와 AWS EC2 연결(GUI)

  1. FileZilla 다운로드 및 설치 > FileZilla 실행
  2. 가장 왼쪽 아이콘 클릭 > 사이트 관리자 > 서버 선택, 프로토콜에서 SFTP 선택, 호스트에 EC2 인스턴스의 IPv4 퍼블릭 IP를 복사 후 붙여넣기, 로그인 유형은 키 파일, 사용자는 ubuntu, 키파일은 AWS 인스턴스 생성시 받은 키파일 선택
  3. 연결

사용자 이름을 ubuntu로 설정하는 이유




04. 추가 : 터미널로 접근(CLI)

  1. 인스턴스를 생성하며 받은 키페어가 있는 폴더로 cd 명령어를 통해 이동한다.
  2. AWS Console > EC2 인스턴스 > 요약에서 연결 클릭 > SSH 클라이언트 > 퍼블릭 DNS를 사용하여 인스턴스에 연결의 '예'를 복사 > 터미널에 붙여넣기 후 엔터
  3. 터미널에 Welcome to Ubuntu 20.04가 뜬다면 서버 접속 성공!



05. 추가 : 기본적인 리눅스 명령어

잘 정리된 자료가 많으므로 참고하기

리눅스 기본 명령어/자주 쓰이는 명령어 by HaejoonLee





3️⃣ AWS에 LEMP 스택으로 서버 구축

01. 기본 세팅

$ sudo apt-get update

저장소 내 패키지 정보 최신으로 업데이트

$ apt list --upgradable

업그레이드 가능한 패키지 목록 확인

$ sudo apt upgrade

패키지 최신 정보를 바탕으로 패키지를 최신으로 업그레이드

$ sudo apt autoremove

패키지 업그레이드 후 불필요해진 패키지를 자동으로 삭제

패키지 설치 전 전체적으로 업데이트 및 업그레이드하는 작업을 해주는 것이 좋다.

$ cat /etc/issue

우분투의 버전을 확인한다. 본 포스팅의 버전은 Ubuntu 20.04.2 LTS였습니다. 구글에 검색하실 때 우분투의 버전과 같이 검색해주세요!

좀 더 자세한 설명은 이전 포스팅을 참고 → APM으로-웹서버-구축하기#01-기본-세팅




02. Nginx 설치

$ sudo su
$ apt install nginx

위의 명령어를 입력하여 설치한다.
EC2 인스턴스의 퍼블릭 IPv4 주소로 접근했을 때 Welcome to Nginx 페이지가 뜬다면 설치가 완료된 것이다.

이 때 페이지가 뜨지 않는다면, 인바운드 규칙을 설정해주지 않았기 때문이다.


  1. EC2 인스턴스 이름 클릭하여 세부정보 이동 > 보안 탭 > 인바운드 규칙 확인

    이 때 22 포트만 열려있는 것을 확인할 수 있는데, 이 22(SFTP) 포트를 통해 FileZilla와 WinSCP로 서버 접근이 가능하다.

  2. 보안 세부정보의 보안 그룹 클릭
  3. 인바운드 규칙 편집 > 규칙 추가 > 유형 선택(HTTP), 소스 유형(위치 무관) > 규칙 저장
  4. 인바운드 규칙에 80번 포트가 추가된 것이 보이면 외부 접근 설정 성공!



03. MySQL 설치

$ sudo apt install mysql-server
  1. 터미널에 명령어 입력으로 설치
  2. validation policy 설정 > 원하는 것으로 설정한다. 1은 Low, 2는 Medium, 3은 High이다.
  3. root 비밀번호 원하는 것으로 설정

    이 때의 root 비밀번호는 MySQL의 비밀번호 정책 요구조건에 맞춰 작성하는 것이 좋다. validate_password_policy가 LOW라면 패스워드 8자 이상, MEDIUM이라면 8자 이상 + 대문자, 소문자, 특수문자가 모두 포함, HIGH라면 특정 단어가 포함되지 않은 비밀번호를 요구한다.
    처음 root 비밀번호를 설정할 때는 이러한 요구조건에 상관없이 설정할 수 있는데, 그렇다고 1234같은 간단한 번호로 설정하면 나중에 에러가 난다.
    비밀번호 변경으로 해결할 수 있지만 꽤 번거롭다.


$ sudo mysql -u root -p

위 명령어로 mysql을 실행하고 exit명령어로 종료한다.

sudo 권한 없이 MySQL 접근하기 by oyeon




04. PHP 설치

$ sudo apt install php-fpm php-mysql

위 명령어로 설치한다.

php-fpm을 설치하는 이유 : Nginx는 자체적인 PHP 모듈이 없으므로 설치하여 Nginx와 PHP를 연동시켜 PHP 페이지를 출력하기 위함이다. PHP FastCGI Process Manager의 약자이다.

웹서버와 동적인 페이지 : nginx 웹서버만으로는 동적인 페이지 구현이 어렵다.
(* 동적인 페이지 : 로그인과 게시글 등록 등의 기능이 이뤄지는 접속할 때마다 변하는 페이지이다.)
웹서버는 정적인 html 웹문서 파일을 웹브라우저에 전송하는 역할만 수행하므로 동적인 페이지 구성이 어렵다.

CGI : 동적인 페이지 구현을 위해 웹서버 외부의 프로그램에서 처리한다.
웹서버에서 요청을 받아 그 요청을 외부 프로그램에 넘겨주면, 외부 프로그램은 프로그램 파일을 읽어 html로 반환하는 단계를 거치며, 이를 CGI라 한다. php-fpm이 CGI에 속한다.

FastCGI : CGI는 요청할때마다 새로운 프로세스 생성하여 구동하므로 부하가 심하고 처리가 느리다. FastCGI는 CGI의 단점을 보완해 이미 생성한 프로세스를 재활용하여 처리가 빠르다.

출처 : php-fpm에 대한 설명 by conory




05. Nginx와 PHP 연동

$ cd /var/www/html/
$ sudo vi /etc/nginx/sites-available/default

Nginx의 기본 경로로 이동한 뒤 기본 설정 파일을 vi 편집기로 수정한다.

파일의 54번째 줄을 주석을 해제하여 다음과 같이 수정한다. i로 입력 모드로 진입하여 수정한 뒤 esc로 종료, :wq 명령어를 입력하여 파일을 저장한 뒤 명령 모드로 빠져나온다.
파일을 수정함으로써 PHP 페이지에 들어갔을 때 PHP 파일 자체가 다운로드되지 않고 PHP-FPM 모듈을 통해서 웹 페이지에 PHP 파일이 보여진다.




06. phpinfo 페이지 띄우기

$ cd /var/www/html/
$ sudo vi index.php

Nginx의 기본 경로로 이동한 뒤 phpinfo를 표시할 index.php 파일을 생성한다.

<?php
phpinfo();
?>

파일에 이와 같이 입력한 뒤 :wq 명령어를 통해 저장한 뒤 명령 모드로 빠져나온다.

$ sudo service nginx restart

변경된 설정을 적용해주기 위해 Nginx를 재실행한다.

'[AWS EC2 인스턴스퍼블릭 IPv4 주소]/index.php'로 접근했을 때 phpinfo 창이 나온다면 성공!
성공적으로 AWS EC2 인스턴스에 LEMP 스택을 이용한 서버를 구축했다!





0개의 댓글