동시 접속 처리에 특화된 고성능 웹 서버이자 리버스 프록시 (Reverse Proxy) 서버

HTML, CSS, JavaScript, 이미지 같은 정적 콘텐츠 빠르게 제공
백엔드 (WAS) 까지 요청이 가지 않도록 앞단에서 차단하여 서버 부하를 줄임
클라이언트 요청을 받아 내부 백엔드 서버 (Tomcat, Node.js 등)로 전달하는 중개자 역할
백엔드 서버의 IP를 외부에 노출하지 않아 보안성이 높아짐
대규모 트래픽이 올 때 여러 대의 백엔드 서버로 부하를 균등하게 분산
특정 서버가 다운되어도 다른 서버로 요청을 보내 서비스가 중단되지 않게 함.
HTTPS 통신을 위한 암호화/복호화 처리를 NGINX가 대신 수행
무거운 암호화 연산을 NGINX가 전담하므로 백엔드 서버 부담이 줄어듬
자주 요청받는 데이터를 메모리나 디스크에 저장해두고 클라이언트에 즉시 반환
백엔드 서버의 반복 연산을 줄이고 응답 속도를 끌어올림
기존 웹 서버인 Apache (아파치)와 비교헀을 때, 아키텍처(구조)의 차이 존재
Apache : 프로세스/스레드 기반 처리 모델
event MPM 등을 통해 효율적인 방식으로 동작할 수 있기 때문에 "Apache = 요청 하나당 프로세스 하나"
Nginx : event-driven architecture 사용
많은 연결을 적은 수의 Worker가 이벤트 기반으로 처리
.htaccess : Apache는 .htaccess 설정 파일을 두어, httpd.conf 파일을 수정하지 않고도 전체 서버 재시작 없이 권한 제어나 URL rewrite 규칙을 개별 설정할 수 있지만, Nginx는 중아 nginx.conf파일에서만 관리되며 반드시 Nginx 프로세스를 Reload 해야함.
.htaccess
이는 웹 사이트 디렉터리 (ex./var/www/html/.htaccess)에 파일을 만들어 특정 디렉터리에 대한 설정을 적용 가능.
이는 공유 호스팅 (shared hosting)에서 편리하여, 사용자가 서버 전체 설정 권한을 가지고 있지 않아도 일부 설정 변경 가능
mod_php, mod_python 등 내장 모듈을 통해 서버 내부에서 PHP나 Python 코드를 직접 해석하고 실행할 수 있지만, Nginx는 외부 앱 서버로 요청을 넘겨주는 (FastCGI / Proxy) 방식만 가능.nginx.conf : Nginx 설정 파일
# =========================================================
# 1. Main (Global) Context
# =========================================================
user nginx; # Nginx Worker 프로세스를 실행할 OS 사용자
worker_processes auto; # 생성할 Worker 프로세스 수 (auto = CPU 코어 수)
error_log /var/log/nginx/error.log notice; # 에러 로그 저장 경로 및 출력 레벨
pid /var/run/nginx.pid; # Master 프로세스의 PID가 저장될 경로
# =========================================================
# 2. Events Context
# =========================================================
events {
worker_connections 1024; # Worker 프로세스 1개당 최대 동시 접속 수
# (총 최대 동시 접속 수 = worker_processes * worker_connections)
}
# =========================================================
# 3. HTTP Context
# =========================================================
http {
include /etc/nginx/mime.types; # 파일 확장자별 MIME 타입 매핑 정보 불러오기
default_type application/octet-stream; # 기본 파일 타입 지정
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main; # 접근 로그 경로
sendfile on; # OS의 sendfile()을 사용해 디스크I/O 감축 (파일 전송 속도 향상)
keepalive_timeout 65; # 클라이언트 연결을 유지할 시간(초)
gzip on; # 응답 데이터 압축 전송 여부
# =====================================================
# Upstream Context (로드 밸런싱 대상 그룹 설정)
# =====================================================
upstream my_backend {
server 10.0.0.1:8080;
server 10.0.0.2:8080;
}
# =====================================================
# Server Context (가상 호스트 1)
# =====================================================
server {
listen 80; # 바인딩할 포트 번호
server_name example.com; # 요청을 받을 도메인 주소
# Location Context 1: 정적 파일 처리
location / {
root /usr/share/nginx/html; # 파일이 위치한 실제 서버 디렉토리
index index.html index.htm; # 기본 문서 파일
}
# Location Context 2: API 프록시 처리
location /api/ {
proxy_pass http://my_backend; # Upstream 그룹으로 요청 전달
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 에러 페이지 설정
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
# 외부 설정 파일(conf.d 디렉토리) 포함하기
include /etc/nginx/conf.d/*.conf;
}
nginx.conf 하나의 파일에 수많은 server 블록 작성 시 파일 관리가 힘들어 지므로,
include문을 넣어 도메인/사이트별 설정 파일 분리
http {
...
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
nginx.conf 설정 후 수행할 명령# 1. 설정 파일 문법 검증 (오류 유무 확인)
sudo nginx -t
# 2. 문법 이상이 없으면 서비스 중단 없이 설정 재로드
sudo nginx -s reload
# 또는
sudo systemctl reload nginx