환경
클라우드 서버 : AWS EC2 인스턴스
OS : Ubuntu 22.04 LTS
WebServer : Nginx
BL : PHP
DBMS : MySQL
1. AWS Elastic IP 적용하여 http 외부접속 가능하게 Nginx, php, mysql 설치

AWS에 접속하여 회원가입을 하고 인스턴스를 생성하였다

!

AWS에서 빌린 서버의 폴더구조를 이와 같이 볼수있다

PUTTY로 명령어 창을 키고 이제 NGINX, PHP, MYSQL을 설치해보자 레쯔고
NGINX 설치
$ sudo apt update $ sudo apt install nginx
nginx 설치 코드

설치 완료
이제 재부팅을 해주고

주소로 접속해보니 연결할 수 없단다
당연함, 80포트 설정안해줌^^

인바운드 규칙 추가를 해주자

추가 완료

다시 주소로 연결해보면 제대로 NGINX가 뜬다 짝짝짝
MYSQL 설치
$ sudo apt install mysql_server $ sudo mysql

mysql도 설치완료~!
PHP 설치
php 설치 시 먼저 nginx와 php가 연결될 수 있도록 하는 php-fpm을 반드시 설치해주고, 이 설정을 nginx conf 파
일에서 해주어야한다.
$ sudo apt install php-fpm php-mysql // 설치
$ cd /var/www/html
$ sudo vi index.php
<?php
phpinfo();
?>
php 파일을 하나 만들어주고
$ sudo vi /etc/nginx/sites-available/default

php 주석을 해제해주고 다시 ip/index.php로 접속해보았는데

ㅋ?
whyrano.. 🤦🏻♂️
구글링을 오지게 해본결과 이건 버전 문제다 싶어서 php-fpm의 버전확인을 해봤다


잡았다요놈
실습 영상(7.2)과는 다르게 ubuntu22.04에는 8.1이 깔렸던것이다. 고쳐주자,,

버전 수정해주고
$ sudo service nginx restart
nginx를 재시작하면?!

php 설치완료!
2. RDS로 데이터베이스 (MySQL) 생성 후 외부(DataGrip, Workbench 등)에서 접속가능하게 만들기
$ sudo mysql
mysql> show databases;
mysql> use mysql;
mysql> show tables;
mysql> select user, host from user;
mysql> create user 'neeke'@'%' identified by '비밀번호';

외부에서 접속할 사용자를 생성해주었다
mysql> create database TESTDB;

DB를 생성해주고
아까 생성한 사용자에게 권한을 부여해보자
mysql> grant all privileges on TESTDB.* to 'neeke'@'%'; // TESTDB의 모든 권한을 줌
mysql> flush privileges; // DBMS에 적용
mysql> show grants for 'neeke'@'%'; // 권한 확인

권한 부여 완료
MYSQL 외부 접속 설정
$ cd /etc/mysql/mysql.conf.d
$ sudo vi mysqld.cnf

mysqld.cnf의 파일을 열어 bind-address를 모두 접속 가능하게 0.0.0.0으로 바꿔준다
그리고 mysql 재부팅 고고
Datagrip으로 Mysql 외부 접속

인스턴스 서버 인바운드 규칙에 mysql을 추가해주었다
Datagrip을 다운받고 실행시켜 새로운 프로젝트 생성 후 database → mysql 선택
아까 생성한 DB 정보, user 정보들을 입력해준다
가보자고

TEST CONNECTION이 Succeeded가 뜨면 성공

mysql 외부 연결 성공👊
3. domain 연결 (가비아, 후이즈 등)
4. https 적용(Let's Encrypt)
※ 보안상 당연히, 무조건 https는 적용해놓아야 한다 명심하도록.
- HTTP: 클라이언트와 서버 양쪽에서 통신할 수 있도록 하는 기본 통신 프로토콜이다. 앞서 인바운드 규칙 설정을 통해 HTTP 프로토콜의 포트인 80번 포트로 접속하도록 설정을 해놓았다. HTTP는 브라우저와 서버 사이에서 정보를 평문으로 전송하므로 정보가 전달되는 네트워크에서 전송되는 정보를 제 3자가 엿볼 수가 있다.
- HTTPS: 이처럼 제 3자가 엿보는 것을 예방하기 위해 클라이언트와 서버가 먼저 암호화 통신 채널을 설정한 다음 평문 HTTP 메시지를 전송함으로써 정보 유출을 막는 HTTPS가 등장했다. 암호화 채널은 SSL(TLS) 프로토콜을 사용해서 만든다.
- Let's encrypt: Let's Encrypt는 무료의 TLS/SSL 인증서를 쉽게 가져오고 설치할 수 있는 방법을 제공하는 CA(인증 기관)으로, 웹 서버에서 암호화된 HTTPS를 무료로 이용할 수 있다. 이러한 방법은 사용자에게 Certbot라는 소프트웨어를 제공함으로써 구현한다.
certbot 설치
저장소를 최신으로 업그레이드 하고 certbot을 위한 저장소를 추가한다
$ sudo apt update
$ sudo apt upgrade
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt install python3-certbot-nginx
$ sudo vi /etc/nginx/sites-available/default
설정파일로 가서 인증서를 적용할 도메인 이름을 넣어준다

작성완료

$ sudo nginx -t
이상이 없는지 테스트도 해준다

이상 읎음!
$ sudo systemctl reload nginx
설정 파일 적용을 위해 nginx를 reload 해준다
DNS 레코드 추가

HTTPS 구축 전 AWS 인스터스에 인바운드 규칙으로 HTTPS를 추가해줬다
$ sudo certbot --nginx -d [도메인] -d [도메인]
위 코드로 SSL 인증서를 획득하려 했으나

응 오류
폭
풍
구
글
링
오류 뜨는 이유가 DNS 레코드에 www 호스트만 설정했기 때문인것같다
가비아 사이트에 DNS 레코드를 추가해주자

@는 www가 없을 때 들어오는 설정
다시 SSL 인증서를 받으러 가보자

드디어 받아냈다
다시 도메인으로 접속해보면


HTTPS 적용 완료 🤸🏻
Share article