And Brain said,
NGINX, Server의 최전방 수호병 본문
오늘은 서버의 최전방에서 홀로 고군분투하는 엔진엑스(NGINX)에 대해 알아보고 엔진엑스를 통해 로드밸런싱(Load Balancing)하는 예제까지 같이해보도록 하자.
NGINX
대규모 웹 서비스에서 자주 사용되는 Nginx는 고성능 웹 서버, 리버스 프록시, 로드 밸런서 등의 기능을 제공하는 오픈 소스 소프트웨어다.
Nginx는 가벼운 구조와 높은 성능을 자랑한다.
이는 Nginx가 단일 프로세스 또는 단일 쓰레드로 처리하는 것이 아니라, 이벤트 기반의 아키텍처를 채택하여 다중 쓰레드를 사용하기 때문이다.
또한, Nginx는 다양한 플러그인을 지원하여 확장성이 높다.
Nginx는 리버스 프록시로도 사용되는데, 리버스 프록시는 클라이언트와 서버 사이에서 중계 역할을 수행하며, 클라이언트 요청을 서버에 전달하고, 서버의 응답을 클라이언트에게 전달한다.
또한, 여러 대의 서버에 대한 부하를 분산하여 처리하는 로드밸런서로도 사용된다.
Nginx는 다음과 같은 순서로 동작한다.
클라이언트로부터 HTTP 요청을 받으면 Nginx는 요청된 URL에 따라 적절한 프록시 패스를 선택하고 선택된 프록시 패스로 HTTP 요청을 전달한다.
자 여기까지 기본적인 개념에 대해 알아보았고 바로 본론으로 들어가자.
이전 시간에 구축한 클러스터 내부의 노드들에는 사실 Kibana가 각각 존재하는데, 특정 주소로 요청을 보냈을때 엔진엑스를 통해 Kibana 노드들에게 로드밸런싱을 해줄 것이다.
https://theworldaswillandidea.tistory.com/115
먼저, 로드밸런서 역할을 할 서버가 따로 필요하다.
새로운 서버에 Nginx를 설치해주자.
$ sudo apt update
$ sudo apt install nginx
nginx가 설치가 완료되면 vi 혹은 nano를 이용해 /etc/nginx/sites-available/kibana를 작성해주자.
upstream kibana_servers {
least_conn;
server 192.168.56.107:5601;
server 192.168.56.105:5601;
server 192.168.56.104:5601;
}
log_format dev_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
limit_req_zone $binary_remote_addr zone=dev_limit:20m rate=4r/s;
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=dev_cache:100m inactive=60m;
server {
listen 19999;
server_name 192.168.56.108;
access_log /var/log/nginx/kibana_access.log dev_log;
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
add_header X-Frame-Options SAMEORIGIN;
location / {
limit_req zone=dev_limit burst=20 nodelay;
proxy_pass http://kibana_servers;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache_key "$scheme$request_method$host$request_uri";
add_header X-Cache-Status $upstream_cache_status;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
proxy_cache_valid 200 60m;
}
}
upstream은 로드밸런싱 설정을 위한 지시자다.
가용성을 위해 least_conn 로드밸런서를 사용했다.
kibana_servers라는 이름으로 upstream 그룹을 생성하고, 각 노드의 Kibana 주소와 포트 정보를 등록한다.
log_format을 통해 kibana_access.log 파일의 로그 형식을 dev_log로 정의하고 해당 로그 형식에는 IP 주소, 로그인 ID, 시간, 요청 URL, 응답 상태 코드, 응답 바이트 크기, Referer 헤더, User-Agent 헤더 정보를 포함시킨다.
limit_req_zone 설정으로 IP 주소별로 초당 4개 요청을 처리할 수 있게하고 최대 20MB의 메모리 제한을 둔다.
proxy_cache_path로 /var/cache/nginx 디렉토리를 캐시 디렉토리로 사용하며, 100MB의 메모리를 사용하게 한다.
이후 60분간 응답 결과를 캐시에 저장한다.
server는 Nginx의 가상 호스트 설정을 나타내며, 클라이언트 요청을 수신할 IP와 포트를 지정한다.
server_name으로 들어오는 모든 요청에 대해 설정한다.
add_header를 통해 보안을 강화한다.
X-Content-Type-Options 헤더는 서버에서 제공되는 리소스의 MIME 타입을 브라우저가 추측하지 못하도록 막아준다.
X-XSS-Protection 헤더는 브라우저에서 크로스 사이트 스크립팅(XSS) 공격을 방지한다.
X-Frame-Options: 이 헤더는 서버에서 제공하는 페이지가 다른 사이트에서 iframe 등의 방법으로 포함되는 것을 방지한다.
location은 요청이 들어온 URL 경로에 따라 요청을 처리하는 블록이다.
모든 요청에 대해 설정하며, ' / ' 경로로 들어오는 모든 요청을 로드밸런서로 전달한다.
proxy_pass는 로드밸런싱할 대상 upstream 그룹을 지정한다.
proxy_set_header는 프록시 서버가 전달하는 HTTP 요청 헤더를 설정하며, $host 는 요청 도메인 이름,
$remote_addr은 클라이언트 IP 주소를, $proxy_add_x_forwarded_for는 X-Forwarded-For 헤더 값을 전달한다.
// ln 명령어를 통해 링크한다.
$ sudo ln -s /etc/nginx/sites-available/kibana /etc/nginx/sites-enabled/
// 구성파일 리로드 및 검증
$ cd /etc/nginx
$ nginx -s reload
$ nginx -t
// Nginx 재구동
$ systemctl restart nginx.service
Nginx 재구동하면 끝.
이제 설정한 IP 포트로 들어가면 Kibana 서버로 로드밸런싱 완료
Thanks for watching, Have a nice day.
Reference
'IT > Nginx' 카테고리의 다른 글
[Nginx] https야, 이리오너라! / redirect http to https (0) | 2022.09.11 |
---|