Ubuntu Nginx에서 도메인, 서브도메인, HTTPS와 Redirection 적용

JIYOON·2021년 6월 2일
1

Web Server

목록 보기
5/5
post-thumbnail

서버 환경
VM: AWS EC2 인스턴스
OS: Ubuntu 20.04.2 LTS
WebServer : Nginx 1.18.0
Backend-Language : PHP 7.4.3
DBMS : MySQL 8.0.25


1️⃣ 가비아로 서버에 Domain 연결

  1. 가비아 가입 > 도메인 구매
  2. My 가비아 > 서비스 관리 > 도메인 > 관리툴 > 도메인 연결 설정 > 구입한 도메인 설정
  3. DNS 설정 > 레코드 수정 > 레코드 추가
  4. 타입 : A, 호스트 : www, 값,위치 : AWS EC2 인스턴스 IPv4 외부 주소 입력, TTL : 3600

    설정을 같게 하여 호스트만 @로 바꾼 레코드를 하나 더 추가한다.
    이는 www가 없는 도메인에 접속할 수 있는 설정이다.

  5. 확인 > 저장




2️⃣ Let's Encrypt로 HTTPS 적용

01. HTTPS를 적용하는 이유

1) SSL의 이해

SSL(Secure Socket Layer) 프로토콜은 웹서버와 브라우저 사이의 보안을 위한 것으로, 서버와 클라이언트의 인증을 하는데 사용된다. SSL을 적용하면 클라이언트와 서버간 공유하는 암호화키를 가지고 암호화된 데이터가 송수신 된다.

2) HTTP vs HTTPS

HTTP(Hypertext Transfer Protocol)는 암호화되지 않은 방법으로 데이터를 전송하기에 보안에 취약하다. HTTP 프로토콜에서 발생할 수 있는 감청이나 데이터의 변조를 보완하기 위한 것이 HTTPS(Hypertext Transfer Protocol Over Secure Socket Layer)이다.

3) 추가 : TLS

SSL과 같은 의미로 SSL이 TLS란 이름으로 바뀌고 SSL을 계승한 것이다.

SSL에 대해 더 자세히 알고 싶다면 - SSL(Secure Socket Layer) 이란 by 12bme




02. Certbot 설치

1) Certbot과 Let's Encrypt

HTTPS를 사용할 때 브라우저는 웹 서버의 신원을 확인할 수 있는 디지털 인증서를 필요로 한다. 웹 서버는 이러한 인증서를 CA(Certificate authority)라고 하는 신뢰 가능한 인증 기관으로부터 획득한다.
Let's Encrypt는 이러한 CA들 중에 하나로, 사용자에게 무료로 TLS 인증서를 발급해주는 비영리기관이다. Certbot은 Let's Encrypt에서 인증서를 가져와서 웹 서버에 배치하는 클라이언트이다.

❗️추가 공부 : SSL과 인증서 구조 이해하기 by alice - 인증서 구조와 CA에 대해 더 읽어보기


2) Certbot 설치

$ sudo apt update
$ sudo apt upgrade

저장소를 최신 버전으로 업데이트한다.

$ sudo add-apt-repository ppa:certbot/certbot

certbot을 위한 저장소를 추가한다.

$ sudo apt update

한 번 더 업데이트하여 반영한다.

$ sudo apt install python3-certbot-nginx

certbot의 nginx 패키지를 설치한다.


3) Nginx 설정

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

nginx 설정 파일을 vi 편집기로 수정한다.

server_name [도메인명 예시: www.keecalm.com keepcalm.com]

44번째 줄의 server name을 변경해준다. 저장한 뒤 나온다.

$ sudo nginx -t

설정 변경 후 이상이 없는지 테스트한다.

$ sudo systemctl reload nginx

설정 적용을 위해 nginx를 리로드한다.


systemctl 명령어 :
systemd(system daemon) 을 관리하는 명령어이다.
systemctl 명령어에 대해 더 알고싶다면 - systemctl 명령어 사용법 by KwangSeob Jeong

systemd의 개념 :
Unix 시스템의 부팅 후 가장 먼저 생성된 후에 다른 프로세스를 실행하는 init 역할을 대체하는 데몬이며 Ubuntu 나 Arch 등 대부분의 리눅스 시스템에 공식적으로 채택되어 있다.


Unix의 개념 :
주로 서버용 컴퓨터에서 사용되는 운영체제로 이러한 Unix 운영체제의 표준을 POSIX라고 한다. Unix에 지불하는 라이센스 비용을 피하기 위해 Unix와 비슷하게 만들어진 것이 GNU/Linux이고 현재에는 Linux로 주로 불린다. 이러한 Linux의 배포판 중 하나가 Ubuntu이다.
따라서 Unix 명령어를 배우면 Linux에서 사용되는 명령어를 배울 수 있다.
참조 : Unix와 POSIX, GNU/Linux, 그리고 Linux 배포판 by 코드잇

