NGINX: Analiza ruchu za pomocą modułu mirror

14 Jan 2019

best-practices  http  mirroring  modules  nginx 

Share on:

Kopiowanie ruchu jest bardzo przydatną funkcją, która nadaje się świetnie do diagnozowania błędów oraz szerszej analizy obsługiwanych żądań. Możliwość taką dostarcza wbudowany moduł ngx_http_mirror_module.

Polecam przeczytać materiał nginx mirroring tips and tricks.

Traffic mirroring można wykorzystać do:

Samo tworzenie kopii lustrzanych nie wpływa (nie wprowadza zmian w jego strukturze) na oryginalne żądania. Co więcej, analizowane są tylko żądania, a błędy w serwerze lustrzanym nie wpływają na backend główny.

Przykład wykorzystania:

location / {

  log_subrequest on;

  # Dwie kluczowe dyrektywy:
  mirror /backend-mirror;
  mirror_request_body on;

  proxy_pass http://bk_web01;

  # Wskazuje, czy pola nagłówka pierwotnego żądania i treści
  # przekazywane są do serwera proxy:
  proxy_pass_request_headers on;
  proxy_pass_request_body on;

  # Odkomentuj, jeśli występują opóźnienia:
  # keepalive_timeout 0;

}

location = /backend-mirror {

  internal;
  proxy_pass http://bk_web01_debug$request_uri;

  # Przekazujemy dodatkowe nagłówki do lustrzanego backend'u:
  proxy_set_header M-Server-Port $server_port;
  proxy_set_header M-Server-Addr $server_addr;
  proxy_set_header M-Host $host; # or $http_host for <host:port>
  proxy_set_header M-Real-IP $remote_addr;
  proxy_set_header M-Request-ID $request_id;
  proxy_set_header M-Original-URI $request_uri;

}

Jeśli używasz mirroringu, pamiętaj o możliwości występowania tzw. opóźnionego przetwarzania następnego żądania. Jest to znany (i zamierzony) efekt uboczny implementacji kopii lustrzanej w NGINX. Co więcej, w większości przypadków żądanie lustrzane nie wpływa na żądanie główne. Istnieją jednak dwa problemy z tworzeniem kopii lustrzanych: