[AWS] ubuntu 20.04 서버 구축 (Nginx, MySQL, php-apt이용)

Benjamin·2022년 8월 9일
0

AWS

목록 보기
3/4

ubuntu 서버 구축


VirtualMachine에서도 Ubuntu-20.04를 사용하기때문에, 여기서도 20.04로 진행.


프라이빗 키 파일 형식은 필요시 나중에 사용 프로그램에따라 형식변환이 가능하다.
일단 '.pem'으로 진행한다.

인스턴스에 접속할 때 키 페어파일로 접속하기는데, 이 파일이 노출되면 타인이 마음대로 내 인스턴스에 접속할 수 있기때문에, 유출을 조심하고 안전한 장소에 보관해야한다.


인바운드규칙을 설정한다.
HTTP(80), MySQL(3306), HTTPS(443)은 IP와 무관하게 접속할 수 있도록 해도되지만, SSH를 모든 사용자에게 열어두는것은 매우 위험하다. 따라서 우선 SSH를 내 IP에서만 접속할 수 있도록 설정하였다.


30GB 모두 사용하자.


성공!


인스턴스를 생성한 이후, 필요한 인바운드 보안규칙을 추가해주었다.
컴퓨터와 노트북에서 사용할 예정이기때문에, 각각 IP로 SSH(22)를 허용해주었고, HTTP(80)와 HTTPS(443)는 모든 IP에서 접근가능하도록 두었다.

이때 웹 서버의경우는, 아웃바운드 규칙도 마찬가지로 80,443포트를 허용해야한다.
허용하지 않을 경우 curl이 안되는 문제가 발생할 뿐만 아니라 Session Manager을 접근하지 못하는 문제가 발생하기 때문이다.

나의 경우는 확인해보니, 기본적으로 모든 트래픽에대해 모든 IP의 아웃바운드가 허용되어있으므로 그대로 두고, 따로 추가하지않아도 될 것 같다.

+cURL?

다양한 통신 프로토콜을 이용하여 데이터를 전송하기 위한 라이브러리와 명령 줄 도구를 제공하는 컴퓨터 SW 프로젝트.
HTTP. FTP 등 다양한 통신 프로토콜을 지원하면 SSL 인증 방식 역시 사용 가능하다.

이후 탄력적 IP주소를 할당받아야한다.

탄력적 IP? (Elastic IP)

동적 클라우드 컴퓨팅을 위해 고안된 고정 퍼블릭 IPv주소
모든 인스턴스 또는 네트워크 인터페이스에 탄력적 IP주소를 연결 가능

  • 이를 사용하는 이유?
    EC2 인스턴스를 생성하여 서버를 실행시키면 고정 IP가 아닌 동적 IP를 할당받는다.
    인스턴스를 중지하고 다시 실행시키면 IP가 변경되어 버리는 문제가 발생한다.
    -> 따라서 탄력적 IP를 할당받아 사용하여 고정IP를 이용한다
  • 요금
    탄력적 IP 주소가 EC2인스턴스에 연결되어있다.
    탄력적 IP 주소와 연결된 인스턴스가 실행 중이다.
    인스턴스에 연결된 탄력적 IP주소가 하나만 있다.
    -> 이 세 조건 모두에 해당하는 경우에는 탄력적IP주소에 대한 비용이 발생하지 않는다.

EC2 메뉴의 '탄력적 IP - 탄력적 IP 주소 할당 - 할당'을 순서대로 클릭하여 손쉽게 할당받을 수 있다.

할당받은 IP의 주소를 눌러 요약정보로 들어가면, 아직 연결된 인스턴스가 없어서 '연결된 인스턴스 ID'가 비어있는것을 확인할 수 있다.
탄력적 IP주소 연결을 눌러 인스턴스를 연결해주자!

연결 이후, 인스턴스의 요약정보로 가보면 탄력적IP가 잘 맵핑된 것을 볼 수 있다.


winSCP 설치 및 실행 (+PuTTY)

