구현 - Reverse Proxy Server

공부의 기록·2022년 8월 10일
0

Nginx

목록 보기
5/7
post-thumbnail

Intro

이 문서는 총 3 단계로 이루어진 구현 파트의 첫 번째에 해당합니다.

Target

이 문서에서는 80번 포트로 들어온 요청을 3000번(사용자 지정) 포트로 넘겨주는 것을 해볼 생각입니다.

Prerequisites

Nginx 로 Reverse Proxy Server 구현하기 실습이 원활하게 진행 되기 위해서, 다음 항목을 체크해주세요.

  1. 나는 EC2 Instance 를 사용해 본 경험이 있다.
  2. 나는 AWS 보안그룹 규칙 을 설정해 본 경험이 있다.
  3. 나는 Nginx 가 무엇이며 지금 하려는 것이 무엇인지 알고 있다.

해당 부분에 대한 기본적인 개념이 있으시다면, 이번 프로젝트를 진행하시는 데 큰 어려움이 없을 거라고 생각합니다.

잠깐!
Reverse Proxy Server 에 대해서 모르신다면 이 포스트 를 참고해주세요!

잠깐!
실습을 위해서 EC2 Instance 또는 AWS 보안 그룹 사전 설정 을 이 포스트 를 참고해서 꼭 진행해 주세요.
해당 설정이 이루어지지 않으면 원활한 실습 진행이 불가능할 수도 있습니다.

Get Started

이번 실습은 ubuntu 22.04 에서 이루어지고 있습니다.

자세한 내용은 다음 프로젝트의 저장소 링크 를 클릭하셔서 ### ✔ 작업 절차 를 참고해주세요.

🎉 Nginx

다음의 명령어를 입력하면, 커맨드의 실행 주체가 ubuntu 에서 root, 관리자 로 변경됩니다.

sudo -s

다음의 명령어를 입력하면, 현재 운영 체제에서 사용 가능한 패키지들과 그 버전들에 대한 정보를 최신 버전으로 갱신해줍니다.

sudo apt-get update

다음의 명령어를 입력해서, nginx 를 설치할 수 있으며 기본 설정 파일이 제공 됩니다.

sudo apt-get install nginx

최종적으로 다음의 명령어를 통해서 nginx 를 제어할 수 있습니다.

명령어기능
sudo nginx -t/etc/nginx/nginx.conf 파일이 정규 문법을 맞춰서 작성되었는 지, 테스트합니다.
sudo service nginx start/etc/nginx/nginx.conf 를 기반으로 nginx 의 server 를 실행시킵니다.
sudo service nginx stopnginx 의 server 를 종료시킵니다.
sudo service nginx restartnginx 의 server 를 종료 후 실행 시킵니다.
sudo service nginx reloadnginx 의 server 를 실행을 유지한 채, 설정 파일 값만 새로 고침 해서 반영 시킵니다.

현재 단계에서는 다음의 명령어를 입력해서, nginx 를 실행해주세요.

sudo service nginx start

실행이 완료되면, EC2 인스턴스 의 Public IPv4 경로로 접근했을 떄, 다음과 같은 기본 페이지가 노출 될 것입니다.

해당 코드가 실행되는 위치를 확인해보고 싶으시면, 다음의 두 파일을 확인하시면 연결 고리를 확인할 수 있습니다.

  1. /etc/nginx/nginx.conf 에서 include /etc/nginx/sites-available/* 라는 구문이 있을 것입니다. 해당 구문이 해당 파일 안에 작성되어 있는 /etc/nginx/sites-available/default 파일을 실행 시킵니다.
  2. /etc/nginx/sites-available/default 를 열어보면 기본적으로 작성되어 있는 코드가 EC2 인스턴스/var/www/html/* 경로에 있는 (html, htm, ... ) 파일을 열어서 반환 해주고 있습니다.

🎉 Nginx Reverse Proxy 설정

저는 이 부분이 약간 혼란스러웠는데, 구글링 해서 나오는 포스트 들에는 nginx.conf 안에 모든 코드가 작성되어 있었지만, ubuntu 22.04 에서 최신 버전의 nginx 를 설정하면 다음과 같이 include 문법으로 파일이 분리 되어 있습니다.

  1. /etc/nginx/nginx.conf nginx 설정 파일
  2. /etc/nginx/sites-available nginx 서버 파일
  3. /etc/nginx/sites-enabled 심볼릭 링크(후술) 로 가져올 nginx 서버 파일 이 위치되는 공간
  4. /var/www/html nginx 정적 파일(*.html, ...)

해당 방법이 Nginx DOCS 에서 권장하고 있는 방식이기 때문에 이를 준수해서 파일을 수정하도록 하겠습니다.

다음의 명령어를 입력하면, ubuntu 의 최신 문서 편집기 중 하나인 nano 를 실행 할 수 있습니다.

sudo nano /etc/nginx/sites-enabled/도메인-주소

잠깐!
지금 작성 할 파일은 서버 파일입니다. 해당 파일을 도메인-주소 로 만드는 것은 해외 여러 튜토리얼 등에서 사용하고 있는 관행 처럼 보입니다. 다만, 현재 단계에서 도메인-주소가 없는 경우 라면 본인이 알아 볼 수 있는 파일명으로 작성해주시면 됩니다.

잠깐!
비슷한 문서 편집기 중의 하나는 vi 가 있습니다. 깊은 영역까지 사용하지 않는 다는 전제라면, nano 가 제공해주는 지원되는 명령어 미리보기 기능이 GUI 처럼 제공되고 있기 떄문에, 조금 더 편하게 사용할 수 있지 않을까? 생각해봅니다.

위 명령어를 입력하면, 화면 전체가 텅 비고 문서 편집이 가능한 상태가 되는 것을 쉽게 눈치채실 수 있을 겁니다.

문서 편집기에서 다음의 명령어를 입력해 주세요.

server {

	listen 80;										# Public IPv4 80 번 포트에서 불러지게 됩니다.
    listen [::]:80;  								# Public IPv6 80 번 포트에서 불러지게 됩니다.

    access_log /var/log/nginx/reverse-access.log;	# (선택), 로그가 해당 경로의 파일에 남게 됩니다
	error_log /var/log/nginx/reverse-error.log; 	# (선택), 로그가 해당 경로의 파일에 남게 됩니다.

	location / {
    	proxy_pass http://127.0.0.1:3000;			# 80 포트에서 들어 온 요청을 3000번 포트로 넘겨주게 됩니다.
  	}
  
}

실습을 위한 nginx 서버 파일 작성 후, 다음의 명령어를 입력해 주세요.

sudo ln -s /etc/nginx/sites-available/도메인-주소 /etc/nginx/sites-enabled/도메인-주소

잠깐!
도메인-주소 가 없어서, nginx 서버 파일 명을 다른 이름으로 지으셨다면, 위 도메인-주소 모두 다른 이름으로 변경해주시면 됩니다.

nginx 설정 파일을 수정 하였으므로, 해당 파일에 오류가 없는 지 확인해야 합니다.

다음의 명령어를 입력하면, nginx 설정 파일 간에 구문 오류 등이 없는 지 확인할 수 있습니다.

sudo nginx -t

nginx 테스트가 성공적으로 완료 되면, 기존에 존재하는 default 서버 블록을 열어볼 생각입니다.

다음의 명령어를 입력해서, default 서버 블록을 열어 보면 각각 어떤 기능을 하는 코드인 지 감이 오실 거라고 생각합니다.

sudo cat /etc/nginx/sites-available/default

위 명령어를 입력하면, 코드 중에 보이는 80 번 포트에서 실행 한다는 구문이 있습니다.

server {
	
    listen 80;
    listen [::]:80;
    
    # 그 외의 코드들
    
}

해당 부분이 nginx 실행 간에 혼선을 만들 수 있을 것이라고 생각 하기 때문에, 다음의 조치를 할 생각입니다. (선택 사항)

  1. sudo rm /etc/nginx/sites-available/default 파일을 삭제
  2. sudo nginx -t 테스트 ( 서버 블록이 사라졌으므로, 실패 해야 합니다 )
  3. sudo nano /etc/nginx/nginx.conf 파일을 수정

위 3번 명령어를 입력하신 후에, 아래의 파일처럼 수정해주세요.
# 기존의 코드 : 부분은 설명을 위해서 주석 처리를 해둔 것이기 때문에, 삭제를 하셔도 됩니다.

# 기존의 코드 : include /etc/nginx/sites-available/*
include /etc/nginx/sites-available/도메인-주소

해당 부분을 수정하고 나서, sudo service -t 를 해보면 테스트가 통과하는 것을 볼 수 있습니다.

🎉 Node, Git 준비하기

다음의 명령어를 통해서 node 16 버전의 설치 가이드 라인과 git bash 을 다운로드 받아 주세요.

해당 명령어 입력 이후에 git 은 바로 사용이 가능하지만, node 는 16 버전의 설치 가이드라인 만 받은 것에 불과하기 때문에, 사용이 불가능한 상태입니다

curl -s https://deb.nodesource.com/setup_16.x | sudo bash

잠깐!
curl 은 인터넷 상에 존재하는 다양한 통신 프로토콜, HTTP, HTTPS, FTP, IMAP, POP3 등에 맞게 요청을 보내고 값을 반환 받을 수 있는 소프트웨어 입니다. 조금 더 자세한 내용이 궁금하시다면, HTTP 와 curl 에 대해서 다루고 있는 이 포스트 를 참고해주세요.

잠깐!
curl 옆에 붙어 있는 -s 는 --silent 의 약자로 해당 명령어의 실행 결과를 가려주는 명령어 입니다.
Windows, Mac, Linux 등

따라서 다음의 명령어를 입력해서 nodejs 를 설치하시면 됩니다.

주의할 점은 해당 작업이 모두 root, 관리자 권한 에서 실행되어야 한다는 부분입니다.

sudo apt-get install -y nodejs

🎉 PM2 설치하기

터미널을 닫았을 때도 서버가 가동 중인 상태를 유지하기 위해서, 다음의 명령어를 입력해서 PM2 모듈을 글로벌 영역에 설치해주세요.

sudo npm install -g pm2

그리고 다음 명령어로 설치 여부를 확인할 수 있습니다.

sudo npm ls -g

⚡ 셋업 용 express 서버 준비하기

cd /home/ubuntu				# `/home/ubuntu` 로 이동하게 됩니다.
mkdir 프로젝트-명			# 해당 경로에 프로젝트-명 폴더를 만들게 됩니다.
cd /home/ubuntu/프로젝트-명  # `/home/ubuntu/프로젝트-명` 으로 이동하게 됩니다.
npm init -y
npm i express

위 명령어를 입력해서 기본 파일 셋업이 종료되었다면, 다음의 명령어를 입력해주세요.

sudo nano app.js

아래 내용을 작성해주세요.

const express = require('express');
const app = express();

app.all('*', (req, res) => res.json('Connect between Nginx and Express'));

app.listen(3000, () => console.log('Server is running on 3000 PORT'));

이제 sudo node app.js 를 입력해서, 서버가 정상적으로 작동되는 것을 보면 Ctrl+C 를 눌러서 바로 서버를 종료해주시고 sudo pm2 start app.js 를 통해서 서버를 실행시켜 주세요.

🎈 축하드립니다

이제 EC2 인스턴스 의 Public IPv4 를 주소창에 입력하면 Express 서버가 나오는 것을 볼 수 있습니다.

사실, 해당 부분까지만 하고 멈춘다면 Iptables 의 포트 포워딩으로 80 -> 3000 으로 바꾸는 것이 더욱 편리할 것입니다.

이 튜토리얼은 다음을 위한 초석 임을 이해하시고 맛있는 커피 한 잔 하시고 다음 단계로 넘어가시면 될 것 같습니다.

  • HTTPS 서버 구동을 위한 TSL/SSL 인증 활성화 (준비 중)
  • Load Balancing 을 통한 EC2 인스턴스 성능 최대한 활용하기 (준비 중)
profile
2022년 12월 9일 부터 노션 페이지에서 작성을 이어가고 있습니다.

0개의 댓글