Kernal과 Shell :
쉘(Shell)에 명령어를 입력하면 이를 컴퓨터 내부에서 받아들이고, 명령어를 해석하여 커널(Kernel) 을 통해 하드웨어를 조작한다.
커널은 운영체제의 핵심으로, 입출력을 관리하며 소프트웨어로부터의 요청을 컴퓨터에 있는 하드웨어가 처리 할 수 있도록 요청을 변환하는 프로그램이다. 하드웨어를 관리하고 필요한 프로세스를 나눠주는 등 여러 시스템 자원을 제어하고, 컴퓨터 부팅시 부트로더에 의해 로드되어 항상 메모리에 상주한다.
(* 부트로더 : 운영 체제가 시동되기 이전에 미리 실행되면서 커널이 올바르게 시동되기 위해 필요한 모든 관련 작업을 마무리하고 최종적으로 운영 체제를 시동시키기 위한 목적을 가진 프로그램)
은 사용자(명령) -> 쉘(해석) -> 커널(명령 수행 후 결과 전송) -> 쉘(해석) -> 사용자(결과 확인)을 거쳐 사용자와 운영체제간에 대화를 가능하게 해주는 명령어 해석기 역할을 한다.
참조 : Shell 1 intro by 생활코딩

운영체제 :
CPU, RAM, ROM, 모니터 등의 하드웨어를 동작시키고 제어할 수 있는 프로그램.
(* RAM : 랜덤 액세스 메모리(Random Access Memory), 휘발성 메모리로, 작업 중인 파일을 한시적으로 저장한다.)
(* ROM : 읽기 전용 메모리(Read Only Memotry), 비휘발성 메모리로, 컴퓨터에 지시사항을 영구히 저장한다.)


데몬(daemon) :
서버 프로세스로, 리눅스 시스템이 처음 가동될 때 눈에 보이지는 않지만 시스템에서 항상 활동 중인 백그라운드 프로세스의 일종이다. 메모리에 상주하며 사용자의 요청을 기다리고 있다가 요청이 발생하면 이에 즉시 대응할 수 있도록 대기 중인 프로세스이다. 자주 호출되므로 항상 구동되지 않고 구동, 종료하는 과정을 반복하게 되면 시스템에 부담을 준다. 소위 server라고 불리는 프로그램들은 데몬에 해당된다.

init : 초기화(Initialization)의 준말이다. 인스턴스를 사용하기 전에 준비하는 과정으로, 각 저장 프로퍼티에 초기 값을 설정하고 새 인스턴스를 사용할 준비가 되기 전에 필요한 다른 설정이나 초기화를 수행한다.


❗️추가공부
Unix 명령어 by 코딩팩토리
유닉스 시스템 프로그래밍 개요 by 12bme
부트로더에 대한 이해 by heeyam
서버데몬의 유형 by 혜민
초기화(Initialization) by 까칠코더




03. TLS 인증서 받기

$ sudo certbot --nginx -d www.keecalm.com -d keepcalm.com

certbot의 nginx 패키지를 통해 도메인에 인증서를 획득한다.



04. AWS HTTPS 인바운드 추가

이제 페이지가 HTTPS 인증을 받았으므로 AWS EC2 인스턴스에 HTTPS 인바운드 규칙을 추가해야 한다.

MySQL DataGrip으로 외부 접속하고 phpMyAdmin 설치하기 → 이전 포스팅의 1-04.인바운드 규칙 추가를 참고하여 시행한다.



05. Configuration Test

SSL Server Test
위 사이트에 도메인을 입력하면 SSL 인증서가 제대로 적용됐는지 테스트해볼 수 있다.

$ sudo service nginx restart

테스트에 성공했다면 nginx를 재시작한다.

사이트에 접속하여 도메인 옆에 자물쇠 모양이 생긴 것이 보인다면 성공적으로 HTTPS가 적용된 것이다!




3️⃣ Sub Domain 적용

01. sub domain의 이해

cafe.naver.com(카페)와 blog.naver.com(블로그)처럼 서브도메인을 이용해 다중의 사이트를 한 도메인 아래에서 독립적으로 접속할 수 있다. www 또한 인터넷 초창기에는 서브도메인이었으나 인터넷의 보급으로 www가 인터넷의 대명사가 되면서 서브 도메인의 개념이 사라지고 루트 도메인에 연결된 주소로 연결해주는 보조 역할을 하고 있다.



02. 가비아 DNS 레코드 추가

DNS : 전화번호부와 같은 기능을 한다. 도메인에 대한 요청을 IP 주소로 변환하여 사용자를 해당 서버에 연결한다.

  1. My 가비아 > 서비스 관리 > 도메인 > 관리툴 > 도메인 연결 설정 > 구입한 도메인 설정
  2. DNS 설정 > 레코드 수정 > 레코드 추가
  3. 타입 : CNAME, 호스트 : dev, 값,위치 : [도메인 입력], TTL : 3600
  4. 타입 : CNAME, 호스트 : prod, 값,위치 : [도메인 입력], TTL : 3600

