Nginx를 설치 및 사용방법

Nginx를 설치 및 사용방법

Python
Docker Compose
Web
DevOps
Nginx를 설치 및 사용방법
Author

gabriel yang

Published

October 9, 2024


Nginx란 무엇인가요?

Nginx는 웹 서버 및 리버스 프록시 서버로, 높은 성능과 효율성을 제공하기 때문에 널리 사용됩니다. 아래는 Nginx를 사용하는 주요 이유입니다:

  1. 고성능: Nginx는 비동기 방식의 이벤트 기반 아키텍처를 사용하여, 많은 요청을 효율적으로 처리할 수 있습니다. 따라서 동시에 많은 클라이언트 요청을 처리하는 데 유리합니다.
  2. 리버스 프록시: Nginx는 리버스 프록시 역할을 할 수 있어, 외부에서 오는 요청을 내부 서버로 전달하는 중개자 역할을 합니다. 이를 통해 보안, 로드 밸런싱, 캐싱 등의 이점을 누릴 수 있습니다.
  3. 로드 밸런싱: 여러 서버에 요청을 분산시켜, 트래픽을 고르게 나눔으로써 서버 과부하를 방지합니다.
  4. 정적 파일 처리: Nginx는 정적 콘텐츠(HTML, CSS, JavaScript 파일 등)를 매우 빠르게 처리할 수 있어, 웹사이트 성능을 향상시킵니다.
  5. SSL Termination: HTTPS 트래픽을 처리하고 암호화를 해제하는 역할을 하여, 내부 서버는 암호화되지 않은 트래픽을 처리할 수 있게 합니다.

Nginx의 아키텍처 Overview 다이어그램

Nginx가 리버스 프록시 서버로 동작하는 기본적인 다이어그램을 통해 그 흐름을 이해해 보겠습니다.

+---------+        +-----------+        +------------+
| Client  |  --->  |   Nginx    |  --->  |   Backend  |
|         |        | (Reverse  |        |  Servers   |
+---------+        |  Proxy)   |        +------------+
                   +-----------+
  • Client: 웹사이트 사용자. 브라우저 또는 애플리케이션에서 요청을 보냅니다.
  • Nginx: 리버스 프록시 서버로서 클라이언트의 요청을 받아 백엔드 서버에 전달합니다.
  • Backend Servers: 애플리케이션 서버 또는 데이터베이스 서버. Nginx로부터 전달받은 요청을 처리합니다.

Nginx를 설치 및 사용하기

Nginx를 설치하고 리버스 프록시로 설정하는 방법을 살펴보겠습니다.

1. Nginx 설치

sudo apt update
sudo apt install nginx

설치가 완료되면 Nginx 서버가 실행 중인지 확인합니다.

sudo systemctl status nginx

2. Nginx 설정 파일 수정

Nginx의 설정 파일은 /etc/nginx/nginx.conf 또는 /etc/nginx/sites-available/default에 위치합니다. 예를 들어, 백엔드 애플리케이션이 5000번 포트에서 동작하고 있을 때, Nginx가 리버스 프록시로 동작하도록 설정할 수 있습니다.

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
  • listen 80: 80번 포트에서 HTTP 요청을 받습니다.
  • proxy_pass: 클라이언트의 요청을 백엔드 서버(예: 127.0.0.1:5000)로 전달합니다.
  • proxy_set_header: 클라이언트의 정보를 백엔드 서버에 전달합니다.

3. Nginx 설정 테스트 및 재시작

설정 파일을 수정한 후에는 구문 오류가 없는지 테스트합니다.

sudo nginx -t

문제가 없으면 Nginx를 재시작하여 설정을 적용합니다.

sudo systemctl restart nginx

4. HTTPS 설정 (SSL 인증서 적용)

HTTPS 트래픽을 처리하기 위해서는 SSL 인증서를 적용해야 합니다. certbot과 같은 도구를 사용하여 Let’s Encrypt 인증서를 설치할 수 있습니다.

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com