winSCP?

마이크로소프트 윈도우용으로 개발된 자유오픈소스 SW
SFTP, SCP, FTP 클라이언트
주요 기능 : 로컬 및 원격 컴퓨터 간 보안 파일 전소, 기본적인 파일 관리자, 파일 동기화 기능
<설치>
https://winscp.net/eng/download.php

FileZilla?

오픈소스 크로스 플랫폼의 자유 소프트웨어인 FTP소프트웨어로, 윈도우, macOS, linux를 지원한다.
FTP, SFTP, FTPS 지원
<설치>
https://filezilla-project.org

PuTTY?

가상 단말기 프로그램
서버는 물리적으로 떨어져 있어도 단말 장비를 통해 원격으로 접속하여 작업 할 필요가 있다. 이때, 개인 pc운영체제에서도 서버로 접속할 수 있도록 물리적인 단말장비가 아닌 논리적인 가상 단말기가 필요한데 이것을 제공하는 역할을 한다.
<설치>
https://www.chiark.greenend.org.uk/~sgtatham/putty/

winSCP가 가장 많이 사용되어서 좋으나, 이는 이름에서도 알 수 있듯이 Windows만 지원한다.
나는 Mac에서 이 과정을 진행하기때문에 FileZilla를 사용하였다.
FileZilla를 사용하기 위해서는, File Zilla Client를 다운받는다.
또한 MacOS사용자 일 경우, 먼저 시스템환경설정에서 원격로그인을 체크해주어야한다.

모두 설치했으면
winSCP에서 로그인시, 파일 프로토콜은 SFTP, 호스트 이름에는 EC2에서 사용 할 인스턴스의 퍼블릭IPv4주소를 복사하여 넣어준다.(포트번호는 SFTP이기때문에 22로 자동설정되어있다.)
ubuntu 서버이면, 사용자 이름은 ubuntu로 설정해준다.
비밀번호는 설정하지 않아도 된다.
https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/managing-users.html
(사용자 이름 참고)

여기서 끝이아니라! 고급설정으로 들어가, 'SSH-인증'에서 개인키 파일에 EC2 인스턴스 생성시 다운받았던 키 파일을 넣어준다.
파일탐색시, 처음에는 파일형식이 '.ppk'로 되어있기 때문에, 자신의 키 파일형식이 '.pem'일 경우 보이지 않을수도 있다.
따라서 혹시 자신의 키 파일이 보이지 않는다면, 키 파일의 확장자를 모든 파일(.)로 바꾸어주어서 파일을 탐색해보자!

저장을 누르면, '다음 세션에 저장:'이 뜨는데, 여기에는 자신이 원하는 세션명을 적어준다.

이렇게 로그인에 성공하면, 아래 사진과같이 로컬과 원격서버가 잘 나오는것을 볼 수 있다.

  • [mac] FileZilla는 화면 상단의 '파일-사이트 관리자'에서 새로운 사이트(연결)를 추가해준다. 프로토콜을 SFTP로 바꾼후, 비밀번호는 키파일형식으로 바꾸어서, 해당 키 파일을 넣는다.

  • [mac] mac은 Putty를 설치하지않아도 된다!
    여기에서 Putty없이 접속하는 방법을 알아보자.


Nginx설치

해당 설치는 ubuntu 20.04에 Nginx, MySQL, PHP를 설치하는 작업이다.

사전에 체크할 것!

만약 현재 Nginx를 설치하려는 서버에 apache가 이미 설치되어있다면, 아래 작업을 먼저 진행하여 서비스를 중지시킨 후 Nginx설치를 진행해야한다.
Apache가 중지되지 않으면 nginx는 설치를 거부하기 때문이다.

$ sudo systemctl status apache2
위 명령어로 현재 apache2가 어떤 상태인지 확인한다.

$ sudo systemctl stop apache2
$ sudo systemctl disable apache2
위 두 명령어로 apache2를 중지시키자.

체크사항 참고사이트

자 이제 시작이다!

