일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 고전역학
- oracle
- 웹 크롤링
- Database
- write by GPT-4
- 리눅스
- chatGPT's answer
- 자바
- python
- 자바네트워크
- Spring boot
- 소프트웨어공학
- GPT-4's answer
- 역학
- kotlin
- write by chatGPT
- Java
- lombok
- 자바암호
- 인프라
- 파이썬
- JVM
- NIO
- 뉴턴역학
- flet
- 유닉스
- 시스템
- GIT
- 코틀린
- android
- Today
- Total
Akashic Records
NGINX 설정 본문
NGINX의 nginx.conf
파일은 서버의 모든 주요 설정을 포함하고 있으며, 이 파일을 통해 NGINX의 동작을 제어합니다. 아래에서는 NGINX의 기본 구성 파일 구조와 주요 섹션에 대해 자세히 설명하겠습니다.
NGINX 설정 파일의 기본 구조
nginx.conf
파일은 몇 가지 주요 블록으로 구성되어 있습니다:
- Global Block: 이 부분에는 전역 설정이 포함되며, NGINX 서버 전체에 적용됩니다.
- Events Block: 연결 처리에 관련된 설정을 포함합니다.
- HTTP Block: HTTP 서비스에 관련된 설정을 포함하며, 여러 개의
server
블록을 포함할 수 있습니다. - Server Block: 특정 도메인에 대한 설정을 담당하며, 하나의
http
블록 안에 여러 개가 있을 수 있습니다. - Location Block: 특정 요청 URI에 대한 설정을 포함합니다.
server
블록 내에 위치합니다.
주요 설정 예시
# 사용자와 워커 프로세스 설정
user nginx;
worker_processes auto;
# 에러 로그와 PID 파일 경로 설정
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
# 이벤트 모듈 설정
events {
worker_connections 1024;
use epoll; # Linux 기반 시스템에 적합한 이벤트 처리 모델
}
# HTTP 서버 설정
http {
# 기본 MIME 타입 설정
include /etc/nginx/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"';
# 접근 로그와 에러 로그 설정
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log notice;
# 파일 전송 최적화 설정
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# Keep-alive 설정
keepalive_timeout 65;
# Gzip 압축 설정
gzip on;
gzip_disable "msie6";
# 서버 블록 설정
server {
listen 80 default_server;
server_name _;
root /usr/share/nginx/html;
# 기본 페이지 설정
index index.html index.htm;
# 404 페이지 설정
error_page 404 /404.html;
location = /40x.html {
root /usr/share/nginx/html;
}
# 50x 페이지 설정
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# 애플리케이션 프록싱 예시
location /app {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
# 정적 파일 캐싱 설정
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
}
}
}
설정 파일의 주의사항 및 가이드라인
- 문법 확인: 설정을 변경한 후에는 항상
nginx -t
명령을 사용하여 문법 오류를 확인해야 합니다. - 경로와 권한: 설정 파일에서 지정한 경로에 파일이 존재하는지, 그리고 NGINX 사용자가 해당 파일에 접근할 수 있는 권한을 가지고 있는지 확인해야 합니다.
- 보안 고려사항: 외부에서 접근할 수 있는 설정(
server
,location
)에서는 실행 가능한 스크립트나 애플리케이션에 대한 접근 제어를 엄격히 관리해야 합니다. - 성능 최적화:
sendfile
,tcp_nopush
,tcp_nodelay
등의 설정을 활용하여 파일 전송과 네트워크 성능을 최적화할 수 있습니다.
아래에서는 각 주요 블록과 그 기능에 대해 자세히 설명하겠습니다.
1. Global Block
- 위치: 설정 파일의 맨 위
- 목적: NGINX 서버 전체에 영향을 미치는 전역 설정을 정의합니다.
- 주요 지시어:
user
: NGINX 서버 프로세스를 실행할 시스템 사용자와 그룹을 지정합니다.worker_processes
: 사용할 워커 프로세스의 수를 설정합니다. 이는 일반적으로 사용 가능한 CPU 코어 수와 일치시킵니다.error_log
: 에러 로그의 경로와 로그 레벨을 설정합니다.pid
: NGINX 마스터 프로세스의 PID 파일 경로를 지정합니다.
2. Events Block
- 위치:
nginx.conf
파일 내의events
컨텍스트 - 목적: 연결 처리에 관련된 기본 이벤트 설정을 관리합니다.
- 주요 지시어:
worker_connections
: 단일 워커 프로세스가 동시에 처리할 수 있는 최대 연결 수를 지정합니다.multi_accept
: 한 워커 프로세스가 여러 네트워크 연결을 동시에 수락할지 여부를 결정합니다.use
: 특정 이벤트 모델을 사용하도록 NGINX에 지시합니다.
3. HTTP Block
- 위치:
nginx.conf
파일 내의http
컨텍스트 - 목적: HTTP 서버와 관련된 설정을 정의합니다. 이 블록은 여러
server
블록을 포함할 수 있습니다. - 주요 지시어:
include
: 다른 설정 파일이나 특정 패턴의 파일을 포함시킵니다.default_type
: 지정되지 않은 파일의 MIME 타입을 설정합니다.access_log
및error_log
: 접근 및 에러 로그의 경로와 포맷을 정의합니다.sendfile
,tcp_nopush
,tcp_nodelay
: 파일 전송 성능을 최적화하는 설정입니다.keepalive_timeout
: 연결을 유지하는 시간을 설정합니다.server_tokens
: 서버 토큰을 숨기거나 보여주는 설정입니다.ssl_certificate
및ssl_certificate_key
: SSL 연결을 위한 인증서 및 키 파일 경로를 지정합니다.
4. Server Block
- 위치:
http
컨텍스트 내부 - 목적: 특정 도메인 또는 IP 주소에 대한 서버 설정을 정의합니다.
- 주요 지시어:
listen
: 서버가 연결을 수락할 포트와 IP를 지정합니다.server_name
: 서버가 응답할 도메인 이름을 설정합니다.root
: 요청 URI의 루트 경로를 지정합니다.index
: 디렉토리 요청에 대한 기본 파일을 설정합니다.location
: 특정 URI 패턴에 대한 상세 설정을 정의합니다.
5. Location Block
- 위치:
server
컨텍스트 내부 - 목적: URI 요청에 따른 상세 처리 규칙을 정의합니다.
- 주요 지시어:
proxy_pass
: 요청을 다른 서버로 전달합니다.try_files
: 파일이나 디렉토리의 존재를 확인하고, 없을 경우 다른 URI로 요청을 전달합니다.deny
및allow
: 특정 IP 주소의 접근을 허용하거나 거부합니다.
이러한 블록들을 통해 NGINX의 동작을 세밀하게 제어하고, 특정 요구사항에 맞추어 서버를 구성할 수 있습니다. 설정 변경 후에는 항상 문법 검사를 수행하고, 오류가 없을 경우 NGINX를 재시작하거나 설정을 리로드해야 합니다.
NGINX 웹 서버 설정
다음 예제는 정적 웹 컨텐츠 제공, 애플리케이션 프록싱, 보안 향상 및 성능 최적화 기능을 포함하고 있습니다.
NGINX 웹 서버 설정 예시
# 사용자와 워커 프로세스 설정
user nginx;
worker_processes auto;
# 에러 로그와 PID 파일 경로 설정
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
# 이벤트 모듈 설정
events {
worker_connections 1024;
use epoll; # Linux 기반 시스템에 적합한 이벤트 처리 모델
}
# HTTP 서버 설정
http {
# 기본 MIME 타입 설정
include /etc/nginx/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"';
# 접근 로그와 에러 로그 설정
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log notice;
# 파일 전송 최적화 설정
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# Keep-alive 설정
keepalive_timeout 65;
# Gzip 압축 설정
gzip on;
gzip_disable "msie6";
# 서버 블록 설정
server {
listen 80 default_server;
server_name _;
root /usr/share/nginx/html;
# 기본 페이지 설정
index index.html index.htm;
# 404 페이지 설정
error_page 404 /404.html;
location = /40x.html {
root /usr/share/nginx/html;
}
# 50x 페이지 설정
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# 애플리케이션 프록싱 예시
location /app {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
# 정적 파일 캐싱 설정
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
}
}
}
설명
- 기본 설정: NGINX 워커 프로세스 수, 로그 설정, PID 파일 위치를 설정합니다.
- 이벤트 처리: 최대 연결 수 및 사용할 이벤트 모델(
epoll
)을 설정합니다. - HTTP 설정: MIME 타입, 로그 포맷, 압축, Keep-alive 등의 HTTP 관련 설정을 합니다.
- 서버 설정:
listen 80 default_server
: 80 포트에서 요청을 받고, 기본 서버로 설정합니다.server_name _;
: 모든 도메인에 대해 응답합니다.root /usr/share/nginx/html;
: 웹 문서의 루트 디렉토리를 지정합니다.- 에러 페이지: 사용자 정의 에러 페이지를 설정합니다.
- 애플리케이션 프록싱: 특정 경로(
/app
)에서 다른 애플리케이션(예: Node.js 앱)으로 요청을 전달합니다. - 정적 파일 캐싱: 이미지, CSS, JavaScript 파일의 캐싱을 설정하여 성능을 향상시킵니다.
이 설정 예제는 웹 서버를 구성하고 기본적인 성능 최적화와 보안 기능을 포함하여 NGINX를 효과적으로 운영할 수 있도록 도와줍니다. 설정을 적용한 후에는 nginx -t
로 설정을 검증하고, systemctl restart nginx
또는 nginx -s reload
로 NGINX를 재시작해야 합니다.
몇 가지 중요한 설정
1. 성능 최적화
캐싱
- 콘텐츠 캐싱은 웹 서버의 응답 시간을 단축하고 백엔드 로드를 줄이는 데 매우 효과적입니다. NGINX에서 캐싱을 설정하려면, 캐시를 저장할 경로와 캐시의 유효기간 등을 지정해야 합니다.
http {
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
location / {
proxy_cache my_cache;
proxy_pass http://backend-server;
proxy_cache_valid 200 302 60m;
proxy_cache_valid 404 10m;
}
}
}
압축
- Gzip 압축을 사용하여 HTML, CSS, JavaScript 파일 등을 압축함으로써 대역폭을 절약하고 페이지 로드 시간을 줄일 수 있습니다.
http {
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}
2. 보안 설정
HTTP Strict Transport Security (HSTS)
- HSTS 헤더를 사용하여 브라우저가 해당 사이트에 대한 모든 통신을 HTTPS를 통해서만 수행하도록 강제할 수 있습니다.
server {
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}
SSL/TLS 최적화
- SSL 설정을 통해 연결 보안을 강화할 수 있습니다. 다음은 보안을 강화한 SSL 설정 예입니다.
server {
listen 443 ssl;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
}
3. 로그 관리
- 로그 관리는 서버의 문제를 진단하고 사용자의 요청 패턴을 이해하는 데 중요합니다. NGINX에서는 다양한 로그 포맷을 설정하여 필요한 정보만을 로깅할 수 있습니다.
http {
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;
}
4. 동적 모듈 사용
- NGINX는 여러 동적 모듈을 지원하여, 기능을 확장할 수 있습니다. 예를 들어, 이미지 필터 모듈을 사용하여 서버에서 이미지의 크기를 조정할 수 있습니다.
load_module modules/ngx_http_image_filter_module.so;
server {
location /images/ {
image_filter resize 300 300;
}
}
이러한 고급 설정을 통해 NGINX 웹 서버의 성능과 보안을 크게 향상시킬 수 있으며, 서버 관리의 효율성을 높일 수 있습니다. 설정 변경 후에는 반드시 nginx -t
명령으로 구성을 검증하고, 변경사항을 적용하기 위해 NGINX를 재시작하거나 리로드해야 합니다.
NGINX 리버스 프록시
NGINX를 리버스 프록시로 설정하는 것은 웹 애플리케이션의 성능을 향상시키고, 보안을 강화하며, 복잡한 트래픽 라우팅을 단순화하는 데 도움을 줍니다. 다음은 실제 사용 가능한 수준에서 리버스 프록시를 설정하는 예시코드입니다.
NGINX 리버스 프록시 설정 예시
이 예제에서는 NGINX를 사용하여 특정 요청을 내부 애플리케이션 서버로 전달하고, SSL을 구성하여 보안을 강화하는 방법을 보여줍니다.
# NGINX의 HTTP 서버 설정
http {
# SSL 설정을 위한 인증서와 키 파일 경로
ssl_certificate /etc/nginx/ssl/mydomain.com.crt;
ssl_certificate_key /etc/nginx/ssl/mydomain.com.key;
# 리스닝 포트와 SSL 활성화
server {
listen 443 ssl;
server_name mydomain.com;
# 클라이언트 요청에 대한 SSL 설정
ssl_protocols TLSv1.2 TLSv1.3; # TLS 프로토콜 버전 지정
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384'; # 강력한 암호화 알고리즘 사용
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
# HTTP 요청을 HTTPS로 강제 리다이렉트
location / {
proxy_pass http://localhost:8080; # 내부 애플리케이션 서버로 프록시
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; # 웹소켓 지원을 위해 필요
proxy_set_header Connection 'upgrade'; # 웹소켓 지원을 위해 필요
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; # 실제 클라이언트 IP 주소 전달
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; # 프로토콜 (http, https) 전달
proxy_redirect off;
}
}
}
설명
- SSL/TLS 설정:
ssl_certificate
와ssl_certificate_key
를 사용하여 SSL 인증서와 키를 지정합니다.ssl_protocols
와ssl_ciphers
를 통해 사용할 프로토콜과 암호화 알고리즘을 세부적으로 설정하여 통신을 보안합니다. - Proxy 설정:
proxy_pass
지시어를 사용하여 모든 요청을 내부 서버http://localhost:8080
으로 전달합니다. 이는 NGINX가 클라이언트와 서버 간의 중개자 역할을 하게 하며, 보안, 로드 밸런싱, 캐싱 등 다양한 기능을 제공할 수 있습니다. - 헤더 설정:
proxy_set_header
를 사용하여 요청 헤더를 조정합니다. 이를 통해 내부 서버가 클라이언트 정보를 정확히 파악하고, 올바르게 응답할 수 있도록 합니다. - 웹소켓 지원:
Upgrade
와Connection
헤더를 설정하여 NGINX가 웹소켓 연결을 적절히 처리할 수 있도록 합니다.
이 설정을 통해 NGINX는 안전하고 효율적인 리버스 프록시 서버로서의 역할을 수행할 수 있습니다. 설정을 변경한 후에는 반드시 NGINX 구성을 검증(nginx -t
)하고, 변경사항을 적용하기 위해 NGINX를 재시작하거나 리로드합니다(nginx -s reload
).
몇 가지 리버스 프록시 설정 기법에 대해 자세히 설명하겠습니다.
1. 로드 밸런싱과 서버 선택 알고리즘
리버스 프록시를 사용하여 로드 밸런싱을 구성할 때, 서버 선택 알고리즘을 사용하여 트래픽을 적절히 분산시킬 수 있습니다.
http {
upstream myapp {
least_conn; # 연결 수가 가장 적은 서버에 요청을 할당
server backend1.example.com;
server backend2.example.com;
server backend3.example.com max_fails=3 fail_timeout=30s; # 서버 실패 관리
}
server {
location / {
proxy_pass http://myapp;
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;
}
}
}
2. 캐싱 전략
고급 리버스 프록시 설정에서는 효율적인 캐싱 전략을 통해 백엔드 서버의 로드를 줄이고 사용자 경험을 향상시킬 수 있습니다.
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
location / {
proxy_cache my_cache;
proxy_cache_valid 200 1d; # 200 상태 코드 응답을 1일 동안 캐시
proxy_cache_valid 404 1m; # 404 에러는 1분간만 캐시
proxy_pass http://myapp;
proxy_cache_revalidate on; # 캐시된 응답의 유효성 재검사
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; # 오류 시 스테일 캐시 사용
proxy_cache_lock on; # 동시 요청에 대해 캐시 미스가 발생할 경우, 한 요청만 백엔드로 전달
}
}
3. SSL/TLS 종단 처리
리버스 프록시를 통한 SSL/TLS 종단 처리는 보안을 강화하고, 내부 네트워크 트래픽을 관리할 수 있게 합니다.
server {
listen 443 ssl;
server_name mydomain.com;
ssl_certificate /etc/ssl/certs/mydomain.pem;
ssl_certificate_key /etc/ssl/private/mydomain.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://myapp;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-SSL-Cipher $ssl_cipher;
proxy_set_header X-SSL-Protocol $ssl_protocol;
}
}
4. 웹소켓 지원
웹 애플리케이션에서 웹소켓을 사용하는 경우, 리버스 프록시 설정에서 웹소켓 연결을 제대로 처리할 수 있어야 합니다.
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
location /websocket {
proxy_pass http://websocket_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
NGINX 로드 밸런싱
NGINX를 로드 밸런서로 사용하기 위한 설정은 주로 http
블록 안에 upstream
디렉티브를 통해 구현됩니다. 이 예제에서는 두 개의 백엔드 서버를 사용하여 로드 밸런싱을 설정하는 방법을 보여 드리겠습니다.
NGINX 로드 밸런싱 설정 예시
- Upstream 설정: 이 설정은 NGINX가 트래픽을 분산시킬 백엔드 서버 그룹을 정의합니다.
http {
upstream myapp {
server backend1.example.com;
server backend2.example.com;
}
server {
listen 80; # NGINX 서버가 클라이언트 요청을 받을 포트
location / {
proxy_pass http://myapp; # Upstream 그룹에 정의된 서버로 트래픽을 전달
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;
}
}
}
설명
- upstream myapp: 로드 밸런싱을 위한 서버 그룹
myapp
을 정의합니다. 여기서backend1.example.com
과backend2.example.com
은 로드 밸런싱 대상 서버의 호스트명 또는 IP 주소입니다. - server: 클라이언트의 요청을 받을 서버를 설정합니다. 여기서
listen 80
은 NGINX가 80 포트에서 요청을 받을 것임을 의미합니다. - location /: 모든 요청을 처리할 위치 블록을 정의합니다.
proxy_pass http://myapp;
는 요청을 upstream 그룹myapp
으로 전달하라는 지시를 나타냅니다. - proxy_set_header: 실제 클라이언트 정보를 백엔드 서버로 전달하기 위해 헤더를 설정합니다.
로드 밸런싱 방법
NGINX는 기본적으로 라운드 로빈 방식을 사용하여 요청을 각 서버에 균등하게 분산합니다. 추가적인 로드 밸런싱 메소드로는 다음과 같은 옵션이 있습니다:
- least_conn: 동시 연결 수가 가장 적은 서버에 요청을 보내는 방식입니다.
- ip_hash: 클라이언트의 IP 주소를 해싱하여 특정 서버에 요청을 지속적으로 보내는 방식입니다. 이는 세션 지속성을 보장할 필요가 있을 때 유용합니다.
예를 들어, least_conn
메소드를 사용하려면, upstream
블록에서 다음과 같이 설정할 수 있습니다:
upstream myapp {
least_conn;
server backend1.example.com;
server backend2.example.com;
}
이 설정을 통해 NGINX는 로드 밸런싱을 수행하면서 백엔드 서버 간에 연결을 효율적으로 분산시킬 수 있습니다. 설정 후에는 NGINX를 다시 로드하여 변경사항을 적용해야 합니다(sudo nginx -s reload
).
로드 밸런싱 방식
NGINX는 로드 밸런싱과 부하 분산에 탁월한 성능을 제공하는 웹 서버이자 리버스 프록시입니다. 고성능 부하분산을 위한 설정은 다양한 로드 밸런싱 방식과 성능 최적화 기술을 포함합니다. 다음은 NGINX에서 고성능 부하분산을 설정하는 방법을 상세히 설명합니다.
NGINX는 여러 가지 로드 밸런싱 방식을 지원합니다. 각 방식은 특정 시나리오에서 더 효율적일 수 있습니다.
라운드 로빈 (Round Robin)
기본적인 로드 밸런싱 방식으로, 요청을 순서대로 각 서버에 균등하게 분배합니다. 설정은 간단합니다:
http {
upstream myapp {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
location / {
proxy_pass http://myapp;
}
}
}
가중치 기반 (Weighted Round Robin)
각 서버에 가중치를 할당하여, 특정 서버에 더 많거나 적은 트래픽을 할당할 수 있습니다. 서버의 성능이 서로 다를 때 유용합니다:
http {
upstream myapp {
server backend1.example.com weight=3;
server backend2.example.com weight=2;
server backend3.example.com weight=1;
}
}
최소 연결 (Least Connections)
현재 활성 연결 수가 가장 적은 서버를 우선적으로 선택합니다. 동적 콘텐츠나 긴 세션을 다룰 때 효과적입니다:
http {
upstream myapp {
least_conn;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
}
해시 기반 (Hash)
해시 기반 부하 분산은 클라이언트의 IP 주소, 헤더, URI 등을 기반으로 일관된 해싱 알고리즘을 사용하여 트래픽을 서버에 분산시킵니다. 이 방식은 세션 지속성을 유지할 필요가 있는 애플리케이션에 유용하며, 사용자의 요청을 동일한 서버로 지속적으로 라우팅할 수 있습니다.
http {
upstream myapp {
hash $remote_addr consistent; # 클라이언트 IP를 기반으로 해시 계산
server backend1.example.com;
server backend2.example.com;
}
server {
location / {
proxy_pass http://myapp;
}
}
}
랜덤 (Random) 방식
랜덤 방식은 요청을 처리할 서버를 무작위로 선택합니다. 이 방식은 트래픽이 비교적 일정하고 세션 지속성이 크게 중요하지 않은 환경에서 유용할 수 있습니다. NGINX Plus에서는 random 지시어를 사용하여 구성할 수 있으며, 오픈 소스 버전에서는 별도의 모듈이나 스크립트를 사용해야 할 수도 있습니다.
http {
upstream myapp {
random two; # 두 개의 서버 중 하나를 무작위로 선택
server backend1.example.com;
server backend2.example.com;
}
server {
location / {
proxy_pass http://myapp;
}
}
}
IP 해시 (IP Hash)
클라이언트의 IP 주소를 기반으로 서버를 선택하는 방식입니다. 일관된 세션 지속성을 제공합니다.
http {
upstream myapp {
ip_hash;
server backend1.example.com;
server backend2.example.com;
}
server {
location / {
proxy_pass http://myapp;
}
}
}
가중치와 최소 연결의 조합
서버의 가중치를 고려하면서 동시에 연결 수가 가장 적은 서버를 우선적으로 선택합니다.
http {
upstream myapp {
least_conn;
server backend1.example.com weight=3;
server backend2.example.com weight=1;
}
server {
location / {
proxy_pass http://myapp;
}
}
}
이러한 부하 분산 기법을 통해 서버의 부하를 균등하게 분산시키고, 특정 서버에 과부하가 걸리는 것을 방지할 수 있습니다. 각 기법은 서버 환경과 애플리케이션의 요구에 따라 적절히 선택하여 사용하면, 시스템의 안정성과 성능을 최적화할 수 있습니다. 설정 변경 후에는 항상 NGINX 구성을 검증하고 변경사항을 적용하기 위해 NGINX를 재시작하거나 리로드해야 합니다.
성능 최적화 기법
NGINX를 사용하여 웹 캐시를 설정하는 것은 웹 서버의 성능을 크게 향상시키고, 콘텐츠 전달을 가속화하며, 백엔드 서버의 부하를 줄일 수 있는 효과적인 방법입니다. 다음은 실제 사용할 수 있는 수준의 NGINX 웹 캐시 설정 예시코드입니다.
Keepalive 연결
백엔드 서버와의 연결을 유지하여, 연결 설정 및 해제에 따른 오버헤드를 줄일 수 있습니다. 이는 서버 간의 빠른 통신을 가능하게 하여 성능을 개선합니다:
http {
upstream myapp {
server backend1.example.com;
server backend2.example.com;
keepalive 32; # 각 워커 프로세스 당 유지할 연결 수
}
server {
location / {
proxy_pass http://myapp;
proxy_set_header Connection "";
proxy_http_version 1.1;
}
}
}
캐싱
동적 콘텐츠조차도 캐싱 전략을 적용하여 응답 시간을 단축하고, 백엔드 서버의 부하를 줄일 수 있습니다. 응답을 캐시하여 반복 요청에 대해 빠르게 응답할 수 있습니다:
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
server {
location / {
proxy_pass http://myapp;
proxy_cache my_cache;
proxy_cache_valid 200 10m;
proxy_cache_methods GET HEAD;
}
}
NGINX 웹 캐시 설정
이 설정은 NGINX에서 정적 파일 캐싱을 구현하는 방법을 보여줍니다. 설정에는 캐시 저장 경로, 캐시 키, 유효 기간 등의 세부 사항이 포함됩니다.
# 캐시 저장소를 설정합니다.
http {
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=STATIC:10m inactive=24h max_size=1g;
server {
listen 80;
server_name example.com;
# 정적 파일에 대한 위치 블록
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
root /usr/share/nginx/html;
access_log off; # 정적 파일에 대한 접근 로그를 비활성화
expires 30d; # 브라우저 캐시 유효기간을 30일로 설정
add_header Pragma public;
add_header Cache-Control "public";
}
# 애플리케이션 콘텐츠에 대한 프록시 캐시 설정
location / {
proxy_pass http://backend-server;
proxy_cache STATIC; # 캐시 존 이름
proxy_cache_valid 200 302 10m; # 200 및 302 응답에 대한 캐시 유효 기간
proxy_cache_valid 404 1m; # 404 응답에 대한 캐시 유효 기간
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; # 오류 응답 시 스테일 캐시 사용
proxy_cache_revalidate on; # 유효성 검사가 필요할 때 캐시를 다시 검증
proxy_cache_min_uses 3; # 최소 3회 요청 시 캐시 항목 저장
proxy_cache_lock on; # 요청 중복을 방지하기 위해 캐시 잠금 활성화
}
}
}
설명
- proxy_cache_path: 캐시 데이터를 저장할 경로와 캐시의 세부 설정을 정의합니다.
keys_zone
은 캐시 키와 메모리 크기를 설정합니다. - location ~* .(jpg|jpeg|png|gif|ico|css|js)$: 정적 자원에 대한 캐싱 규칙을 정의합니다. 정적 파일 접근 로그를 비활성화하고, 캐시 만료 시간을 30일로 설정합니다.
- location /: 동적 콘텐츠에 대한 프록시 설정을 구성합니다.
proxy_pass
지시어는 요청을 백엔드 서버로 전달합니다.proxy_cache
와 관련된 다양한 지시어를 통해 캐시 동작을 세밀하게 제어합니다.
이 설정을 통해 웹 캐시를 효과적으로 활용하여 웹 사이트의 로딩 속도를 개선하고, 서버 부하를 줄이며, 전반적인 사용자 경험을 향상시킬 수 있습니다.
이어서 캐시 기능과 설정 방법에 대해 자세히 설명하겠습니다.
1. 캐시 키 사용자 정의
기본적으로 NGINX는 요청의 전체 URL을 캐시 키로 사용합니다. 하지만 특정 요청 헤더나 쿼리 매개변수를 기반으로 캐시 키를 사용자 정의할 수 있어, 더욱 세밀한 캐시 제어가 가능합니다.
proxy_cache_key "$host$request_uri $cookie_user";
이 설정은 요청 도메인과 URI에 사용자별 쿠키를 추가하여 캐시 키를 구성합니다. 이 방법은 사용자별 세션 데이터를 캐시할 때 유용합니다.
2. 캐시 바이패스
특정 조건에서 캐시를 바이패스하고 항상 최신 콘텐츠를 백엔드 서버에서 직접 가져오게 설정할 수 있습니다. 이는 로그인 상태 또는 특정 쿼리 매개변수가 있는 요청에 유용할 수 있습니다.
proxy_cache_bypass $http_authorization $arg_nocache;
이 예제에서는 HTTP Authorization
헤더가 있거나 URL에 nocache
쿼리 매개변수가 포함된 경우 캐시를 사용하지 않고 요청을 백엔드 서버로 직접 전달합니다.
3. 캐시 정리 및 무효화
캐시 무효화는 콘텐츠 업데이트가 있을 때 기존 캐시된 데이터를 즉시 무효화하는 기능입니다. NGINX Plus에서는 API를 통해 캐시된 항목을 제거할 수 있지만, 무료 버전에서는 다른 접근 방법을 사용해야 합니다.
location /purge {
allow 192.168.0.1; # 관리자 IP
deny all;
proxy_cache_purge STATIC "$host$request_uri";
}
위 설정은 /purge
엔드포인트를 통해 특정 URL의 캐시를 제거할 수 있게 합니다. 이는 보안을 위해 특정 IP에서만 접근이 가능하도록 제한합니다.
4. 캐시 성능 최적화
NGINX의 캐시 시스템을 최적화하기 위해 캐시 파일의 저장 방법, 메모리 사용, 그리고 캐시 지속 시간을 세밀하게 조정할 수 있습니다.
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=STATIC:10m inactive=60m use_temp_path=off;
이 설정은 캐시 데이터를 저장할 경로, 디렉토리 구조, 캐시 메모리 영역, 캐시 유지 시간 및 임시 경로 사용 여부를 정의합니다.
5. 동적 콘텐츠의 캐시
동적 콘텐츠를 캐싱하는 것은 설정이 더 복잡하지만, 응답 시간을 크게 단축시키고 서버 부하를 줄일 수 있습니다.
location ~ \.php$ {
proxy_pass http://backend;
proxy_cache STATIC;
proxy_cache_valid 200 1h; # 성공 응답은 1시간 동안 캐시
proxy_cache_use_stale updating error timeout invalid_header http_500 http_502 http_503 http_504;
}
이 설정은 PHP 파일에 대한 요청을 캐시하고, 오류 응답이 있을 경우 스테일 콘텐츠를 사용자에게 제공합니다.
이러한 고급 설정은 NGINX 웹 캐시의 효율을 최대화하고, 다양한 웹 애플리케이션 시나리오에서의 요구를 충족시킬 수 있습니다. 설정을 변경한 후에는 반드시 nginx -t
명령으로 구성을 검증하고, nginx -s reload
로 변경사항을 적용해야 합니다.
'Library' 카테고리의 다른 글
DevSecOps 란 무엇인가 (0) | 2024.10.10 |
---|---|
NGINX 부하 분산 및 Proxy (0) | 2024.09.23 |
NGINX 기본 개념 및 설치하기 (2) | 2024.09.09 |
Java ProcessBuilder와 Process API (1) | 2024.04.26 |
Java 22 ScopedValue와 StructuredTaskScope (0) | 2024.03.12 |