Nginx를 통해 서버에 요청을 해보자. (With NestJs)

이우길·2022년 12월 2일
1

infra

목록 보기
2/6
post-thumbnail

Nginx with NestJs

Goal

  • Nginx를 Web Server로 이용하여 NestJS와 연결해보기. (최대한 Linux 환경에서 테스트 하기 위해 Docker로 ubuntu를 실행시켜 환경 구축)

Docker로 ubuntu 실행

DockerHub에서 ubuntu 이미지를 받아서 실행시킨다. 도커 컨테이너를 생성하면서 해당 컨테이너에 접속할 수 있도록 옵션을 추가한다.

ubuntu 버전은 20.04를 기준으로 하였으며 -it 옵션을 준 이유는 해당 컨테이너가 실행되고 계속 돌 수 있도록 하기 위해서 이다. 자세한 건 (개발자가 처음 Docker 접할때 오는 멘붕 몇가지 참조)

마지막으로 80번 포트를 컨테이너 내부 80 포트와 바인딩 되어 Nginx가 정상적으로 설치되었는 지 확인하기 위해 -p 80:80 옵션을 부여해준다.

해당 컨테이너를 빠져나갈 때는 ctrl + p + q 명령어(컨테이너 종료하지 않고 빠져나오기) 로 빠져 나가면 ubuntu 컨테이너는 종료되지 않고 계속해서 실행된다. (exit로 나갈 경우 컨테이너 종료.)

docker run -p 80:80 -d -it --name ubuntu_test ubuntu:20.04

Ubuntu에 Nginx 설치

정상적으로 ubuntu 컨테이너에 접속을 하고 아래와 같은 명령어를 작성하면 Nginx가 설치된다.

sudo apt-get install nginx

하지만 항상 한번에 설치되는 법은 많지 않다. 나는 여기서 2가지의 문제를 만났다.

1. E: Unable to locate package xxx...

package의 레포지토리가 정상적으로 접근이 되지 않을 때 발생하는 Error이다. 그렇기 때문에 레포지토리를 업데이트 해주면 된다.

apt update

2. bash:command not found sudo

sudo package가 설치되어 있지 않아 발생하는 Error이다. 간단하게 sudo package를 설치해주면 된다.

apt-get install sudo

위 과정까지 완료 후 아래와 같은 명령어를 입력하면 Nginx가 정상적으로 설치된다. 설치를 하면서 TimeZone 설정을 물어본다. 나는 Asia/Seoul로 설정했다.


Nginx 접속해보기

위와 같이 정상적으로 Nginx를 설치하였다면 브라우저에 localhost라고 입력하면 아래와 같이 Nginx 화면이 나온다.


Master Process와 Worker Process

기본적으로 Nginx가 실행되게 되면 Master Process와 Worker Process가 생성된다. Master Process는 Worker Process를 관리하고 Worker Process는 실제로 Client의 요청을 처리한다.

즉 아래와 같은 그림 처럼 Client의 요청을 Master Process가 받아서 Worker Process에게 전달하고 Worker Process가 요청을 처리한 후 결과를 Client에게 전달한다.

worker_processes의 갯수는 nginx.confworker_processes auto; 라는 option을 볼 수 있는데 해당 option을 통해 Worker Process를 몇 개 생성할 것인지 정의할 수 있다.

보통 auto를 주게 되면 CPU의 코어 수 만큼 Worker Process가 생성된다.

Master Process와 Worker Process는 Tree 구조를 가지게 되며 아래와 같은 명령어를 입력하면 현재 Master Process와 Worker Process의 목록을 확인할 수 있다.

sudo ps aux --forest | grep nginx

# result
# sudo ps aux --forest | grep nginx
root       865  0.0  0.0  53248  1492 ?        Ss   15:04   0:00 nginx: master process nginx
www-data   866  0.0  0.0  53572  3316 ?        S    15:04   0:00  \_ nginx: worker process
www-data   867  0.0  0.0  53572  3316 ?        S    15:04   0:00  \_ nginx: worker process

Nginx의 기본 설정을 확인해보자.

Nginx를 설치하게 되면 기본적으로 /etc/nginx/nginx.conf 파일이 생성된다. 이 파일을 확인해보면 아래와 같은 내용이 있다. (nginx.conf의 위치를 찾아보려면 아래와 같은 명령어를 입력하여 확인할 수 있다.)

# 실행결과
# /etc/nginx/nginx.conf

sudo find / -name nginx.conf

Nginx로 들어오는 요청을 Nestjs로 전달하기. (서버에 Nestjs가 실행되고 있다고 가정)

unbuntu를 실행할 때 80번 포트를 열어주었기 때문에 80번 포트를 통해 들어오는 요청을 내부 3000번 포트로 전달해주는 설정을 하면 된다.

기본적인 nginx.conf의 Http 블록에는 아래와 같이 /etc/nginx/conf.d/*.conf 파일을 include 하고 있다.

해당 경로에 커스텀 한 설정을 하여 Nginx를 구성할 수 있다. 아래와 같이 nestjs.conf 파일을 생성하고 아래와 같이 설정을 추가하면 된다.

server {
  listen 80;
  server_name localhost;

  location / {
      proxy_pass http://localhost:3000/;
  }
}

위의 config 파일을 간단하게 보면 80번 포트로 들어오는 요청을 localhost:3000으로 전달해주는 설정이다.


Nginx 재시작 후 확인하기.

Nginx에 새로 생성한 커스텀한 설정을 반영하기 위해서는 Nginx를 재시작 해야한다. 우분투 버전에 따라 systemctl or service 명령어를 사용하여 Nginx를 재시작 할 수 있다.

# service
sudo service nginx restart

# systemctl
sudo systemctl restart nginx

재 시작이 완료되면 http://localhost로 접속하면 아래와 같이 Nestjs 기본 API가 호출되어 결과가 전될되는 것을 볼 수 있다.


정리

Docker를 이용하여 Nginx를 설치하고 Nestjs를 실행시켜 Nginx를 통해 Nestjs로 요청을 전달하는 과정을 정리해보았다.

EC2도 동일하겠지만 Docker를 이용하여 하나의 Linux안에서 Nginx의 포트만 외부에 열어주고 NestJs 서버는 외부에 열어주지 않았다. (현재 글에서는 ubuntu를 실행시킬 때 port option으로 처리)

이렇게 하면 WAS 서버가 외부에 노출되지 않고 Nginx를 통해서만 NestJs 서버에 접속을 할 수 있게 된다.

Reference

profile
leewoooo

0개의 댓글