$ sudo apt update
$ sudo apt install nginx

nginx설치시, 용량을 사용해도되는지 물으면 y를 입력하고 설치를 계속 진행하면 금방 완료된다.

초기 서버 설정 가이드에서 권장하는대로 ufw 방화벽이 활성화 된 경우 nginx에 대한 연결을 허용해아한다.
$ sudo ufw status로 상태를 확인해보고, 활성화되어있지 않다면 꼭 활성화를 하지 않아도된다.

+UFW란?

사용하기 쉬운 방화벽 관리 프로그램
Ubuntu 운영체제에 기본적으로 설치되나 활성화되어 있지 않다.
장점 : 단순, 사용자 친화적, 사용하기 쉬운 명령줄

*주의할 점!
ufw를 활성화했을 경우에만 해당된다.
OpenSSH를 허용하지않고, 원격 접속을나가버리면 원격서버로 다시 재접속하기 어려운 상황이 올 수 있다... 이로 인해 몇시간동안 고생했으니 주의해야한다!
원격 접속시 ufw를 활성화 할 예정이라면, 꼭 OpenSSH를 활성화해주자!

ufw를 활성화 및 설정
Nginx는 설치 시 몇 가지 다른 UFW응용프로그램 프로필을 등록하는데, 사용 가능한 UFW 프로필을 확인하려면 다음 명령어를 실행하면된다.
$ sudo ufw app list

내 컴퓨에서 사용 가능한 UFW 프로필은 위와 같다.

포트80에서 일반 HTTP트래픽을 허용해준다.
$ sudo ufw allow 'Nginx HTTP'

그리고 확인해보니
$ sudo ufw status

이 문제는, ufw가 기본적으로 활성화되어있지않아 생기는것이다.
따라서 $ ufw enable를 해주고, 다시 한 번 $ sudo ufw status로 확인해본다.

새 방화벽 규칙이 추가된것을 볼 수 있다.
웹 브라우저에서 서버의 도메인 이름 또는 공용 IP 주소에 액세스하여 서버가 작동하고 실행 중인지 테스트할 수 있다.

만약, 서버의 도메인명이 없고 공용IP 주소를 모르는 경우는 다음 명령어를 통해 찾을 수 있다.
ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'
결과로는 몇개의 IP주소가 출력된다.
나의 경우에는, winSCP로 연결했던 ubuntu의 프라이빗IP주소가 뜨는것을 볼 수 있다.

$ curl -4 icanhazip.com
이 결과로 뜬 주소를 웹 브라우저에 입력하면 Nginx의 기본 방문 페이지로 이동한다.


'http://[공용IP]'를 웹 브라우저 주소창에 입력해주면 nginx의 기본 페이지가 뜨는것을 볼 수 있다.
이 페이지가 뜬다면 정상적으로 nginx가 설치된 것이다.

OpenSSH도 같이 허용해주자.
$ ufw allow 'OpenSSH
$ sudo ufw status로 확인해보면, OpenSSH가 잘 추가되었다.


MySQL 설치 + 설정

이제 웹 서버가 실행되고 있으므로, 사이트의 데이터를 저장하고 관리할 수 있는 데이터베이스 시스템을 설치해야한다.
MySQL은 PHP환경에서 널리 사용되는 데이터 베이스 관리 시스템이다.
$ sudo apt install mysql-server
y를 입력하면서 모든 설치를 진행한다.

$ sudo mysql


'mysql>' 이 뜨면, 잘 설치된것이다.
나가고싶다면 'exit'를 입력한다.

설치에는 성공했지만, 이후 설정작업시 잘못해서 처음에 고생했으니 주의할 점이 있다.

보통 mysql -u root를 이용해 root로 접속하려하고, 여러 에러가 뜨니 root의 비밀번호를 설정하는 등 root계정을 건드리는 경우가 있는데 이는 보안상 좋지않은 방법이다.
MySQL은 기본적으로 보안을 위해 root계정을 localhost에서만 접근이 가능하고, 외부에서는 접근이 불가능하도록 설정되어있다.

