Nginx는 비동기 이벤트 기반 모델을 사용하는 경량 HTTP 서버이자 리버스 프록시 서버입니다. Nginx를 이해하기전의 웹의 작동방식을 살펴봅시다.
웹의 작동방식
- 브라우저가 DNS 서버로 이동하여 실제주소를 찾는다
- 브라우저는 HTTP 요청 메시지를 서버로 전송하여 웹사이트의 복사본을 클라이언트에게 보내도록 요청
- 이 메시지와 클라이언트와 서버간에 전송되는 모든 데이터는 TCP/IP를 사용하여 인터넷 연결을 통해 전송
- 서버가 클라리언트의 요청을 승인하면 "200" 메시지를 클라이언트에게 발송
- 웹 사이트의 파일을 패킷이라고 불리는 일련의 작은 덩어리로 브라우저에 보냄
- 브라우저는 작은 덩어리를 완전한 웹페이지로 조립하여 사용자에게 표시
HTTP server(Web Serer)
- 소프트웨어 관점: 클라이언트로부터 HTTP 프로토콜로 요청을 받고 요청에 데해 응답하는 것
- 하드웨어 관점: 위와 같은 기능을 제공하는 하나의 컴퓨터
웹 서버의 기본 역할
- HTTP 요청 처리: 클라이언트로부터 HTTP 요청을 받고, 요청을 받은 파일이나 데이터를 클라이언트에게 전송
- 정적 컨텐츠 제공: HTML, CSS, 이미지 등과 같은 정적 파일을 제공
- 로깅: 요청에 대한 정보를 로그 파일에 저장하여 서버의 성능 모니털이 및 오류진단을 도와줌
Nginx의 필요성과 장점
성능과 효율성
- 비동기 이벤트 기반 처리를 통해: 동시에 많은 연결을 효율적으로 처리
- 특히 높은 트래픽을 처리할 때 CPU와 메모리 사용량을 최소화하면서 높은 성능을 유지합니다.스케일링 용이성
스케일링 용이성
- 리버스 프록시로 사용될 때, 애플리케이션 서버들사이에서 클라이언트 요청을 분산시켜, 부하 균형을 맞추고 시스템의 안정성을 높일 수 있습니다.
보안 기능
- HTTPS를 통한 보안 연결을 지원
- 보안 정책 설정: Nginx 설정을 통해 보안 헤더를 추가하고, IP 기반의 접근 제어를 설정할 수 있습니다.유연성과 확장성
유연성과 확장성
- 다양한 서드 파티 모듈을 지원하여 로드 밸런싱, 웹 애플리케이션 파이어월, 페이지 캐싱 등의 기능을 확장할 수 있습니다.콘텐츠 캐싱
콘텐츠 캐싱
- 정적 파일뿐만 아니라 동적 컨텐츠도 캐싱하여 빠른 응답시간을 제공하고 백엔드 서버의 부하를 줄일 수 있습니다.
nginx.conf 예시
# 사용자 정의 및 기본 프로세스 설정
user nginx; # Nginx가 실행될 사용자
worker_processes auto; # 자동으로 프로세스 수를 결정 (CPU 코어 수에 따라 조절)
# 이벤트 모듈 설정
events {
worker_connections 1024; # 각 워커 프로세스 당 처리할 수 있는 최대 연결 수
}
# HTTP 서버 기본 설정
http {
# 기본 파일 타입과 MIME 타입 설정
include mime.types;
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"';
# SSL 설정
ssl_protocols TLSv1.2 TLSv1.3; # TLS 프로토콜 버전 지정
ssl_prefer_server_ciphers on; # 서버 측에서 암호 슈트 우선 순위 설정
# 성능 최적화를 위한 설정
sendfile on; # sendfile을 사용하여 파일 전송 처리 향상
keepalive_timeout 65; # keep-alive 연결 유지 시간
# GZIP 압축 활성화
gzip on;
gzip_disable "msie6";
# 서버 블록 예시 (80 포트 리스닝)
server {
listen 80;
server_name example.com www.example.com; # 처리할 서버 이름
# SSL 리다이렉트 설정
location / {
return 301 https://$host$request_uri; # 모든 요청을 HTTPS로 리다이렉트
}
}
# SSL 서버 블록 예시 (443 포트 리스닝)
server {
listen 443 ssl;
server_name example.com www.example.com;
# SSL 인증서 경로
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
# 컨텐츠 캐싱
location / {
root /usr/share/nginx/html; # 정적 파일의 루트 디렉토리
index index.html index.htm;
try_files $uri $uri/ =404; # 요청된 URI에 해당하는 파일 또는 디렉토리를 찾고 없다면 404 오류 처리
}
# 리버스 프록시 설정
location /app {
proxy_pass http://localhost:8080; # 요청을 내부 애플리케이션 서버로 전달
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;
}
# API 요청 처리를 위한 리버스 프록시
location /api {
proxy_pass http://localhost:8080; # API 서버로 요청 전달
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;
}
}
}
보안 인증서와 키 파일의 경로는 실제 사용환경에 맞게 변경해야합니다!!
'IT > Deploy' 카테고리의 다른 글
Docker-Compose를 이용하여 Nginx와 Certbot으로 HTTPS 활성화하기 (0) | 2024.04.16 |
---|---|
Django 프로젝트 Docker를 사용하여 배포하기 (0) | 2024.04.16 |
Github Action를 사용한 배포 자동화, CI/CD 파이프라인 구축 (0) | 2024.04.12 |
nginx, root와 alias 차이와 사용법(예시 포함) (0) | 2024.04.12 |
letsencrypt를 통해 nginx에 SSL/TLS인증서 적용하기 (0) | 2024.04.08 |