Получаем IP-адреса HTTPS-клиентов с HAProxy (frontend) на Nginx (backend) в режимах HTTP и TCP-балансировки

Thank you for reading this post, don't forget to subscribe!

Доволь­но часто тре­бу­ет­ся балан­си­ро­вать нагруз­ку меж­ду несколь­ки­ми веб-сер­ве­ра­ми. При этом, как пра­ви­ло, необ­хо­ди­мо, что­бы веб-при­ло­же­ния полу­ча­ли реаль­ные IP-адре­са кли­ен­тов, а не IP балансировщика.

В слу­чае балан­си­ров­ки и тер­ми­на­ции HTTP(S)-трафика на HAProxy (Layer 7 [1]), дан­ная зада­ча лег­ко реша­ет­ся добав­ле­ни­ем заго­лов­ка “X-Real-IP” и его обра­бот­кой на Nginx при помо­щи моду­ля ngx_http_realip_module [2]. При балан­си­ров­ке TCP-тра­фи­ка от HTTPS-кли­ен­тов и пере­да­че его на веб-сер­ве­ра напря­мую без моди­фи­ка­ции или тер­ми­на­ции (Layer 4 [3]) доба­вить дан­ный заго­ло­вок невоз­мож­но, поэто­му тре­бу­ет­ся вос­поль­зо­вать­ся воз­мож­но­стя­ми, предо­став­ля­е­мы­ми Proxy Protocol [456].

Рас­смот­рим оба вари­ан­та (балан­си­ров­ка L7 и L4) на при­ме­ре выдер­жек из кон­фи­гу­ра­ци­он­ных фай­лов haproxy 1.5.9 и nginx 1.6.2

Балансировка на прикладном уровне (Layer 7): терминация HTTPS-трафика на HAProxy и передача по HTTPS на Nginx

В дан­ном при­ме­ре HTTPS-тра­фик от кли­ен­та тер­ми­ни­ру­ет­ся на HAProxy, моди­фи­ци­ру­ет­ся и пере­да­ет­ся на Nginx так же по HTTPS.

cat haproxy.cfg

[codesyntax lang="php"]

[/codesyntax]

cat nginx.conf

[codesyntax lang="php"]

[/codesyntax]

Балансировка на транспортном уровне (Layer 4): передача TCP-трафика с HAProxy на Nginx

В дан­ном при­ме­ре HTTPS-тра­фик кли­ен­тов не моди­фи­ци­ру­ет­ся (HAProxy вме­ши­ва­ет­ся в транс­порт­ный уро­вень) и его тер­ми­на­ция про­ис­хо­дит непо­сред­ствен­но на Nginx.

cat haproxy.cfg

[codesyntax lang="php"]

[/codesyntax]

cat nginx.conf

[codesyntax lang="php"]

[/codesyntax]

Исполь­зуя опи­сан­ные выше настрой­ки мы смог­ли пере­дать веб-сер­ве­ру Nginx, рас­по­ло­жен­но­му за HAProxy, реаль­ные IP-адре­са кли­ен­тов при рабо­те по HTTPS. Подоб­ным под­хо­дом так же мож­но вос­поль­зо­вать­ся при рабо­те со сто­рон­ни­ми балан­си­ров­щи­ка­ми нагруз­ки, напри­мер CloudFlare [78] и AWS ELB [910].