NGINX Plus 미러링 기능을 사용하여 안전한 트래픽 수집
웹 트래픽을 효과적으로 모니터링하거나 테스트하려면, 프로덕션 환경에 영향을 주지 않으면서 실제 사용자 요청을 복제하고 분석할 수 있는 방법이 필요합니다. NGINX는 이러한 요구 사항을 충족하기 위해 NGINX Plus 미러링 기능(ngx_http_mirror_module)을 제공합니다. 이 기능을 통해 클라이언트의 원본 요청을 별도의 서버로 복사하여 트래픽 로깅, 보안 모니터링, A/B 테스트, 성능 테스트 등 다양한 목적으로 활용할 수 있습니다.
미러링 기능의 가장 큰 장점은 비동기적으로 요청을 복제하므로 클라이언트의 성능이나 사용자 경험에 영향을 주지 않는다는 것입니다. 원본 요청은 정상적으로 처리되며, 복제된 요청은 미러 서버에서 별도의 분석이나 처리가 가능합니다. 이로 인해 실시간 트래픽 데이터를 안전하게 수집하고 테스트할 수 있는 강력한 도구로 활용됩니다.
이 글에서는 NGINX Plus 미러링 기능의 작동 방식과 이를 구현하는 방법, 그리고 미러링을 통해 얻을 수 있는 다양한 활용 사례에 대해 살펴보겠습니다.
목차
1. NGINX Plus 미러링 기능이란?
2. NGINX Plus 미러링 기능 활성화하기
3. 미러 서버 설정 및 로깅 예시
4. 결론
1. NGINX Plus 미러링 기능이란?
NGINX Plus 미러링 기능은 클라이언트의 원본 요청을 복제하여 별도의 미러 서버로 보내는 기능을 제공합니다. 이를 통해 실시간 트래픽 데이터를 복사하여 분석, 모니터링 또는 테스트 목적으로 활용할 수 있습니다. 미러링된 요청은 원본 요청과 동일한 형태로 전달되지만, 비동기적으로 처리되므로 클라이언트에게는 영향을 주지 않습니다.
미러링의 주요 목적은 트래픽 데이터를 안전하게 복제하여 별도의 환경에서 분석하거나 테스트하는 것입니다. 이를 통해 프로덕션 서버에 부하를 주지 않고도 실제 사용자 요청을 기반으로 다양한 작업을 수행할 수 있습니다. 예를 들어, 보안 모니터링, 성능 테스트, 로그 수집, A/B 테스트 등을 미러링된 요청을 통해 안전하게 진행할 수 있습니다.
- 비동기 처리:
- 미러링된 요청은 원본 요청과 별도로 처리됩니다. 즉, 클라이언트가 요청한 작업이 끝난 후에 미러링이 수행되므로 사용자 경험이나 서버 성능에 영향을 미치지 않습니다.
- 원본 요청에 영향 없음:
- 미러링된 요청은 별도의 서버로 전달되며, 원본 요청은 기존대로 백엔드 서버에서 정상적으로 처리됩니다. 따라서 미러링은 단순히 요청을 복사하는 역할만 하며, 클라이언트가 원본 요청의 결과에 영향을 받지 않습니다.
- 다양한 활용 가능성:
- 실시간 로그 수집: 미러 서버에서 미러링된 요청을 받아 실시간 트래픽 로그를 수집하고 분석할 수 있습니다.
- 보안 분석: 악성 트래픽이나 이상 징후를 감지하기 위한 보안 모니터링 시스템과 연동할 수 있습니다.
- 테스트 환경 구성: A/B 테스트나 새로운 애플리케이션 기능을 테스트할 때, 미러링된 트래픽을 사용하여 안전하게 테스트할 수 있습니다.
2. NGINX Plus 미러링 기능 활성화하기
NGINX Plus 미러링 기능을 활성화하는 방법은 아래와 같습니다.
location / {
mirror /mirror; # 원본 요청을 미러링할 URI를 설정합니다.
proxy_pass http://backend;
}
location = /mirror {
internal;
proxy_pass http://test_backend$request_uri;
}
위 예시 구성의 흐름은 다음과 같습니다.
- 클라이언트가
/로 시작하는 요청을 보냅니다. - NGINX는 이 요청을 처리하고, 원본 요청을
http://backend로 전달합니다. - 동시에, NGINX는 요청을
/mirror로 복제하여 **미러 서버인http://test_backend**로 전달합니다. /mirror는internal지시어로 보호되어 있으므로 클라이언트는 직접 접근할 수 없으며, 미러 서버는 요청 URI를 그대로 유지한 채http://test_backend로 전달합니다.
NGINX Plus 미러링 구성에 대한 가이드는 여기를 클릭하여 확인하세요.
3. 미러 서버 설정 및 로깅 예시
이제 NGINX Plus 미러링 을 구성하고 확인합니다.
log_format with_body '$proxy_add_x_forwarded_for - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" ["$request_body"]';
upstream backend {
zone backend 64k;
server 192.168.201.100:8080;
}
server {
listen 80;
server_name 192.168.201.100;
access_log /var/log/nginx/mirror-access.log;
location / {
proxy_pass http://backend;
mirror /mirror;
mirror_request_body on;
proxy_set_header X-Original-Body $request_body;
}
location /mirror {
internal;
proxy_pass http://192.168.201.80;
proxy_set_header X-Original-Body $request_body;
}
}
현재 upstream 서버의 응답은 다음과 같습니다:
# curl 192.168.201.100:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
NGINX 미러링 서버의 구성은 다음과 같습니다:
log_format with_body '$proxy_add_x_forwarded_for - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" ["$http_x_original_body"]';
server {
listen 80;
server_name 192.168.201.80;
location /mirror {
# 미러 요청이 도착했을 때 로그에 기록만 하는 서버
access_log /var/log/nginx/mirror-request.log with_body;
# 또는 다른 백엔드로 요청 전달 (로깅 후)
#proxy_pass http://backend_server;
client_body_in_single_buffer on;
add_header X-Original-Body $http_x_original_body;
# 원본 요청에 대해 응답을 주지 않음
return 200 "Mirrored Request Received.\n";
}
}
이제 192.168.201.100:80 으로 요청을 보냈을 때, upstream 서버의 응답을 받고, 미러 서버에 동일한 요청이 가는지 확인합니다.
# curl 192.168.201.100
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
NGINX 미러링 서버 로그를 확인합니다.
# tail /var/log/nginx/mirror-request.log
175.196.233.10, 192.168.201.100 - - [18/Oct/2024:05:30:23 +0000] "POST /mirror HTTP/1.0" 200 27 "http://175.196.233.104/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Whale/3.28.266.14 Safari/537.36" ["name=123&email=123"]
175.196.233.10, 192.168.201.100 - - [18/Oct/2024:05:30:29 +0000] "POST /mirror HTTP/1.0" 200 27 "http://175.196.233.104/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Whale/3.28.266.14 Safari/537.36" ["name=abc&email=abc"]
175.196.233.10, 192.168.201.100 - - [18/Oct/2024:05:30:33 +0000] "POST /mirror HTTP/1.0" 200 27 "http://175.196.233.104/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Whale/3.28.266.14 Safari/537.36" ["name=admin&email=admin"]
위 미러 서버의 로그와 같이 192.168.201.100으로 요청 시, 응답은 upstream의 서버가 하지만 미러 서버에도 동일한 요청이 전송되는 것을 확인할 수 있습니다.
4. 결론
NGINX의 미러링 기능은 단순히 요청을 복제하는 것을 넘어서, 미러링은 트래픽 분석과 보안 모니터링을 위한 강력한 플랫폼을 제공합니다. 이를 통해 기업은 사용자 행동을 분석하고, 성능 문제를 조기에 감지하며, 잠재적인 보안 위협에 즉시 대응할 수 있습니다.
결과적으로, NGINX의 미러링 기능은 웹 애플리케이션의 안정성, 성능 및 보안을 극대화하는 데 기여하며, 빠르게 변화하는 디지털 환경에서 경쟁력을 유지하는 데 필수적인 요소로 작용합니다.
NGINX Plus를 직접 사용해 보시려면 30일 무료 평가판을 신청하거나 NGINX STORE에 연락하여 논의하십시오.