Backend/[NGINX]

[NGINX] NIGINX 란 무엇일까? | NGINX 설치 (ubuntu)

민프야 2025. 3. 3. 22:58

1. NGINX란 무엇일까?

NGINX (pronounced "engine x" or "en-jin-eks") is the world's most popular Web Server, high performance Load Balancer, Reverse Proxy, API Gateway and Content Cache.
NGINX(발음: "엔진 x" 또는 "엔진엑스")는 세계에서 가장 인기 있는 웹 서버, 고성능 로드 밸런서, 리버스 프록시, API 게이트웨이 및 콘텐츠 캐시입니다.
- nginx 깃허브
nginx(엔진 엑스)는 웹 서버 소프트웨어로, 가벼움과 높은 성능을 목표로 한다. 웹 서버, 리버스 프록시 및 메일 프록시 기능을 포함한다.

Nginx는 요청에 응답하기 위해 비동기 이벤트 기반 구조를 가진다.
이것은 아파치 HTTP 서버의 스레드/프로세스 기반 구조를 가지는 것과는 대조적이다.
이러한 구조는 서버에 많은 부하가 생길 경우의 성능을 예측하기 쉽게 해준다.
- 위키백과

 

 

NGINX(엔진엑스)는 웹 서버이자 리버스 프록시(reverse proxy), 로드 밸런서(load balancer) 역할을 수행하는 오픈 소스 소프트웨어 입니다. 

 

특히 속도가 빠르고 가벼우며, 수많은 동시 접속을 처리할 수 있는 웹 서버로 유명하죠.

웹 서비스에서 웹 트래픽을 효과적으로 관리하고 부하를 분산하는 기능을 수행할 수 있어서, 전 세계적으로 수많은 대형 서비스(Netflix, Airbnb, GitHub 등)에서 사용하고 있습니다. 

 

2. NGINX의 주요기능

NGINX는 단순한 웹 서버가 아니라, 다양한 기능을 수행할 수 있습니다.

 

1. 웹 서버(Web Server)

  • NGINX는 Apache처럼 웹 서버 역할을 수행할 수 있어.
  • 정적 파일(HTML, CSS, JS, 이미지 등)을 빠르게 서빙할 수 있음.
  • 가벼운 구조 덕분에 고성능 HTTP 요청 처리가 가능함.

2. 리버스 프록시(Reverse Proxy)

  • 클라이언트 요청을 실제 서버(백엔드)로 전달하는 역할.
  • 예를 들어, NGINX가 앞단에서 요청을 받아서 Node.js, Spring, Django 등의 백엔드 서버로 전달할 수 있음.
  • 보안 강화, 로드 밸런싱, 캐싱 기능 제공.

3. 로드 밸런서(Load Balancer)

  • 여러 개의 서버(백엔드)로 트래픽을 분산시키는 역할.
  • 특정 서버에 부하가 집중되지 않도록 트래픽을 고르게 배분할 수 있음.
  • 고가용성(HA, High Availability)을 유지하는 데 필수적임.

4. 캐시 서버(Cache Server)

  • 정적 컨텐츠(HTML, CSS, JS 등)를 캐싱하여 성능을 향상시킬 수 있음.
  • 사용자가 같은 요청을 보낼 때 캐싱된 응답을 반환하여 서버 부하를 줄일 수 있음.

5. 보안 강화 (SSL/TLS 암호화, DDoS 방어)

  • HTTPS 적용을 위한 SSL/TLS 암호화(HTTPS 설정) 가능.
  • 특정 IP 차단, DDoS 공격 방어, HTTP 요청 필터링 등의 보안 기능을 제공.

즉, NGINX는 웹 서버뿐만 아니라, 리버스 프록시, 로드 밸런서, 캐시 서버 등의 역할을 수행하는 도구입니다.

3. NGINX 동작 방식

위키백과에 따르면 Nginx는 비동기 이벤트 기반 구조를 가지고 있고,
기존 웹 서버(Apache)의 스레드/프로세스 기반 구조를 가지는 것과는 대조적이라고 한다.

 