Docker Compose로 설치 및 사용하기

Docker Compose를 사용하여 Nginx와 Flask를 함께 실행하는 방법을 설명하겠습니다. 이 설정은 Flask 애플리케이션을 Nginx 리버스 프록시를 통해 배포하는 일반적인 방법입니다.

1. 프로젝트 구조

우선, Docker Compose 파일과 Flask, Nginx 설정 파일을 포함한 디렉터리 구조를 구성해야 합니다.

/my_project
│
├── docker-compose.yml
├── nginx/
│   └── nginx.conf
├── app/
│   ├── Dockerfile
│   ├── app.py
│   └── requirements.txt

2. Flask 애플리케이션 설정

app/app.py (Flask 애플리케이션)

from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return "Hello, Nginx with Flask!"

if __name__ == "__main__":
    app.run(host='0.0.0.0')

app/requirements.txt

Flask==2.0.1

app/Dockerfile (Flask용 Dockerfile)

# Python 기반 이미지
FROM python:3.9-slim

# 작업 디렉토리 설정
WORKDIR /app

# 종속성 파일 복사
COPY requirements.txt requirements.txt

# 종속성 설치
RUN pip install -r requirements.txt

# Flask 애플리케이션 복사
COPY . .

# Flask 앱 실행
CMD ["python", "app.py"]

3. Nginx 설정

nginx/nginx.conf

server {
    listen 80;

    server_name localhost;

    location / {
        proxy_pass http://flask:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

이 Nginx 설정 파일은 기본적으로 Nginx가 80번 포트에서 들어오는 요청을 받아 Flask 컨테이너의 5000번 포트로 전달하도록 구성됩니다.

4. Docker Compose 설정

docker-compose.yml

version: '3'
services:
  flask:
    build: ./app
    container_name: flask_app
    expose:
      - "5000"
    networks:
      - app-network

  nginx:
    image: nginx:latest
    container_name: nginx_server
    ports:
      - "80:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - flask
    networks:
      - app-network

networks:
  app-network:
    driver: bridge
  • flask 서비스: Flask 애플리케이션을 빌드하고 실행하는 서비스입니다. expose는 Nginx가 Flask 컨테이너에 접근할 수 있도록 5000번 포트를 노출합니다.
  • nginx 서비스: Nginx 컨테이너로서, 호스트의 80번 포트를 컨테이너의 80번 포트와 연결합니다. Nginx 설정 파일은 호스트의 nginx/nginx.conf 파일을 컨테이너 내부에 복사합니다.
  • networks: 두 컨테이너가 통신할 수 있도록 동일한 네트워크(app-network)에 연결됩니다.

5. Docker Compose 실행

모든 파일을 설정한 후, Docker Compose를 사용하여 Nginx와 Flask 컨테이너를 실행할 수 있습니다.

docker-compose up --build

이 명령은 Flask 애플리케이션과 Nginx 서버를 모두 시작합니다.

  • Nginx는 80번 포트에서 HTTP 요청을 받고, 이 요청을 Flask 컨테이너의 5000번 포트로 전달합니다.
  • 웹 브라우저에서 http://localhost에 접속하면 Nginx를 통해 전달된 Flask 애플리케이션의 “Hello, Nginx with Flask!” 메시지를 확인할 수 있습니다.

6. 확인 및 문제 해결

  • docker-compose ps 명령어로 컨테이너 상태를 확인할 수 있습니다.
  • 로그는 docker-compose logs 명령어로 볼 수 있습니다.

결론

이 예시에서는 Docker Compose를 사용하여 Nginx와 Flask를 함께 실행하는 방법을 설명했습니다. Nginx는 리버스 프록시로 동작하여, 클라이언트의 요청을 Flask 애플리케이션으로 전달하며, 이는 실제 배포 환경에서 매우 유용한 구조입니다.