본 포스팅에서는 dev, prod 두 개의 서브 도메인을 설정했다.



03. Nginx 설정

1) root 디렉토리와 index 파일 생성

$ cd /var/www/html
$ sudo mkdir dev
$ sudo vi dev.html
$ sudo mkdir prod
$ sudo vi prod.html

nginx 루트 경로에 접근한 뒤 해당 경로에 서브도메인 디렉토리를 생성한 뒤 각각의 서브도메인에 보여줄 php 혹은 html 파일을 생성한다.
여기서 생성한 서브도메인 디렉토리는 아래에서 nginx 설정 파일의 root 설정에 사용된다.


2) nginx 설정 변경

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

nginx 설정 파일을 vi 편집기로 수정한다.

# 기존 server 설정
server {
    root /var/www/html;
    index index.html index.htm index.nginx-debian.html index.php;
    server_name keepcalm.com;

    location / {
        try_files $uri $uri/ =404;
    }
}

# dev 서브 도메인 server 추가
server {
    root /var/www/html/dev;
    index dev.html;
    server_name dev.keepcalm.com;
    
    location ~ \.php$ {        
	include snippets/fastcgi-php.conf;
	fastcgi_pass unix:/run/php/php7.4-fpm.sock;    
}

    location / {
        try_files $uri $uri/ =404;
    }
}

기존 서버 설정 아래에 dev 서브 도메인 서버 설정을 추가했다.
위와 같은 방식으로 prod 서브 도메인 설정 또한 아래에 추가한다. root, index, server_name을 서브 도메인의 설정에 맞게 변경해야 한다.


    location ~ \.php$ {        
	include snippets/fastcgi-php.conf;
	fastcgi_pass unix:/run/php/php7.4-fpm.sock;    
}

서브 도메인 설정에 사용된 위의 코드는 nginx가 php파일을 다운로드하지 않고 php-fpm 모듈을 통해 웹 페이지에 보이게 하는 설정이다. 다음의 코드로 php의 버전을 확인할 수 있으니 버전을 확인하고 php 버전에 맞게 작성한다.

$ php -i | grep "PHP Version"

php-fpm : Nginx는 자체적인 PHP 모듈이 없으므로 설치하여 Nginx와 PHP를 연동시켜 PHP 페이지를 출력하기 위한 프로그램이다. Nginx에서 요청을 받으면 php 파일을 읽어 html로 반환해준다.

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

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


이 때 기존 서버 설정의 index는 페이지에 보여줄 index 페이지의 우선순위로, index.html이 아닌 index.php 파일을 첫 페이지로 보여주고 싶다면 아래와 같이 설정하면 된다.

index index.php index.html index.htm index.nginx-debian.html;

서브 도메인 서버에서는 각각의 페이지에 위에서 생성한 html 파일을 첫 페이지로 보여주도록 설정했다.


3) nginx 설정 적용

$ sudo service nginx restart

설정 변경 후 적용을 위해 nginx를 재시작한다.

적용 후 서브도메인 주소로 접속하여 작성한 html 파일이 보인다면 서브도메인 설정이 성공한 것이다!



04. 추가 : 서브도메인 HTTPS 적용

본 포스팅의 내용을 활용하여 서브도메인에 Let's Encrypt로 HTTPS 적용을 할 수 있다.
하지만 필자는 이를 실행하는 과정에서 오류가 나버렸고, 어찌저찌 해결하긴 했지만 긴 포스팅을 작성하는 동안 그만 오류의 내용과 해결 방법을 까먹어버리고 말았다...

혹여 나중에라도 기억이 난다면...추가해 보겠습니다...




4️⃣ Redirection 적용 (IP to Domain)

ip 주소로 접근하면 domain으로 redirection할 수 있도록 하는 설정이다.

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

nginx 설정 파일로 이동한다.

server {
    listen 80;
	server_name [AWS EC2 IPv4 외부 IP 입력];
        return 301 [도메인 입력]$request_uri; 
}

설정 파일의 가장 아래에 위의 코드 블록을 추가한다.

$ sudo service nginx restart

변경된 설정 적용을 위해 nginx를 재시작한다.

return 301 : ip 주소로 접근하면 return 301 응답으로 도메인으로 이동된다. 301 응답은 영구적인 URL 리다이렉션을 의미한다.


ip 주소로 접근했을 때 도메인으로 리다이렉트 되다면 성공!
본 포스팅의 과제를 모두 끝낸 것이다!!

❗️추가 공부 : nginx 웹서버 라우팅에 대한 더 세부적인 이해 by 스위프트




✅ Reference

HTTPS를 위한 let's encrypt 무료 인증서 적용하기 by jinmay
Certbot 사용자 안내서 번역 by 멍
RAM과 ROM의 차이 by crucial.kr
커널과 쉘 by jinShine
데몬이란 무엇인가 by Simple
도메인과 서브 도메인 디자인 및 개발 by mobileflow
Nginx Sub Domain 추가하기 by pilot376

0개의 댓글