개발 삽질 일지

[Linux] Nginx 본문

반응형
반응형

이번 글에서는 실무에서 웹 서버로 가장 널리 쓰이는 Nginx(엔진엑스)의 개념과 역할을 소개합니다.
리눅스에서 프로젝트를 배포하고 운영하려면 꼭 알아야 하는 핵심 도구입니다.

 

Nginx란 무엇인가?

 

Nginx는 웹 서버이자 리버스 프록시입니다. 간단히 말하면, “브라우저의 요청을 받아서, 내부 애플리케이션 서버로 안전하고 빠르게 전달해주는 중간 관리자”입니다.


 

왜 Nginx인가?

 

Nginx는 2004년 러시아 개발자 Igor Sysoev가 높은 동시 접속 처리 성능을 목표로 만든 웹 서버입니다.

초창기 웹 서버 시장은 Apache가 독점하고 있었지만, Nginx는 이벤트 기반(Event-driven) 아키텍처를 채택해 더 가볍고 빠르다는 평가를 받으며 급속히 성장했습니다.


Apache vs Nginx 비교

항목 Apache Ngnix
아키텍처 프로세스/스레드 기반 이벤트 기반 (비동기 I/O)
성능 동시 접속자 수 많으면 무거움 가볍고 빠름
정적 파일 처리 상대적으로 느림 매우 빠름
설정 유연성 .htaccess 등 다양한 방식 지원 설정 파일 중심 
리버스 프록시 기능 상대적으로 약함 핵심 기능으로 탑재

 

많은 트래픽, 빠른 응답, 정적 파일 서빙, 리버스 프록시가 중요한 환경에서는 Nginx가 매우 유리합니다. 현재 대부분의 배포는 Nginx에서 되고 있다고 보셔도 무방합니다.


 

Nginx가 하는 일 요약

 

요청 수신 80번 포트 등으로 들어오는 HTTP 요청을 받아줍니다.
리버스 프록시 요청을 Uvicorn/Gunicorn 같은 앱 서버로 넘겨줍니다.
정적 파일 서빙 CSS, JS, 이미지 등을 직접 처리해줍니다.
보안 설정 SSL 인증서 적용(HTTPS 가능)이 가능합니다
성능 최적화 gzip 압축, keep-alive 등 성능 향상이 가능합니다.
로드밸런싱 (선택) 여러 서버로 트래픽 분산도 가능합니다.

 

실제 배포 구조

[ 사용자 브라우저 ]
        ↓ 요청
     Nginx (80/443 포트)
        ↓
  Uvicorn / Gunicorn (8000 포트 등)
        ↓
     Django / FastAPI 등 백엔드 서버

 

Nginx는 앞단에 위치한 입구 관리자(Gateway) 역할을 하며,
정적 파일은 직접 처리하고, 나머지 요청은 내부 애플리케이션 서버로 안전하게 넘깁니다.


 

디렉토리 구조 이해

 

Nginx 설정 파일은 다음과 같은 구조를 가집니다:

/etc/nginx/
├── nginx.conf                 # 메인 설정 파일 (공통 설정 포함)
├── sites-available/          # 서비스별 설정 파일 보관소
│   └── myproject             # 내가 만든 설정
├── sites-enabled/            # 실제 적용되는 설정 목록 (링크)
│   └── myproject → ../sites-available/myproject

 

nginx.conf는 기본 틀 + 공통 설정만 담는 메인 파일입니다.

/etc/nginx/nginx.conf Nginx 전체 설정의 뼈대. 공통 설정 + include
/etc/nginx/sites-available/ 실제 각 서비스에 대한 개별 설정을 정의
/etc/nginx/sites-enabled/ 적용할 설정만 링크해서 사용 (nginx.conf가 여기 포함함)

 

설정 적용 방식

 

설정은 sites-available/에 만들고, ln -s로 sites-enabled/에 링크를 걸어야 적용됩니다.

sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

 

myproject 설정 예시 살펴보기

 

/etc/nginx/sites-available/myproject 파일은 다음과 같이 구성되어 있습니다:

server {
    listen 80;
    server_name domain.com;

    charset utf-8;
    client_max_body_size 600M;

    location /static/ {
        alias /home/ubuntu/staticfiles/;
        expires 30d;
        access_log off;
    }

    location ^~ /some_api/ {
        proxy_pass http://127.0.0.1:8000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_buffering off;
    }

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_read_timeout 300s;
    }
}

 

설정 요소 분석

listen 80; 80번 포트로 들어오는 HTTP 요청을 받습니다.
server_name domain.com; 연결할 도메인 이름입니다. 
location /static/ 정적 파일(CSS, JS 등)은 직접 Nginx가 처리합니다
location /some_api/ /some_api/ 으로 시작하는 요청은 내부 서버(포트 8000)로 프록시 전달됩니다.
location / 나머지 모든 요청도 내부 서버(포트 8000)로 전달됩니다.

 

 

이번 글에서는 Nginx가 어떤 역할을 하는지, 그리고 실제로 어떻게 설정하고 사용하는지를 알아보았습니다.
웹 서비스의 입구 역할을 하는 Nginx는, 빠른 정적 파일 처리부터 내부 서버와의 연결까지 역할을 합니다.

그러나 Nginx 혼자서 웹 서비스를 완성하지 않습니다.

 

그 뒤편에는 실제 애플리케이션 서버인 Uvicorn, Gunicorn 등이 동작하고 있어야 하고, 이들과 함께 구성을 해야 하나의 웹 서버 환경이 완성됩니다. 그래서..

 

다음 글 안내

👉 다음 글에서는 asgi 환경을 위한 uvicorn 설정 방법과, 이를 통한 Django 배포에 대해 다룹니다.

 

[Linux] Uvicorn

Uvicorn이란? Uvicorn은 ASGI 서버입니다.ASGI(Asynchronous Server Gateway Interface)는 WSGI의 다음 세대로, 비동기 처리를 지원합니다. 즉, FastAPI, Django Channels, 최신 웹 프레임워크를 사용할 때는 ASGI 기반의 서버

gnaaak.tistory.com

 

 

 

 

 

 

 

반응형