안녕, 세상!

2-2 AWS에 Nginx, MySQL, PHP 구축 본문

It공부/Server

2-2 AWS에 Nginx, MySQL, PHP 구축

dev_Lumin 2021. 1. 31. 14:48

서버 구축 방법에는 크게 두 가지가 있습니다.

1. 온프레미스 (하나의 건물)

2. 클라우드 (호텔)

 

온프레미스 방식은 보다 물리적으로 서버 자체를 새것으로 통으로 임대하는 방식입니다.

온전히 대여를 했으므로 디테일한 설정이 가능하고 보안이 좋다는 장점이 있습니다.

하지만 새것으로 빌렸기 때문에 안에 체제가 잡혀있지 않기 때문에 사용자가 일일이 설정을 하나씩 다 구축을 해줘야 합니다.

 

클라우드 방식 역시 물리적인 서버를 이용하는 것이긴 하지만 

이름에서 유추할 수 있듯이 물리적인 이미지와 거리가 조금 있는 것을 알 수 있습니다.

이 방식은 서버 중에 한 공간을 일부만을 빌려서 사용하는 방식이며

기본적인 체제가 잡혀있는 상태이므로 다양한 시스템을 처음부터 이용할 수 있습니다.

보통 소규모의 프로젝트를 구현할 때 서버를 대여해주는 회사로부터 서버를 빌려서 구축하곤 합니다.

외부로부터 빌려서 사용하는 것이므로 온프레미스에 비해 구체적인 설정에 대한 제한이 있습니다.

 

그중 아마존 AWS 클라우드 서버를 빌려 서버를 구축해보겠습니다.

 

(1) AWS 기본 설정 

먼저 AWS에 회원가입 및 로그인을 해주고 

region(지역) 설정을 서울로 해줍니다. (서울에 있는 서버를 임대)

지역을 서울로 설정

① AMI 선택

'EC2를 사용하여'를 클릭 후 원하는 운영체제를 선택합니다. (필자는 ubuntu 18.04를 선택함)

(프리티어 사용 가능 중 선택해야 무료로 사용 가능합니다.)

 

② 인스턴스 유형 선택

기본으로 선택된 상태로 다음을 누릅니다.

③ 인스턴스 구성

기본으로 선택된 상태로 다음을 누릅니다.

④ 스토리지 추가

최대 30G를 사용할 수 있으므로 30G로 바꿔줍니다.

 

⑤ 태그 추가

기본 상태로 내버려 두고 다음으로 넘어갑니다.

 

⑥ 보안 그룹 구성

 

SSH

현재 외부의 클라우딩 컴퓨터를 빌린 것인데 그 빌린 컴퓨터에 직접 명령어를 치고 통제를 하기 위해서는 

SSH 프로토콜을 사용하여 접속할 수 있습니다.

 

소스 부분은 해당 서버를 접근하는 네트워크 범위를 설정하는 것입니다.

여기서 소스 부분은 보안을 위해서 내 ip(나의 공인 ip)로 설정합니다.

 

다음을 누르고 시작을 누릅니다.

 

⑦ 키 페어 생성

키페어 생성 이유

ec2를 생성하고 자신만 접근할 수 있게 하기 위해서 키 페어를 생성해줍니다.

키페어는 자신이 꼭 기억해야 하며 외부에 노출하지 않도록 주의해야 합니다.

잘 보관해줍시다!

 

 

 

 

(2) WinSCP와 PuTTY 설정 

Window 운영체제에서 Unix계열 서버를 이용할 때 

원격 접속을 지원하는 SSH(Secure Shell) 프로그램을 이용하는데

대표적으로 PuTTY와 WinSCP가 있습니다.

WinSCP, PuTTY 모두 사용해보도록 하겠습니다.

 

WinSCP는

Microsoft Windows용 무료 오픈소스 SFTP, FTP, WebDAV, Amazon S3 및 SCP 클라이언트 프로그램입니다.

그중 SFTP(SSH)를 이용하여 위에서 생성한 인스턴스를 접근하고 싶기 때문에

WinSCP를 설치해줍니다.

winscp.net/eng/download.php

 

WinSCP :: Official Site :: Download

WinSCP 5.17 Download WinSCP 5.17 is a major application update. New features and enhancements include: Improvements to sessions and workspace management, so that WinSCP can now easily restore tabs that were open when it was last closed. Hardware-accelerate

winscp.net

설치 과정에서 설정한 옵션은 다음과 같습니다.

설치 모드 : 모든 사용자(권장)

