devops

Nginx와 친해지기

ri5 2023. 3. 8. 00:13

Nginx란?

  • 정적 파일을 서비스 해주는 경량 서버
  • static 한 파일(javascript, html, css, image)

WebServer& API Gateway

WebServer

  • 클라이언트가 전달한 HTTP 요청에 따라 그에 대한 응답을 해주는 서버
  • url 요청에 따라 정적파일을 제공한다.

API Gateway

  • 클라이언트와 서버사이에서 중개자, 즉 대문 역활을 한다.
  • 리버스 프록시, 로드밸런싱, SSL 보안, 접근 제한등의 역활을 함

Nginx는 Webserver 역활도 하지만 API Gateway 역활을 할 수 있다.

Nginx 컨테이너 띄우기

1. Docker로 Nginx 이미지 내려받기

docker pull nginx:1.23

2. 테스트용 정적 html을 생성

<!-- nginx-test/index.html -->
<h1>Hello World</h1>

3. nginx 컨테이너 띄우기

docker run -d --name nginx -p 80:80 -v $PWD/nginx:/home/nginx-test -it nginx:1.23
  • $PWD: Pring Working Directory를 줄인 말로 리눅스 명령어와 동일하게 현재 디렉토리를 가져온다.
  • -v : 도커에서 볼륨은 컨테이너 내부 폴더와 컨테이너 외부 폴더를 연결하는 것이다. 로컬폴더와 내부 폴더는 격리되어 있으나 볼륨을 이용해 연결시킬 수 있다. (사용법: -v local 경로:docker 내부 경로)

Nginx 설정

Nginx의 주요 설정 파일은 /etc/nginx/nginx.conf 이다. 하지만 활용할 때에는 /etc/nginx/conf.d/ 디렉토리에 설정파일을 추가하여 활용하는데 이유는 아래와 같다.

  • 주요 설정 파일에 모든 설정을 직접 적는 것은 복잡하고, 유지 보수하기 어려울 수 있다.
  • 공통된 설정은 분리하여 각각의 파일로 서버 블록, 로케이션 블록, HTTP 블록 등과 같은 서로 다른 구성 요소를 구성할 수 있다.
  • 여러 파일을 사용하면 여러 개의 서버 블록 및 위치 블록을 각각 개별적으로 구성할 수 있어 nginx의 유연성과 확장성을 높일 수 있다.

1. Nginx 컨테이너 접속

docker exec -it nginx bash

2. 기본 설정 파일 변경

server {
    listen 80;

    location / {
        root /home/jscode;
        index index.html;
        try_files $uri /index.html;
    }
}
  • server: 가상 호스트 server_name의 url이 온다면 server 블록으로 이동
  • listen: nginx 데몬 포트 정의
  • location: 특정 url로 접근하면 어떤 rule를 따를건지에 대한 구체적인 동작 정의
  • root: nginx가 nginx가 정적 서비스를 하는데 필요한 파일들이 어느 위치에 있는지 알려주는 지시자
  • index: root: 위치에서 어떤 파일을 기본으로 설정할지 지정해주는 지시자
  • try_files: r지정된 파일 경로에서 파일을 찾아서 해당 파일이 존재하는 경우 해당 파일을 제공하거나 다음 위치로 이동합니다

리버스 프록시 구축하기

프록시 서버란

리버스 프록시(Reverse Proxy)란 일반적인 프록시와는 반대로, 인터넷 서버 측에서 클라이언트 측으로의 요청을 대신 받아 해당 요청을 처리하는 서버를 말합니다. 이를 통해 클라이언트 측에서는 실제 서버의 정보를 알지 못하며, 보안 측면에서도 안전합니다.
리버스 프록시는 대부분 웹 서비스에서 사용되며, 서비스의 로드 밸런싱, 캐싱, SSL 암호화 등의 기능을 수행할 수 있습니다. 또한, 단일 IP 주소로 여러 개의 서버를 운영할 수 있어 효율적인 서버 운영이 가능합니다.

포워드 프록시와 리버스 프록시

포워드 프록시