즉, 아파치는 '스레드 기반'모델을 사용함으로써 각 요청마다 쓰레드를 생성하여 처리하는 방식인데,

Nginx는 각 요청을 개별 프로세스가 아니라 하나의 이벤트로 처리하는 방식 입니다.

 

그럼 아파치의 동작과 Nginx의 동작과정을 비교해보자

 

Apache의 동작 방식

  1. 사용자가 요청(HTTP 요청)을 보내면 새로운 프로세스(또는 쓰레드)를 생성함.
  2. 요청이 많아질수록 각 요청마다 새로운 쓰레드를 생성함.

NGINX의 동작 방식

  1. 마스터 프로세스(Master Process)가 실행됨 → 설정 파일(nginx.conf)을 읽고 워커 프로세스를 관리함.
  2. 여러 개의 워커 프로세스(Worker Process)가 생성됨 → 실질적으로 요청을 처리하는 역할을 함.
  3. 클라이언트(사용자)가 요청을 보내면, 각 워커 프로세스가 이벤트 방식으로 요청을 처리함.
  4. 한 번의 워커 프로세스가 여러 요청을 동시에 처리할 수 있음.

쉽게 비유를 통해서 설명하자면

Apache는 '택시'

NGINX는 '버스' 라고 생각하면 쉬울 것 같다.

 

NGINX는 아래와 같이 2가지 프로세스 구조를 가지고 있습니다.

 

마스터 프로세스 (Master Process)

  • 설정 파일(/etc/nginx/nginx.conf)을 로드하고, 워커 프로세스를 관리함.
  • 직접 요청을 처리하지 않고, 워커 프로세스를 생성하고 관리하는 역할을 함.

워커 프로세스 (Worker Processes)

  • 실질적으로 클라이언트의 요청을 처리하는 프로세스.
  • 한 개의 워커 프로세스가 여러 개의 요청을 비동기적으로 처리할 수 있음.
  • CPU 코어 개수에 따라 여러 개의 워커 프로세스를 생성할 수 있음.

systemctl nginx status를 입력해보면 현재 동작하고있는 master process, Worker process를 볼 수 있습니다.

저의 nginx는 defalut값으로 1개의 master process와 1개의 worker process를 사용하고 있습니다. 

 

여기에서 worker process 숫자를 변경하고 싶다면 nginx.conf를 변경하면 됩니다. 

 

    vi /etc/nginx/nginx.conf

 

conf에다가 worker_processes를 추가/수정하고 nginx를 restart 해주면 적용된다. 

 

워커가 2개로 늘어난 것을 확인할 수 있다. 

 

woker prcesses와 master processes를 알았으니 이제 본격적으로 설치를 해보자

4. NGINX 설치과정 (ubuntu 기준)

4.1 NGINX 설치 (ubuntu 기준)

    sudo apt update
    sudo apt install nginx -y

 

4.2 NGINX 상태 확인 및 실행

    nginx -v # NGINX 버전 확인
    sudo systemctl status nginx  # NGINX 상태 확인
    sudo systemctl start nginx   # NGINX 시작
    sudo systemctl stop nginx    # NGINX 중지
    sudo systemctl restart nginx # NGINX 재시작

 

4.3 방화벽 설정 (선택, *주의*)

ufw 방화벽을 실행중인 경우 Nginx에서 프로필을 허용해야한다.

아래와 같이 구성되어있다.

    Nginx Full – This opens both port 80 & 443 (For SSL / TLS encryption).
    Nginx HTTP – This open only port 80 ( For unencrypted web traffic).
    Nginx HTTPS – Opens only port 443 (For SSL / TLS encryption).

 

    sudo ufw enable               # 방화벽 활성화
    sudo ufw allow 'Nginx Full'  # NGINX의 HTTP/HTTPS 트래픽 허용
    
    *여기에서 종료하면 큰일납니다. 아래 커맨드를 입력해주세요.*
    sudo ufw allow ssh #이걸 해주셔야 SSH 접속 가능합니다. 
    sudo ufw allow mysql #이걸 해주셔야 mysql 접속 가능합니다.
    
    
    sudo ufw reload # 방화벽 변경사항 리로드
    sudo ufw status # 방화벽 상태확인

 