유형 : 일반 설치

인터페이스 스타일 : 커맨더

 

PuTTy는

인기 있는 SSH 및 텔넷 클라이언트로 인터넷을 통해 보안 연결을 설정하고 설치가 필요하지 않습니다.

PuTTy도 설치를 해줍니다.

putty.softonic.kr/download

 

PuTTY

완전하고 안정적인 텔넷 및 SSH 클라이언트

putty.softonic.kr

설치 과정은 계속 next를 누르면 되며

Add shortcut to PuTTY on the Desktop은 바탕화면 바로가기 생성 여부이므로 선택적으로 하면 됩니다.

 

우선 WinSCP 설정을 하겠습니다.

앞서 구축한 인스턴스 퍼블릭 주소를 복사하여

WinSCP의 호스트 이름에 붙여 넣고 (포트번호는 자동으로 SSH 22번으로 설정됨)

사용자 이름은 다음 aws를 참고합니다.

( docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/managing-users.html )  

필자는 Ubuntu AMI로 했으니 해당 url에 나와있듯이 사용자명은 ubuntu로 해주고 비밀번호는 없습니다.

 

'고급' 버튼을 눌러 인스턴스를 생성할 때 생성한 키 페어를 '인증'의 개인키 파일에 넣습니다.

(다운로드한 키페어의 확장자가 ppk가 아니기 때문에 확장자 변환 과정 필요)

 

'저장' 버튼을 눌러서 현재 설정한 옵션들을 저장해둡니다.

(세션의 이름은 자유롭게 설정합니다)

 

이제 로그인을 누르면 다음과 같이 AWS에서 만든 인스턴스(서버)의 파일들을 확인할 수 있습니다.

위의 화면에서 표시한 빨간색 상자가 Putty 원격 프로그램으로 Putty로 커널에서 서버를 관리해줄 수 있습니다.

 

 

(3) Nginx PHP MySQL 

이제 PuTTY로 Nginx PHP MySQL을 구축하도록 하겠습니다.

웹서버 : Nginx

BL : PHP

DBMS : MySQL

( 참조 : www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-ubuntu-18-04 )

 

PuTTY 커널로 우선 Nginx를 설치합니다. 

$ sudo apt update
$ sudo apt install nginx

웹서버를 구축했으니 외부로부터 접속할 수 있도록

포트 포워딩을 합니다.

 

aws의 인스턴스로 돌아가서 [보안] -> [보안 그룹 링크]

 

외부로부터 들어오는 포트 설정을 하는 것이므로 인바운드 규칙 편집을 누릅니다.

 

HTTP를 위치 무관으로 설정하여서 규칙을 저장해줍니다.

 

이제 위치 무관으로 80번 포트로 접속할 수 있게 허용했으므로 검색창에 인스턴스의 공인 ip주소와 포트번호를 입력해줍니다.

 

접속이 잘 되는 것을 확인할 수 있습니다.

 

② mysql 설치

( 참조 : www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-ubuntu-18-04 )

이제 mysql을 설치해보겠습니다.

$ sudo apt install mysql-server
$ sudo mysql
mysql> exit

처음에는 root에 대한 비밀번호가 설정되어 있지 않기 때문에 잘 접속이 됩니다.

 

그럼 root에 대한 비밀번호 및 보안설정을 해주겠습니다.

$ sudo mysql_secure installation

해당 명령어를 입력하면 6가지 질문이 나옵니다.

( 참조 : joonyon.tistory.com/96 )

1. VALIDATE PASSWORD PLUGIN을 사용할지 물음

(사용한다면 보안 레벨을 0,1,2 중에 입력 가능하고 클수록 보안 조건이 강화됩니다.)

2.  root 비밀번호 설정

3. Anoymous User을 삭제할지 물음 : 보안을 위해서 Y

4. 외부에서 root계정으로 접근을 허용할지 물음 : 보안을 위해서 Y

5. TestDB를 삭제할지 물음 : 필요 없으니 Y

6. privileges table을 reload할지 물음 : Y

 

필자는 일단 1번 질문에 대해서 보안 레벨을 1로 했습니다.

(보안 레벨이 높으면 비밀번호를 바꿀 때 조건이 까다로워집니다.)

(이는 추후에 수정이 가능하므로 번호를 잘못 눌렀다고 해서 걱정 안 하셔도 됩니다.)

수정하는 방법은 다음과 같습니다.

( 참조 : junho85.pe.kr/1484 )

mysql> show variables like 'validate_password%';