포워드 프록시 (출처 : https://www.cloudflare.com/ko-kr/learning/cdn/glossary/reverse-proxy/ )

포워드 프록시는 주로 인터넷 사용 제어, 캐싱, 로그 기록 등의 용도로 사용된다. 또한, 보안 측면에서도 웹 필터링, 악성 코드 차단 등의 기능을 수행할 수 있다. 대표적인 예시가 Vpn 서버를 예로 들 수 있다. 포워드 프록시를 사용한다면 아래와 같은 활용을 할 수 있다.

  • 접속 제한 회피: 정부, 기업, 학교등에서는 제한된 액세스를 제공하여 제한된 사이트의 접근을 할 수 있다.
  • 특정 콘텐츠 제한: 반대로 특정 사이트나 컨텐츠에 대해 포워드 프록시 서버를 통해서 제한 할 수 있다.
  • 캐싱 처리: 동일한 요청에 대해서는 캐싱된 응답을 전달할 수 있다.
  • IP 우회 및 보안: 포워드 프록시를 통해 서버에 접근하면서 클라이언트의 정보가 아닌 프록시 서버의 정보가 노출되어 안전하게 클라이언트 정보를 숨길 수 있다.

리버스 프록시

리버스 프록시 (출처 : https://www.cloudflare.com/ko-kr/learning/cdn/glossary/reverse-proxy/ )

리버스 프록시(Reverse Proxy)란 일반적인 프록시와는 반대로, 인터넷 서버 측에서 클라이언트 측으로의 요청을 대신 받아 해당 요청을 처리하는 서버를 말한다. 이를 통해 클라이언트 측에서는 실제 서버의 정보를 알지 못하며, 보안 측면에서도 안전하다. 리버스 프록시는 대부분 웹 서비스에서 사용되며, 서비스의 로드 밸런싱, 캐싱, SSL 암호화 등의 기능을 수행할 수 있다. 또한, 단일 IP 주소로 여러 개의 서버를 운영할 수 있어 효율적인 서버 운영이 가능하다.

1. 프론트 프로젝트 리버스 프록시 설정

도커 컴포즈 yml 파일

version: "3.5"

services:
  nginx:
    container_name: nginx_test
    image: nginx:1.23
    volumes:
      - ./docker/source/frontend/build:/home/front
      - ./docker/source/nginx:/etc/nginx/conf.d
    command: sh -c "nginx && tail -f /dev/null"
    ports:
      - 80:80

도커 컴포즈 동작

  • nginx 1.23 이미지를 기반으로 nginx_test라는 이름의 컨테이너를 띄운다.
  • 프론트엔드 프로젝트의 빌드된 /docker/source/frontend/build경로의 파일이
    nginx 컨테이너 내부에 /home/front에 마운트된다.
  • ./docker/source/nginx에 있는 nginx 설정파일을 /etc/nginx/conf.d에 마운트 한다.
  • nginx && tail -f /dev/null를 쉘스크립트로 실행시켜 컨테이너를 유지시킨다.
  • 컨테이너의 내부 포트와 외부 포트는 80으로 지정한다.

nginx default.conf 설정파일

server {
    listen 80;

    location / {
        root   /home/front;
        index  index.html;
        try_files $uri /index.html;
    }
}

2. 백엔드 프로젝트 도커 컴포즈 설정

2.1 백엔드 docker file 정의


FROM node:16-alpine

WORKDIR /home/backend

COPY source/backend .

ENTRYPOINT [ "npm", "run", "start" ]

WORKDIR: 명령문은 쉘(shell)의 cd 명령문처럼 컨테이너 상에서 작업 디텍토리로 전환을 위해서 사용한다.
COPY: 호스트 컴퓨터에 있는 디렉터리나 파일을 Docker 이미지의 파일 시스템으로 복사하기 위해서 사용된다.
ENTRYPOINT: 이미지 실행 시 항상 실행되야 하는 커맨드 설정

2.2 도커 이미지 빌드

docker build -t app_test:prod -f app_test.dockerfile

2.3 도커 컴포즈 파일 수정

version: "3.5"

services:
  app:
    container_name: app_test
    image: app_test:prod
    ports:
      - 3001:3001

  nginx:
    container_name: nginx_test
    image: nginx:1.23-alpine
    volumes:
      - ./docker/source/frontend/build:/home/front
      - ./docker/source/nginx:/etc/nginx/conf.d
    command: sh -c "nginx && tail -f /dev/null"
    ports:
      - 80:80

2.4 default.conf 파일 수정

upstream app {
    server app_test:3001;
}

server {
    listen 80;

    location /v1 {
        proxy_pass app;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location / {
        root   /home/front;
        index  index.html;
        try_files $uri /index.html;
    }
}

upstream: proxy_pass 지시자를 통해 nginx가 받은 리퀘스트를 넘겨 줄 서버들을 정의하는 지시자가 upstream입니다. 주로 로드밸런싱을 할 때 많이 사용되는 지시자이다.