잘 적용이 된 것을 확인할 수 있다.

 

5. NGINX 설정 변경  (로드밸런서,  리버스 프록시)

Nginx 관련한 디렉토리 경로는 기본적으로 /etc/nginx이고, 파일 구조는 아래와 같습니다.

 

파일마다 역할하는 부분은 개발자마다 다른 것 같습니다.

저는 nginx.conf 에다가 모든 코드를 몰아넣는 것 보다는 추가 설정파일을 불러오는 방식을 사용합니다. 

예를 들면 아래와 같습니다. 

    http {
        include /etc/nginx/conf.d/*.conf;  # conf.d 안의 모든 .conf 파일 포함
        include /etc/nginx/sites-enabled/*;  # sites-enabled 안의 모든 설정 포함
    }

 

    /etc/nginx/
    │── nginx.conf              # 🔹 전체 NGINX 전역 설정 파일
    │── sites-available/        # 🔹 개별 사이트 설정 저장
    │── sites-enabled/          # 🔹 활성화된 사이트 설정 (심볼릭 링크를 통해 nginx에 반영)
    │── conf.d/                 # 🔹 추가 설정 파일 저장 (공통 설정, 로드 밸런서, 리버스 프록시 설정 가능)
    │── modules-enabled/        # 🔹 활성화된 모듈 저장
    │── snippets/               # 🔹 재사용 가능한 설정 파일 저장 (SSL 설정 등)
    │── proxy_params            # 🔹 리버스 프록시 기본 설정
    │── mime.types              # 🔹 파일 확장자별 MIME 타입 설정
    │── fastcgi_params          # 🔹 PHP-FPM 같은 FastCGI 설정 저장
    │── /var/log/nginx/         # 🔹 NGINX 로그 파일 저장 위치
    │   ├── access.log          #   🔹 모든 요청 기록 (웹 서버 접근 로그)
    │   ├── error.log           #   🔹 오류 발생 기록 (오류 로그)

 

 

위 구조에서 저는 conf.d에다가 로드 밸런서, 리버스 프록시 설정을 넣어놨는데
이건 같은 서버에서 관리되므로 하나의 NGINX 설정 파일에서 관리하는게 나을 것 같아서 그렇게 정의했습니다.

예를 들어서)
하나의 서버에 포트번호만 다르게해서

dev(3000), prod(4000) 서버를 분리하는 것 과 같습니다.

 

설정 파일과 관련 한 내용은 길어질 것 같아서 다음 포스팅에서 계속 진행하겠습니다.

 

 


참고링크

https://github.com/nginx/nginx

 

GitHub - nginx/nginx: The official NGINX Open Source repository.

The official NGINX Open Source repository. Contribute to nginx/nginx development by creating an account on GitHub.

github.com

https://ko.wikipedia.org/wiki/Nginx

 

nginx - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

https://nginx.org/

 

nginx

nginx nginx ("engine x") is an HTTP web server, reverse proxy, content cache, load balancer, TCP/UDP proxy server, and mail proxy server. Originally written by Igor Sysoev and distributed under the 2-clause BSD License. Enterprise distributions, commercial

nginx.org

https://velog.io/@xangj0ng/Linux-Ubuntu-Nginx-%EC%84%A4%EC%B9%98

 

[Linux] Ubuntu Nginx 설치

nginx란? 래픽이 많은 웹사이트의 서버(WAS)를 도와주는 비동기 이벤트 기반구조의 경량화 웹 서버 프로그램이다. 클라이언트로부터 요청을 받았을 때 요청에 맞는 정적 파일을 응답해주는 HTTP Web

velog.io