필자와 같이 1로 설정했었다면 Medium이 보일 것입니다.

mysql> set global validate_password_policy=LOW;
mysql> show variables like 'validate_password%';

 

이제 보안 및 root의 비밀번호가 설정되었습니다.

root로 접속해 보겠습니다.

$ sudo mysql -u root -p
비밀번호 입력
mysql> exit

비밀번호를 입력하면 잘 접속되는 것을 확인할 수 있습니다.

 

하지만 다음 명령어는 비밀번호를 제대로 입력하더라도 오류가 뜰 것입니다.

mysql -u root -p

즉 sudo의 권한을 얻어야만 비밀번호를 입력해서 들어갈 수 있으므로 

sudo의 권한을 얻지 않아도 가능하게 해보겠습니다.

우선 다시 mysql에 접속을 합니다.

$ sudo mysql -u root -p
mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;
Output
+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             |                                           | auth_socket           | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

다음과 같이 root부분이 비어있고 auto_socket을 설정되어 있는데 이를 다음과 같이 수정합니다.

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

password부분은 변경할 root 비밀번호입니다.

위의 과정에서 처음 보안 비밀번호 설정에서 root비밀번호를 설정했지만 여기서 다시 바뀌어집니다.

 

( 이후 FLUSH PRIVILEGES; 를 입력해서 수정사항을 적용하라는데 필자는 안해도 적용이 잘 됨) 

 

이제 다시 SELECT 문을 입력해서 확인해보면 다음과 같이 root부분이 암호화된 비밀번호로 수정됩니다.

Output
+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

 

mysql을 exit 하고 다시 다음 명령어를 입력하고 변경된 비밀번호를 사용하면 접속이 잘 되는 것을 확인할 수 있습니다.

$ mysql -u root -p

 

③ PHP 설치

php를 다음 명령어로 설치를 해줍니다.

$ sudo apt install php-fpm php-mysql

명령어를 보면 php-fpm이라는 것을 설치합니다.

php-fpm은 웹서버인 nginx와 php가 서로 연동시키는데 필요합니다.

 

apache 서버와 비교하자면

apache 웹서버는 자체 내에서 php와 연동시키게 해주는 모듈을

configuration 파일로 자동으로 설정을 하도록 하고 있는 반면,

nginx에서는 php와 연동할 수 있도록 하는 php-fpm을 따로 설치해주고 

nginx configuration파일에서 설정을 수동으로 해줘야 합니다.

(php와 php-fpm에 대한 자세한 설명 : alkhwa-113.tistory.com/entry/AWS-EC2%EC%97%90-PHP-fpm-%EC%84%A4%EC%B9%98?category=883690 )

 

우선 php-fpm의 필요성을 느끼기 위해서 php 파일부터 만들어보겠습니다.

nginx의 루트 디렉터리(기본 경로:  /var/www/html)에 php 파일을 만들어 줍니다.

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

<?php
phpinfo();
?>

:wq

 

주소창에 ec2인스턴스주소/index.php 로 접근해보면 phpinfo창은 안 뜨고 index.php가 다운로드되는 것을 확인할 수 있습니다.

이는 아직 nginx와 php가 연동이 되지 않았다는 것입니다.

 

nginx php 연동

nginx의 기본 설정 파일 /etc/nginx/sites-available/default 입니다.

해당 디렉터리에 nginx의 루트 디렉터리 설정, 서버 설정 등 많은 중요한 내용들이 담겨 있습니다. 

$ sudo vi /etc/nginx/sites-available/default

그중 php연동을 위해서 56, 57, 60번째 주석을 해제시켜주고

60번째 줄은 php7.2-fpm.sock;로 바꿔줍니다.

기본적으로 php7.0으로 되어 있는데 ubuntu18.04 버전은 apt install할 때 php-fpm을 7.2 버전을 설치됩니다.

 

nginx 기본 설정을 수정했으니 restart 합니다.

$ sudo service nginx restart

그런데 오류가 발생하고 자세한 오류를 보기 위해 journalctl -xe를 입력하라고 합니다.

입력하면 다음과 같이 /etc/nginx/sites-available/default 의 92번째에 '}'가 없어서 오류가 났다고 합니다.

그래서 다시 vi로 들어가서 92번째 줄에 '}'를 넣어주고 sudo service nginx restart를 하면

오류 없이 재시작이 잘 됩니다.

 

이제 ec2인스턴스주소/index.php로 접근하면 phpinfo가 잘 나오는 것을 확인할 수 있습니다.

Comments