이번 블로그에서는 Nginx에 대해서 알아보려고 한다.
1. 특징
- 높은 성능 : 경량 서버이며, 이벤트 기반 아키텍처를 기반으로 하여 매우 빠른 성능을 제공하고 비동기 및 다중 프로세스 모델을 사용하므로 많은 동시 연결을 처리할 수 있다.
- 리버스 프록시 : 요청을 웹 어플리케이션 서버로 전달하는 역할을 한다. 이를 통해 로드 밸런싱, SSL 종료 및 캐싱을 구현 가능하다.
- 정적 파일 캐싱 : 정적파일(HTML, CSS, JS, 이미지 등)을 효율적으로 제공하는 데 특화되어 있다.
- 확장성 : 수평적으로 확장이 가능해 더 많은 트래픽을 처리하기 위해 서버 클러스터를 만들 수 있다. 즉, Nginx가 관리하는 서버의 수를 늘리거나 줄이는 작업에 용이하다.
- 높은 가용성 : 다중 서버간의 로드 밸런싱을 구성하여 고가용성 및 장애 복구를 실현할 수 있다.
- SSL/TLS지원 : 보안 연결을 설정 가능하다.
(+) 멀티 스레드 vs 멀티 프로세스
- 멀티 스레드는 스레드간의 공유 메모리와 경량화된 스위칭으로 빠른 통신 및 공유가 가능하다.
- 멀티 프로세스는 독립된 메모리 공간과 안정성을 제공한다.
2. 로드 밸런싱
- 여러 서버, 또는 서비스로 들어오는 트래픽을 분산시켜 가용성, 성능, 안정성을 향상시킨다.
- 트래픽이 많은 웹서버, 애플리케이션 서버, 데이터베이스 서버 등에 고르게 분배를 시킨다.
- 가용성 향상 : 여러 서버가 트래픽을 나누어 처리하므로 한 서버에 장애가 발생하더라도 다른 서버가 서비스를 제공할 수 있다.
- 성능 향상 : 기본적으로 개별 서버의 부하가 분산되어 서버의 응답시간을 개선하고 사용자 경험을 향상시킨다.
- 스케일링 : 서버 클러스터를 확장하거나 축소할 수 있다.
- 알고리즘 기반 로드 밸런싱 : 라운드 로빈, 가중치 라운드 로빈, 최소 연결 수, IP해싱 등으로 로드 밸런싱 처리
알고리즘 종류
- 라운드 로빈(DEFUALT) : 순차적으로 서버에 분배하는 알고리즘
- 가중치 라운드 로빈 : 각 서버마다 가중치를 부여하여 무게가 높은 서버에 더 많은 요청을 전달
- 최소 연결 수 : 가장 적은 연결 수를 가진 서버에 요청을 보내는 알고리즘
- IP 해싱 : 클라이언트의 IP를 해싱하여 항상 같은 서버로 리다이렉션하는 알고리즘으로 세션 일관성을 유지 가능하다.
가중치 라운드 로빈
upstream my_backend {
server backend1.example.com;
server backend2.example.com weight=3;
server backend3.example.com;
}
server {
location / {
proxy_pass http://my_backend;
}
}
최소 연결 수
- keepalive 32 : 해당 설정을 통해 각 서버당 연결 수 조절 가능
upstream my_backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
location / {
proxy_pass http://my_backend;
}
}
IP 해싱
upstream my_backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
location / {
proxy_pass http://my_backend;
}
}
오류 확인
- Nginx는 어떻게 한 서버가 오류가 발생했음을 확인하고 로드 밸런싱 처리를 할까?
- 1. Health Checks : 주기적으로 서버의 상태를 모니터링하고 해당 서버가 응답하지 않거나 오류 응답을 처리하는 경우 "unhealthy" 를 표시하고 트래픽을 해당 서버에서 제외
- 2. Error Handling : 서버에서 오류 응답을 받은 경우 다른 서버로 트래픽을 라우팅, proxy_next_upstream을 활용하여 구현
- 3. Load Balancing Method : least_conn, ip_hash 를 이용하여 다른 서버로 라우팅
- 4. Custom Error Handling : 서버 오류가 발생할 경우 특정 동작을 설정
Health Checks
- 30초 간격으로 실행, 3번 연속 성공시 헬스 체크 더이상 안보내고 3번 연속 실패시 더이상 트래픽을 장애 서버로 보내지 않는다. 응답은 5초안에 와야한다.
upstream backend {
server backend1.example.com;
server backend2.example.com;
# 헬스 체크 설정
check interval=30s rise=3 fall=3 timeout=5s;
}
Error Handling
- 서버에서 오류 또는 타임 아웃 발생시 다른 upstream으로 전송
http {
upstream backend_group1 {
server backend1.example.com;
server backend2.example.com;
}
upstream backend_group2 {
server backend3.example.com;
server backend4.example.com;
}
# Error handling configuration for backend_group1
location /group1/ {
proxy_pass http://backend_group1;
proxy_next_upstream error timeout;
}
# Error handling configuration for backend_group2
location /group2/ {
proxy_pass http://backend_group2;
proxy_next_upstream error timeout;
}
}
Custom Error Handling
- 특정 오류 발생시 에러페이지로 다이렉션 처리
location / {
proxy_pass http://backend;
error_page 502 503 504 = /error.html;
}
location = /error.html {
root /var/www/errors;
}
3. SSL/TLS 지원
- SSL/TLS(보안 소켓 계층/전송 계층 보안) 프로토콜을 지원하여 웹 서버와 클라이언트 간의 통신을 암호화하고 보호할 수 있다.
- HTTPS의 S를 의미한다.
- 데이터를 암호화하여 중간자 공격을 막고 데이터 무결성을 제공한다.
- 핸드셰이크를 활용하여 서로의 세션키를 교환하고 이를 통해 데이터를 암호화 및 복호화한다.
방법
1. SSL/TLS 모듈 활성화 : Nginx에는 이미 SSL/TLS 모듈이 내제되어 있으므로 먼저 이 모듈을 활성화시킨다.
2. SSL/TLS 인증서 획득 : CA에서 구입하거나 Let's Encrypt에서 무료 구매 가능하다.
3. SSL/TLS 설정 추가 : 설정 파일에 설정을 추가한다.
4. 선택적인 SSL/TLS 설정 추가 : 암호화 알고리즘, 프로토콜 버전, 보안 옵션 등을 구성할 수 있다.
server {
# 443 포트에서 SSL을 사용하도록 설정
listen 443 ssl;
# SSL/TLS가 적용될 도메인 이름을 지정한다.
server_name example.com;
# SSL을 활성화
ssl on;
# SSL 프로토콜 버전 설정
ssl_protocols TLSv1.2 TLSv1.3;
# 사용할 암호화 알고리즘 설정
ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384';
# 서버의 SSL/TLS 인증서 및 개인 키 파일 경로 설정
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
# OCSP 스테이플링 활성화
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8; # DNS 서버 주소를 설정합니다.
# HSTS 설정
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
# SSL 세션 타임아웃 및 캐시 설정
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
# 강력한 Diffie-Hellman(DH) 그룹 설정
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
# 클라이언트 인증 옵션 (선택적)
ssl_client_certificate /etc/nginx/ssl/client-ca.crt;
ssl_verify_client on;
# 나머지 Nginx 서버 설정
location / {
# 웹 애플리케이션 설정
}
}
'Server Development > Server Architecture' 카테고리의 다른 글
MicroServices (0) | 2023.03.30 |
---|