따라서, MySQL을 사용하기 전 내가 사용할 새로운 사용자를 추가해주자.

sudo mysql
mysql로 접속

use mysql;
사용할 db를 mysql로 선정

select host, user from user;
현재 생성되어있는 사용자에관한 정보를 본다.

create user [사용자id];
사용자를 추가한다.

create user '[사용자id]'@'%' identified by '[비밀번호]';
'%'는 host를 %로 설정하며, 외부에서 접근을 허용한다는 의미이다.
그리고 해당 사용자에서 사용할 비밀번호를 설정해준다.

MySQL은 사용자 이름, 비밀번호, 접속 호스트로 여러분을 인증한다.
로그인을 시도하는 위치가 어디인가하는것도 인증의 일부인것이다.
사용자 계정을 추가하고 권한을 추가하거나 삭제하는데에는 GRANT, REVOKE 사용을 권장한다.

grant all privileges on *.* to [사용자id]@'%';
사용자id에 권한을 주자.
모든 원격지에서 모든 db의 모든 테이블에 접속할 수 있는 권한을 추가해준다.
(전역 권한은 보안문제가 수반되므로, 꼭 필요한 사용자에게만!)
*.* = db명.테이블

flush privileges로 변경된 내용을 메모리에 반영


PHP 설치 + 외부에서 접속하기 (phpinfo 띄우기)

콘텐츠를 제공하기 위해 Nginx가 설치됐고, 데이터를 저장하고 관리하기 위해 MySQL이 설치 되었다. 이제 PHP를 설치하여 코드를 처리하고 웹 서버에 대한 동적 콘텐츠를 생성해야한다.

$ sudo apt install php-fpm php-mysql

php-fpm? php-mysql?

Apache는 각 요청에 PHP 인터프리터를 포함하지만, Nginx는 PHP처리를 처리하고 PHP 인터프리터 자체와 웹 서버 사이의 다리 역할을 하는 외부 프로그램이 필요하다.
이렇게 하면 대부분 PHP기반 웹 사이트에서 전반적인 성능이 향상되지만 추가 구성이 필요하다.
'PHP fastCGI 프로세스 관리자"를 의미하는 php-fpm을 설치하고 처리를 위해 이 소프트웨어에 PHP 요청을 전달하도록 Nginx에게 지시해야한다.
또한 PHP가 MySQL기반 데이터베이스와 통신할 수 있도록 하는 PHP모듈인 php-mysql이 필요하다. 핵심 PHP 패키지는 종속적으로 자동 설치된다.

$ cd /var/www/html로 가서 $ ls를 해보면, index.nginx-debian.html이 있는것을 볼 수 있다.
이 경로에서 파일을 하나 만들어주자.

$ sudo vi index.php

<?php
phpinfo();
?>

를 파일에 입력해준다.

이후 웹 브라우저에서 'http://[ip]/index.php'를 입력해보면, 페이지가 뜨는게 아니라 index.php 파일이 다운받아진다.

연동이 되지않은 문제이다!
기본 nginx설정파일이 있는 경로로 가준다.

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

56번째줄쯤 부터 시작하는 부분이다. nginx와 php의 연동이 필요하므로 총 4개의 줄을 주석해제해준다.
이때! 'php[버전]-fpm.sock' 에서 버전이 몇인지 잘 확인하자. 자신이 깐 버전과 일치하는지 확인해야한다.

필요시 추가 모듈을 설치해준다.
sudo apt install php-mbstring php-gd php-curl php-xml php-bcmath composer

  • php-mbstring :다국어 처리 모듈
  • php-gd : 이미지 처리 모듈
  • php-curl : php로 curl명령을 내릴 수 있게 하는 모듈
  • php-bcmath : 수학연산을 확장해주는 모듈
  • composer : PHP 패키지 의존성 관리 프로그램

$ sudo service nginx restart
재시작

0개의 댓글