{"id":471709,"date":"2025-08-23T15:00:46","date_gmt":"2025-08-23T15:00:46","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=471709"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=471709","title":{"rendered":"<span>Proxy-\u0432\u043e\u0439\u043d\u044b: \u041a\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u043d\u0430\u0434\u0435\u0436\u043d\u0435\u0435 \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u0435\u0435 \u0432 2025? (HAProxy vs NGINX vs Envoy)<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u043f\u0438\u0441\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u044e \u043f\u0440\u043e <a href=\"https:\/\/habr.com\/ru\/companies\/gnivc\/articles\/935146\/\" rel=\"noopener noreferrer nofollow\">HAProxy<\/a>, \u0443 \u043c\u0435\u043d\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0434\u0435\u044f \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c proxy-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441 <a href=\"https:\/\/habr.com\/ru\/companies\/gnivc\/articles\/864528\/\" rel=\"noopener noreferrer nofollow\">Envoy<\/a>. \u041d\u043e \u0442\u043e\u0433\u0434\u0430 \u043c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0432 \u0432\u0438\u0434\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438\u043b\u0438 \u043f\u0430\u0440\u044b \u0430\u0431\u0437\u0430\u0446\u0435\u0432 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u2014 \u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u2014 \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c! \u0417\u0434\u0435\u0441\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u043d\u0435 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043d\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u2014 \u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0430\u0436\u043d\u044b \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435.<\/p>\n<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0437\u0431\u0435\u0440\u0443 \u0442\u0440\u0438 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043f\u0440\u043e\u043a\u0441\u0438, \u0441\u0440\u0430\u0432\u043d\u044e \u0438\u0445 \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443: \u0447\u0442\u043e, \u0433\u0434\u0435 \u0438 \u043a\u043e\u0433\u0434\u0430 \u043b\u0443\u0447\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c. \u041f\u043e\u0434 \u00ab\u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c\u0438\u00bb \u044f \u0438\u043c\u0435\u044e \u0432 \u0432\u0438\u0434\u0443 \u0442\u0435, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441\u0430\u043c \u0438 \u0438\u0437\u0443\u0447\u0438\u043b \u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u00ab\u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c\u00bb. \u041f\u0440\u043e\u043a\u0441\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u043d\u043e \u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443 \u2014 \u043b\u0438\u0431\u043e \u043d\u0435 \u043a\u043e\u043f\u0430\u043b \u0433\u043b\u0443\u0431\u043e\u043a\u043e, \u043b\u0438\u0431\u043e \u0437\u043d\u0430\u044e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0430\u043b\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438\u0445 \u0432 \u0440\u0430\u0437\u0431\u043e\u0440. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u043c\u0435\u0447\u0443 \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438: \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u0437\u0430\u043f\u0443\u0442\u0430\u043d\u0430 \u0438\u043b\u0438 \u043d\u0435\u043f\u043e\u043b\u043d\u0430, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0433\u0430\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u0438 \u0433\u0434\u0435 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c, \u0430 \u044d\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043e\u0442\u0431\u0438\u0432\u0430\u0435\u0442 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c.<\/p>\n<p><strong>HAProxy 3.3<\/strong>, <strong>NGINX 1.29<\/strong> \u0438 <strong>Envoy 1.35<\/strong> \u2014 \u0442\u0440\u0438 open source-\u043f\u0440\u043e\u043a\u0441\u0438 \u0441 \u0440\u0430\u0437\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439 \u0438 \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f. Enterprise-\u0432\u0435\u0440\u0441\u0438\u0438 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443 \u2014 \u043a\u0430\u043f\u0438\u0442\u0430\u043b\u0438\u0437\u043c \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0432\u043e\u0435 \u0434\u0435\u043b\u043e: \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u044b\u0445 \u043e\u0442\u043b\u0438\u0447\u0438\u0439 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u0442, \u0430 \u0432\u043e\u0442 \u0432 OSS-\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u0445 \u0435\u0441\u0442\u044c \u0447\u0442\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u2014 \u0432 \u0440\u044f\u0434\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0446\u0438\u044f \u043f\u043e\u0448\u043b\u0430 \u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u0443.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c. \u0420\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c \u0441\u0430\u043c\u044b\u0435 \u0441\u0432\u0435\u0436\u0438\u0435 \u0440\u0435\u043b\u0438\u0437\u044b \u043d\u0430 \u0434\u0430\u0442\u0443 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438.<\/p>\n<p><strong>\u041f\u043b\u0430\u043d \u0440\u0430\u0437\u0431\u043e\u0440\u0430:<\/strong><\/p>\n<ol>\n<li>\n<p><strong>\u0426\u0435\u043b\u044c \u0438 \u0432\u0435\u0440\u0441\u0438\u0438 <\/strong>(\u0442\u043e\u043b\u044c\u043a\u043e open source, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 stable-\u0432\u0435\u0442\u043a\u0438)<\/p>\n<\/li>\n<li>\n<p><strong>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 <\/strong>(\u041c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u0442\u043e\u043a\u043e\u0432\/\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, event-loop, \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f vs \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f (xDS, Data Plane API).<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b<\/strong> L4\/L7 (HTTP\/1.1, HTTP\/2, HTTP\/3\/QUIC, gRPC, WebSocket, TCP\/UDP)<\/p>\n<\/li>\n<li>\n<p><strong>\u0411\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u044f<\/strong> (\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b round-robin, least-conn, hash, L7-\u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b, \u0430\u0444\u0444\u0438\u043d\u0438\u0442\u0438)<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u0438 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c<\/strong> (Health-check, retries, circuit-breaking, rate-limiting)<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u044c <\/strong>(\u041c\u0435\u0442\u0440\u0438\u043a\u0438 Prometheus\/StatsD, \u043b\u043e\u0433\u0438, OpenTelemetry\/Jaeger, \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430)<\/p>\n<\/li>\n<li>\n<p><strong>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c <\/strong>(TLS 1.3, mTLS, RBAC, OAuth\/JWT)<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 <\/strong>(\u041e\u0431\u043b\u0430\u0441\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435, \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435)<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u0430\u0439\u043c\u0430\u0443\u0442\u044b <\/strong>(\u0432\u0438\u0434\u044b, \u0433\u0434\u0435\\\u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c, \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b)<\/p>\n<\/li>\n<li>\n<p><strong>Kubernetes-\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f (<\/strong>gateway, ingress, service mesh)<\/p>\n<\/li>\n<\/ol>\n<h2>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h2>\n<p><strong>HAProxy.<\/strong> \u0412\u044b\u0441\u043e\u043a\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 L4\/L7-\u043f\u0440\u043e\u043a\u0441\u0438 \u0441 \u043c\u043e\u0434\u0435\u043b\u044c\u044e master\u2013worker \u0438 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u043c event-loop. \u041c\u0430\u0441\u0442\u0435\u0440 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438, \u0432\u043e\u0440\u043a\u0435\u0440\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u0442\u0440\u0430\u0444\u0438\u043a \u2014 \u043a\u0430\u043a \u0448\u0435\u0444-\u043f\u043e\u0432\u0430\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0435\u0442 \u0435\u0434\u0443, \u043d\u043e \u0441\u043b\u0435\u0434\u0438\u0442, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0432\u0430\u0440\u0430 \u043d\u0435 \u0441\u043f\u0430\u043b\u0438. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 TCP\/HTTP, TLS-\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0446\u0438\u044e, health-checks \u0438 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438. \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u0430, \u043d\u043e \u0435\u0441\u0442\u044c Runtime API \u0434\u043b\u044f \u0436\u0438\u0432\u044b\u0445 \u043f\u0440\u0430\u0432\u043e\u043a; \u043f\u043e\u043b\u043d\u044b\u0439 reconfigure \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0431\u0435\u0441\u0448\u043e\u0432\u043d\u044b\u0439 reload. \u0422\u0438\u043f\u043e\u0432\u043e\u0439 \u043a\u0435\u0439\u0441: <code>frontend<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 HTTPS, \u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u0443\u0435\u0442 TLS, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 <code>backend<\/code> \u043f\u043e <code>leastconn<\/code> \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u2014 pipeline \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0435\u0435, \u0447\u0435\u043c \u0431\u044e\u0434\u0436\u0435\u0442 \u0432 \u0441\u0442\u0430\u0440\u0442\u0430\u043f\u0435. <\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e00\/4f0\/5e2\/e004f05e21781f6616b9f8a6fa22b89e.png\" width=\"850\" height=\"288\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/e00\/4f0\/5e2\/e004f05e21781f6616b9f8a6fa22b89e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e00\/4f0\/5e2\/e004f05e21781f6616b9f8a6fa22b89e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p><strong>NGINX.<\/strong> \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u00abmaster + workers\u00bb. \u0412\u043e\u0440\u043a\u0435\u0440\u044b \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 TLS\/HTTP, \u043f\u0430\u0440\u0441\u044f\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442 \u0444\u0438\u043b\u044c\u0442\u0440\u044b, \u043a\u0435\u0448 \u0438 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u0443\u044e\u0442 \u043d\u0430 <code>upstream<\/code>. \u0425\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439, \u0435\u0441\u043b\u0438 \u00ab\u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430\u00bb \u043d\u0443\u0436\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 Lua. \u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0431\u0435\u0441\u0448\u043e\u0432\u043d\u0430\u044f: \u0441\u0442\u0430\u0440\u044b\u0435 \u0432\u043e\u0440\u043a\u0435\u0440\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043d\u043e\u0432\u044b\u0435 \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b \u2014 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0434\u0440\u0430\u043c\u044b, \u043a\u0440\u043e\u043c\u0435 \u043a\u0430\u043a \u0443 \u0430\u0434\u043c\u0438\u043d\u0430 \u0432 3 \u043d\u043e\u0447\u0438. \u0422\u0438\u043f\u043e\u0432\u043e\u0439 \u043a\u0435\u0439\u0441: <code>server<\/code> \u0441 <code>proxy_pass<\/code> \u043d\u0430 \u043f\u0443\u043b API, \u0441 \u043a\u0435\u0448\u0435\u043c \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043f\u043e \u043a\u043b\u044e\u0447\u0443. JWT\/OAuth? \u0418\u043b\u0438 Plus, \u0438\u043b\u0438 Lua \u2014 \u0432\u044b\u0431\u0438\u0440\u0430\u0439\u0442\u0435, \u0447\u0442\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u043b\u043e\u043c\u0430\u0435\u0442 \u043c\u043e\u0437\u0433.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/beb\/008\/8a6\/beb0088a65aa03f7c7314a030b4eb154.png\" width=\"1039\" height=\"509\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/beb\/008\/8a6\/beb0088a65aa03f7c7314a030b4eb154.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/beb\/008\/8a6\/beb0088a65aa03f7c7314a030b4eb154.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p><strong>Envoy.<\/strong> \u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 L4\/L7-\u043f\u0440\u043e\u043a\u0441\u0438 \u0441 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/latest\/intro\/arch_overview\/operations\/dynamic_configuration#xds-configuration-api-overview\" rel=\"noopener noreferrer nofollow\">xDS<\/a>. \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0434\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u0438\u0431\u043a\u0430\u044f \u0434\u043e \u0430\u0431\u0441\u0443\u0440\u0434\u0430: \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0442\u0440\u0430\u0444\u0438\u043a \u0445\u043e\u0442\u044c \u043d\u0430 \u043a\u043e\u0444\u0435\u043c\u0430\u0448\u0438\u043d\u0443, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u043e\u0431\u044a\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432 <a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/latest\/intro\/arch_overview\/operations\/dynamic_configuration#eds\" rel=\"noopener noreferrer nofollow\">EDS<\/a>. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 HTTP\/1.1, HTTP\/2, HTTP\/3, gRPC, \u0440\u0435\u0442\u0440\u0430\u0438, \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 hot-restart \u0431\u0435\u0437 \u043e\u0431\u0440\u044b\u0432\u0430 \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u2014 \u0445\u043e\u0442\u044c \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0439\u0441\u044f \u043a\u0430\u0436\u0434\u0443\u044e \u043c\u0438\u043d\u0443\u0442\u0443. \u0422\u0438\u043f\u043e\u0432\u043e\u0439 \u043a\u0435\u0439\u0441: listener \u0441 TLS, \u0434\u0430\u043b\u0435\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432 (ALPN \u2192 HTTP\/2 \u2192 router) \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u0442 gRPC-\u043f\u043e\u0442\u043e\u043a\u0438 \u043f\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0430\u043c\u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0438 \u0443\u0445\u043e\u0434\u044f\u0442, \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u0434\u0435\u043c\u043e.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f85\/dc5\/51d\/f85dc551d5c3e65be55378b7aee78024.png\" width=\"1024\" height=\"588\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f85\/dc5\/51d\/f85dc551d5c3e65be55378b7aee78024.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f85\/dc5\/51d\/f85dc551d5c3e65be55378b7aee78024.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p><strong>\u0418\u0442\u043e\u0433\u043e \u043f\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435:<\/strong><\/p>\n<ul>\n<li>\n<p>HAProxy \u2014 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0437\u043c, \u0432\u044b\u0441\u043e\u043a\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043c\u0430\u0433\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>NGINX \u2014 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u0437\u0440\u0435\u043b\u0430\u044f \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u043d\u043e \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c\u044e.<\/p>\n<\/li>\n<li>\n<p>Envoy \u2014 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u0438 API-\u0446\u0435\u043d\u0442\u0440\u0438\u0447\u043d\u043e\u0441\u0442\u044c, \u043d\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0432 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h2>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b <\/h2>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bfe\/a5f\/cdf\/bfea5fcdf44d5a001ef708032cf694dd.gif\" width=\"800\" height=\"600\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bfe\/a5f\/cdf\/bfea5fcdf44d5a001ef708032cf694dd.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bfe\/a5f\/cdf\/bfea5fcdf44d5a001ef708032cf694dd.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>HAProxy \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a TCP\/UDP-\u043f\u0440\u043e\u043a\u0441\u0438 \u0438 \u043f\u043e\u043b\u043d\u043e\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 HTTP-\u043f\u0440\u043e\u043a\u0441\u0438. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 HTTP\/1.1, HTTP\/2 \u0438 HTTP\/3 (<code>QUIC<\/code>), \u0432\u043a\u043b\u044e\u0447\u0430\u044f ALPN (<code>Application-Layer Protocol Negotiation<\/code>) \u0438 SNI (<code>Server Name Indication<\/code>). \u041c\u043e\u0436\u0435\u0442 \u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c TLS \u0438\u043b\u0438 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c TLS passthrough. gRPC \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 HTTP\/2 \u0431\u0435\u0437 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432.   <\/p>\n<pre><code class=\"go\"> frontend fe   mode http   bind :80   bind :443  ssl crt \/etc\/haproxy\/certs\/foo.com\/cert.crt alpn h2   bind quic4@:443 ssl crt \/mycert.pem alpn h3   http-request redirect scheme https unless { ssl_fc }   http-after-response add-header alt-svc 'h3=\":443\"; ma=60'  backend be_api     mode http     option httpchk GET \/health     server s1 10.0.0.31:443 ssl verify none sni str(api.example.com) alpn h2 check     server s2 10.0.0.32:443 ssl verify none sni str(api.example.com) alpn h2 check<\/code><\/pre>\n<p>\u0412\u0445\u043e\u0434\u044f\u0449\u0438\u0439 TLS-\u0442\u0440\u0430\u0444\u0438\u043a \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 443, ALPN \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 HTTP\/2 \u0438\u043b\u0438 HTTP\/3, \u0437\u0430\u0442\u0435\u043c HAProxy \u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435, \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u0443\u0435\u0442 \u043f\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 h2 \u0438 \u0448\u0438\u0444\u0440\u0443\u0435\u0442 \u0442\u0440\u0430\u0444\u0438\u043a \u0437\u0430\u043d\u043e\u0432\u043e. \u041f\u043b\u044e\u0441\u044b: \u0432\u044b\u0441\u043e\u043a\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430 L4 \u0438 L7, \u0437\u0440\u0435\u043b\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 HTTP\/2. \u041c\u0438\u043d\u0443\u0441\u044b: \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 HTTP\/3\/QUIC \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438; \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 L7-\u043f\u0440\u0430\u0432\u0438\u043b \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e ACL \u0438 Lua. Downstream\/Upstream: HAProxy \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c HTTP\/1.1, HTTP\/2 \u0438\u043b\u0438 HTTP\/3 \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 (downstream) \u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043a \u0431\u044d\u043a\u0435\u043d\u0434\u0443 (upstream). \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 h1\u2192h2, h2\u2192h1, h2\u2192h2, h3\u2192h1 \u0438 \u0442.\u0434., \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043c\u0435\u0436\u0434\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0431\u0435\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439.    <\/p>\n<p>NGINX \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a TCP-stream \u043f\u0440\u043e\u043a\u0441\u0438 \u0438 \u043a\u0430\u043a HTTP-\u043f\u0440\u043e\u043a\u0441\u0438. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 HTTP\/1.1 \u0438 HTTP\/2 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438. HTTP\/3\/QUIC \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 1.25+ \u0447\u0435\u0440\u0435\u0437 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u044b <code>quic<\/code> \u0438 <code>http3<\/code>. gRPC \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c <code>grpc_pass<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0432\u0435\u0440\u0445 HTTP\/2.<\/p>\n<pre><code class=\"nginx\">server {     listen 443 ssl http2;     ssl_certificate     \/etc\/nginx\/certs\/site.pem;     ssl_certificate_key \/etc\/nginx\/certs\/site.key;      location \/ {         proxy_pass https:\/\/backend_pool;         proxy_http_version 1.1;     } }  server {     listen 8443 quic reuseport;     listen 8443 ssl;     ssl_certificate     \/etc\/nginx\/certs\/site.pem;     ssl_certificate_key \/etc\/nginx\/certs\/site.key;      location \/api {         add_header Alt-Svc 'h3=\":8443\"; ma=86400';         proxy_pass https:\/\/backend_pool;         proxy_http_version 1.1;     } }  upstream backend_pool {     least_conn;     server 10.0.0.31:443;     server 10.0.0.32:443; } <\/code><\/pre>\n<p>NGINX \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 TLS-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 HTTP\/2 \u0438\u043b\u0438 HTTP\/3 \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u043d\u043e \u043a backend \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0445\u043e\u0434\u0438\u0442 \u043f\u043e HTTP\/1.1 (\u043a\u0440\u043e\u043c\u0435 gRPC). \u041f\u043b\u044e\u0441\u044b: \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 HTTP\/2, \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433. \u041c\u0438\u043d\u0443\u0441\u044b: HTTP\/3 \u043c\u0435\u043d\u0435\u0435 \u0437\u0440\u0435\u043b\u044b\u0439 \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f; stream-\u0440\u0435\u0436\u0438\u043c TCP \u043d\u0435 \u0434\u0430\u0451\u0442 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0439 L7-\u043b\u043e\u0433\u0438\u043a\u0438; \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0432 Plus-\u0432\u0435\u0440\u0441\u0438\u0438. Downstream\/Upstream: \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043f\u043e HTTP\/1.1, HTTP\/2 \u0438\u043b\u0438 HTTP\/3, \u043d\u043e \u043a backend \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e HTTP\/1.1 (\u043a\u0440\u043e\u043c\u0435 gRPC-location).<\/p>\n<p>Envoy \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u043a\u0430\u043a L4\/L7-\u043f\u0440\u043e\u043a\u0441\u0438 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 <a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/latest\/configuration\/listeners\/network_filters\/tcp_proxy_filter\" rel=\"noopener noreferrer nofollow\">TCP<\/a>\/<a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/latest\/configuration\/listeners\/udp_filters\/udp_proxy\" rel=\"noopener noreferrer nofollow\">UDP <\/a>HTTP\/1.1, HTTP\/2, HTTP\/3 \u0438 gRPC. \u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 ALPN, \u0430 \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u043a TCP, \u0442\u0430\u043a \u0438 \u043f\u043e\u043b\u043d\u044b\u0439 HTTP-\u043f\u043e\u0442\u043e\u043a. \u0414\u043b\u044f upstream \u043d\u0430 TLS\/443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c <code>http2_protocol_options<\/code> \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c <code>transport_socket<\/code> \u0434\u043b\u044f TLS.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u043e\u043d\u0444\u0438\u0433 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 h1\/h2\/h3<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"go\">admin:   address:     socket_address:       address: 127.0.0.1       port_value: 9901  static_resources:   listeners:   - name: main_listener     address:       socket_address:         address: 0.0.0.0         port_value: 443     # TLS \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0434\u043b\u044f HTTPS     listener_filters:     - name: envoy.filters.listener.tls_inspector       typed_config:         \"@type\": type.googleapis.com\/envoy.extensions.filters.listener.tls_inspector.v3.TlsInspector      filter_chains:     - filter_chain_match:         application_protocols: [\"h2\", \"http\/1.1\"]       transport_socket:         name: envoy.transport_sockets.tls         typed_config:           \"@type\": type.googleapis.com\/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsConfig           common_tls_context:             tls_certificates:             - certificate_chain: {filename: \"\/etc\/envoy\/cert.pem\"}               private_key: {filename: \"\/etc\/envoy\/privkey.pem\"}           require_client_certificate: false       filters:       - name: envoy.filters.network.http_connection_manager         typed_config:           \"@type\": type.googleapis.com\/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager           stat_prefix: ingress_http           http2_protocol_options: {}           http_protocol_options: {}           codec_type: AUTO            route_config:             name: local_route             virtual_hosts:             - name: local_service               domains: [\"*\"]               routes:               - match: {prefix: \"\/\"}                 route: {cluster: backend_cluster}            http_filters:           - name: envoy.filters.http.router             typed_config:               \"@type\": type.googleapis.com\/envoy.extensions.filters.http.router.v3.Router      # \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 filter chain \u0434\u043b\u044f HTTP\/3     - filter_chain_match:         transport_protocol: \"quic\"       transport_socket:         name: envoy.transport_sockets.quic         typed_config:           \"@type\": type.googleapis.com\/envoy.extensions.transport_sockets.quic.v3.QuicDownstreamTransportConfig           downstream_tls_context:             common_tls_context:               tls_certificates:               - certificate_chain: {filename: \"\/etc\/envoy\/cert.pem\"}                 private_key: {filename: \"\/etc\/envoy\/privkey.pem\"}       filters:       - name: envoy.filters.network.http_connection_manager         typed_config:           \"@type\": type.googleapis.com\/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager           stat_prefix: ingress_http_quic           http2_protocol_options: {}           http_protocol_options: {}           codec_type: HTTP3            route_config:             name: local_route_quic             virtual_hosts:             - name: local_service               domains: [\"*\"]               routes:               - match: {prefix: \"\/\"}                 route: {cluster: backend_cluster}            http_filters:           - name: envoy.filters.http.router             typed_config:               \"@type\": type.googleapis.com\/envoy.extensions.filters.http.router.v3.Router      # UDP listener \u0434\u043b\u044f QUIC     udp_listener_config:       quic_options: {}    clusters:   - name: backend_cluster     connect_timeout: 5s     type: STATIC     lb_policy: ROUND_ROBIN     typed_extension_protocol_options:       envoy.extensions.upstreams.http.v3.HttpProtocolOptions:         \"@type\": type.googleapis.com\/envoy.extensions.upstreams.http.v3.HttpProtocolOptions         explicit_http_config:           http2_protocol_options: {}     load_assignment:       cluster_name: backend_cluster       endpoints:       - lb_endpoints:         - endpoint:             address:               socket_address:                 address: 127.0.0.1                 port_value: 8080<\/code><\/pre>\n<\/div>\n<\/details>\n<p>Envoy listener \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043d\u0430 443, \u0441\u0430\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b (h1\/h2\/h3), \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u043d\u0430 \u043f\u0443\u043b \u0441 \u0442\u0435\u043c \u0436\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u043c \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0435\u0433\u043e \u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c. gRPC \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u043e \u0447\u0435\u0440\u0435\u0437 HTTP\/2. \u041f\u043b\u044e\u0441\u044b: \u043f\u043e\u043b\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432, \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0444\u0438\u043b\u044c\u0442\u0440\u044b, \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b. \u041c\u0438\u043d\u0443\u0441\u044b: \u0432\u044b\u0448\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 TCP-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432. Downstream\/Upstream: Envoy \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u043b\u044e\u0431\u044b\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u2014 h1\u2194h2\u2194h3 \u0432 \u043b\u044e\u0431\u044b\u0445 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f\u0445. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c h3 downstream \u0438 \u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0431\u044d\u043a\u0435\u043d\u0434\u0443 \u043f\u043e h1, \u0438\u043b\u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442.<\/p>\n<p><strong>HAProxy<\/strong> \u2014 \u0447\u0435\u043c\u043f\u0438\u043e\u043d \u043f\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438, \u0431\u0443\u0434\u0442\u043e \u0441 \u0434\u043e\u043f\u0438\u043d\u0433\u043e\u043c. \u0413\u043b\u043e\u0442\u0430\u0435\u0442 TCP, HTTP\/1.1, HTTP\/2, HTTP\/3 \u0438 \u0434\u0430\u0436\u0435 gRPC \u0431\u0435\u0437 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439. \u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b downstream\/upstream \u043c\u043e\u0436\u043d\u043e \u043c\u0438\u043a\u0441\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043a\u043e\u043a\u0442\u0435\u0439\u043b\u0438 \u043d\u0430 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u0435 \u2014 \u0445\u043e\u0442\u044c h3\u2192h1, \u0445\u043e\u0442\u044c h1\u2192h2. \u041c\u0438\u043d\u0443\u0441: \u0434\u043b\u044f QUIC \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u0432\u043e\u0437\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0443\u0447\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439, \u0430 \u0437\u0430 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 L7-\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u2014 \u0442\u043e\u043b\u044c\u043a\u043e ACL \u0438 Lua, \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u043c\u0430\u0433\u0438\u0438. \u041d\u043e \u0437\u0430\u0442\u043e latency \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f, \u043a\u0430\u043a \u0443 \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u044d\u0441\u043f\u0440\u0435\u0441\u0441\u043e.<\/p>\n<p><strong>NGINX <\/strong>\u2014 \u043d\u0430\u0434\u0451\u0436\u0435\u043d \u043a\u0430\u043a \u0434\u0435\u0434\u043e\u0432\u0441\u043a\u0438\u0439 \u0436\u0438\u0433\u0443\u043b\u044c: HTTP\/2 \u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e, HTTP\/3 \u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0435\u043d \u00ab\u043d\u0430 \u0441\u0438\u043d\u044e\u044e \u0438\u0437\u043e\u043b\u0435\u043d\u0442\u0443\u00bb, \u0430 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 L7-\u043b\u043e\u0433\u0438\u043a\u0438 \u043d\u0435 \u0436\u0434\u0438. TCP \u0447\u0435\u0440\u0435\u0437 stream \u0438\u0434\u0451\u0442, \u043d\u043e \u0430\u043f\u0433\u0440\u0435\u0439\u0434 backend \u0434\u043e h2 \u043d\u0435 \u0437\u0430\u0432\u0435\u0437\u0443\u0442 \u2014 \u0445\u043e\u0447\u0435\u0448\u044c \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u0430, \u0441\u043c\u043e\u0442\u0440\u0438 NGINX Plus.  <\/p>\n<p><strong>Envoy<\/strong> \u2014 \u043a\u0430\u043a \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u0441 \u043d\u0435\u043c\u0435\u0446\u043a\u0438\u043c \u0434\u0438\u043f\u043b\u043e\u043c\u043e\u043c: \u0436\u043e\u043d\u0433\u043b\u0438\u0440\u0443\u0435\u0442 h1\/h2\/h3 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u043c\u0438, \u043d\u0435 \u043f\u043e\u0442\u0435\u044f \u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044f\u0441\u044c. Downstream \u0445\u043e\u0442\u044c HTTP\/3, backend \u0445\u043e\u0442\u044c HTTP\/1.1 \u2014 \u0432\u0441\u0451 \u043f\u043e\u0434 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u043c. \u041d\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0435\u0441\u0442 \u043a\u0430\u043a \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0441 \u0441\u043e\u0442\u043d\u0435\u0439 \u0432\u043a\u043b\u0430\u0434\u043e\u043a \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0437\u043d\u0430\u043d\u0438\u0439 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 DevOps-\u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0439. <\/p>\n<p><strong>\u0412\u044b\u0432\u043e\u0434:<\/strong><\/p>\n<ul>\n<li>\n<p>HAProxy \u2014 \u0431\u0440\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u0430 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0438 \u0437\u0440\u0435\u043b\u044b\u0439 HTTP\/1\/2 \u0431\u0435\u0437 \u043f\u043b\u044f\u0441\u043e\u043a.<\/p>\n<\/li>\n<li>\n<p>NGINX \u2014 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0434\u043b\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e HTTP\/1\/2 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0430, \u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043f\u0440\u043e \u0441\u043b\u0430\u0431\u044b\u0439 upstream-\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b.<\/p>\n<\/li>\n<li>\n<p>Envoy \u2014 \u043a\u043e\u0440\u043e\u043b\u044c gRPC \u0438 \u043b\u044e\u0431\u044b\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044c\u043d\u044b\u0445 \u043c\u0438\u043a\u0441\u043e\u0432, \u043d\u043e \u0434\u043b\u044f \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e L4-\u043f\u0440\u043e\u043a\u0441\u0438 \u044d\u0442\u043e \u043a\u0430\u043a \u043d\u0430 Porsche \u043a\u0430\u0440\u0442\u043e\u0448\u043a\u0443 \u0432\u043e\u0437\u0438\u0442\u044c.<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h2>\u0411\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u044f  <\/h2>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b65\/97e\/d90\/b6597ed90430e5bb4fad7de987f8c4e7.gif\" width=\"1200\" height=\"577\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b65\/97e\/d90\/b6597ed90430e5bb4fad7de987f8c4e7.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b65\/97e\/d90\/b6597ed90430e5bb4fad7de987f8c4e7.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>HAProxy \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438: <code>roundrobin<\/code>, <code>leastconn<\/code>, <code>source<\/code>, <code>uri<\/code>, <code>hdr<\/code>, <code>consistent-hash<\/code>. \u041c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0440\u043e\u0432\u043d\u044f L7 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 ACL: \u043c\u043e\u0436\u043d\u043e \u043c\u0430\u0442\u0447\u0438\u0442\u044c \u043f\u043e URI, \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c, TLS-\u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0430\u043c (JA3\/JA4) \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Lua.<\/p>\n<pre><code class=\"go\">frontend fe_api     bind :443 ssl crt \/etc\/haproxy\/certs\/api.pem     acl v1 path_beg \/v1\/     use_backend be_v1 if v1     default_backend be_v2  backend be_v1     balance leastconn     server s1 10.0.0.41:443 ssl verify none check     server s2 10.0.0.42:443 ssl verify none check  backend be_v2     balance uri     hash-type consistent     server s3 10.0.0.43:443 ssl verify none check     server s4 10.0.0.44:443 ssl verify none check <\/code><\/pre>\n<p>\u0424\u0440\u043e\u043d\u0442\u0435\u043d\u0434 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 HTTPS-\u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0443\u0442\u044c <code>\/v1\/<\/code> \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0445 \u0432 \u043f\u0443\u043b <code>be_v1<\/code> \u0441 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u043f\u043e \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u043c\u0443 \u0447\u0438\u0441\u043b\u0443 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0432 \u043f\u0443\u043b <code>be_v2<\/code> \u0441 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u044b\u043c \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c URI.  <\/p>\n<p>NGINX \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b: <code>round_robin<\/code> (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e), <code>least_conn<\/code>, <code>ip_hash<\/code>, <code>hash<\/code> \u0441 \u043e\u043f\u0446\u0438\u0435\u0439 <code>consistent<\/code>. \u041c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0443\u0440\u043e\u0432\u043d\u044f L7 \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>location<\/code>. \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 reload.   <\/p>\n<pre><code class=\"nginx\">upstream api_v1 {     least_conn;     server api1.local:443;     server api2.local:443; } upstream api_v2 {     hash $request_uri consistent;     server api3.local:443;     server api4.local:443; } server {     listen 443 ssl http2;     ssl_certificate     \/etc\/nginx\/certs\/api.pem;     ssl_certificate_key \/etc\/nginx\/certs\/api.key;     proxy_ssl_server_name on;     location \/v1\/ { proxy_pass https:\/\/api_v1; }     location \/    { proxy_pass https:\/\/api_v2; } } <\/code><\/pre>\n<p> \u0417\u0430\u043f\u0440\u043e\u0441\u044b \u043a <code>\/v1\/<\/code> \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u043f\u0443\u043b <code>api_v1<\/code> \u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c <code>least_conn<\/code>. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u2014 \u043d\u0430 <code>api_v2<\/code> \u0441 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u044b\u043c \u0445\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c URI.  <\/p>\n<p>Envoy \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b: <code>round_robin<\/code>, <code>least_request<\/code>, <code>maglev<\/code>, <code>ring_hash<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u0435\u0441\u0430, \u043a\u0430\u043d\u0430\u0440\u0435\u0435\u0447\u043d\u044b\u0435 \u0440\u0435\u043b\u0438\u0437\u044b, shadow-\u0442\u0440\u0430\u0444\u0438\u043a. \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 xDS.<\/p>\n<pre><code class=\"go\">static_resources:   listeners:   - name: https_listener     address: { socket_address: { address: 0.0.0.0, port_value: 443 } }     filter_chains:     - transport_socket:         name: envoy.transport_sockets.tls         typed_config:           \"@type\": type.googleapis.com\/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext           common_tls_context:             tls_certificates:             - certificate_chain: { filename: \"\/etc\/envoy\/tls\/api.crt\" }               private_key:       { filename: \"\/etc\/envoy\/tls\/api.key\" }       filters:       - name: envoy.filters.network.http_connection_manager         typed_config:           \"@type\": type.googleapis.com\/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager           stat_prefix: ingress           route_config:             virtual_hosts:             - name: api               domains: [\"*\"]               routes:               - match: { prefix: \"\/v1\/\" }                 route: { cluster: api_v1 }               - match: { prefix: \"\/\" }                 route: { cluster: api_v2 }           http_filters:           - name: envoy.filters.http.router   clusters:   - name: api_v1     lb_policy: LEAST_REQUEST     transport_socket:       name: envoy.transport_sockets.tls       typed_config:         \"@type\": type.googleapis.com\/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext         sni: \"api.internal\"     load_assignment:       cluster_name: api_v1       endpoints:       - lb_endpoints:         - endpoint: { address: { socket_address: { address: api1.local, port_value: 443 }}}   - name: api_v2     lb_policy: MAGLEV     transport_socket:       name: envoy.transport_sockets.tls       typed_config:         \"@type\": type.googleapis.com\/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext         sni: \"api.internal\"     load_assignment:       cluster_name: api_v2       endpoints:       - lb_endpoints:         - endpoint: { address: { socket_address: { address: api3.local, port_value: 443 }}} <\/code><\/pre>\n<p> Envoy \u0441\u043b\u0443\u0448\u0430\u0435\u0442 HTTPS-\u0442\u0440\u0430\u0444\u0438\u043a \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 443, \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u043e \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0443 URI: <code>\/v1\/<\/code> \u2192 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 <code>api_v1<\/code> (least_request), <code>\/<\/code> \u2192 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 <code>api_v2<\/code> (Maglev). \u0412\u0441\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043a \u0430\u043f\u0441\u0442\u0440\u0438\u043c\u0430\u043c \u0438\u0434\u0443\u0442 \u043f\u043e TLS \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 SNI.   <\/p>\n<p><strong>HAProxy<\/strong> \u2014 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u0448\u0432\u0435\u0439\u0446\u0430\u0440\u0441\u043a\u0438\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c: \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 <code>roundrobin<\/code>, <code>leastconn<\/code>, <code>source<\/code>, <code>uri<\/code>, <code>hdr<\/code>, <code>consistent-hash<\/code> \u2014 \u0432\u0441\u0451 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e \u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e. L7-\u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0447\u0435\u0440\u0435\u0437 ACL: \u043c\u043e\u0436\u043d\u043e \u043c\u0430\u0442\u0447\u0438\u0442\u044c \u043f\u043e <code>URI<\/code>, \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c, \u0434\u0430\u0436\u0435 \u043f\u043e TLS-\u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0430\u043c (JA3\/JA4). \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u0430, \u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u0430 \u0438 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0430.<\/p>\n<p><strong>NGINX <\/strong>\u2014 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0437\u043c \u0431\u0435\u0437 \u0441\u044e\u0440\u043f\u0440\u0438\u0437\u043e\u0432: \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e <code>round_robin<\/code>, <code>least_conn<\/code>, <code>ip_hash<\/code>. HTTP-\u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>location<\/code>, \u043d\u043e \u0431\u0435\u0437 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0438\u043b\u0438 <code>ring_hash<\/code>. Sticky-\u0441\u0435\u0441\u0441\u0438\u0438 \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 <code>ip_hash<\/code>, API \u0434\u043b\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u0442, \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 NGINX Plus. \u0425\u043e\u0440\u043e\u0448, \u0435\u0441\u043b\u0438 \u043a\u043e\u043d\u0444\u0438\u0433 \u00ab\u0440\u0430\u0437\u043b\u043e\u0436\u0438\u043b \u0438 \u0437\u0430\u0431\u044b\u043b\u00bb, \u0430 \u0442\u0440\u0430\u0444\u0438\u043a \u0441\u0442\u0430\u0431\u0438\u043b\u0435\u043d.<\/p>\n<p><strong>Envoy<\/strong> \u2014 \u0442\u044f\u0436\u0451\u043b\u0430\u044f \u0430\u0440\u0442\u0438\u043b\u043b\u0435\u0440\u0438\u044f: \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 <code>round_robin<\/code>, <code>least_request<\/code>, <code>maglev<\/code>, <code>ring_hash<\/code>, \u0432\u0435\u0441\u0430, \u043a\u0430\u043d\u0430\u0440\u0435\u0435\u0447\u043d\u044b\u0435 \u0440\u0435\u043b\u0438\u0437\u044b, shadow-\u0442\u0440\u0430\u0444\u0438\u043a. \u0412\u0441\u0451 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 xDS \u2014 \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0445\u043e\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0435\u043a\u0443\u043d\u0434\u0443. \u041d\u043e YAML-\u0441\u0445\u0435\u043c\u044b \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u0438 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043e\u043f\u044b\u0442\u0430, \u0438\u043d\u0430\u0447\u0435 \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u044c\u043d\u043e. \u0414\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d-\u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438 \u2014 \u044d\u0442\u043e \u043b\u0443\u0447\u0448\u0438\u0439 \u0432\u044b\u0431\u043e\u0440, \u043d\u043e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0432\u043b\u043e\u0436\u0438\u0442\u044c\u0441\u044f \u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p><strong>\u0412\u044b\u0432\u043e\u0434\u044b:<\/strong><\/p>\n<ul>\n<li>\n<p><strong>HAProxy<\/strong> \u2014 \u043d\u0438\u0437\u043a\u0430\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c L4\/L7. \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u043b ACL \u2014 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p><strong>NGINX <\/strong>\u2014 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0431\u0435\u0437 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439. \u041a\u043e\u043d\u0444\u0438\u0433 \u00ab\u0440\u0430\u0437\u043b\u043e\u0436\u0438\u043b \u0438 \u0437\u0430\u0431\u044b\u043b\u00bb.<\/p>\n<\/li>\n<li>\n<p><strong>Envoy<\/strong> \u2014 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u043a\u0430\u043d\u0430\u0440\u0435\u0435\u0447\u043d\u044b\u0435 \u0440\u0435\u043b\u0438\u0437\u044b \u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438, \u043d\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0430\u044f \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h2>\u041d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u0438 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c<\/h2>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ac4\/7e0\/87e\/ac47e087e18cbbf2e955587ab8b32554.png\" width=\"800\" height=\"500\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/ac4\/7e0\/87e\/ac47e087e18cbbf2e955587ab8b32554.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ac4\/7e0\/87e\/ac47e087e18cbbf2e955587ab8b32554.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>HAProxy \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u043d\u0430 L4 \u0438 L7: \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 health-check, \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0430\u0445, circuit breaker \u0447\u0435\u0440\u0435\u0437 \u043b\u0438\u043c\u0438\u0442\u044b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0449\u0438\u0442\u0443 \u043e\u0442 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 stick-tables. <\/p>\n<pre><code class=\"go\">global   maxconn 20000 # \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u043f\u0440\u0435\u0434\u0435\u043b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 HAProxy  defaults   maxconn 10000 # \u043b\u0438\u043c\u0438\u0442 \u0434\u043b\u044f \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u043e\u0432\/\u0431\u044d\u043a\u0435\u043d\u0434\u043e\u0432 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e  backend be_api   mode http   option httpchk GET \/health   retry-on all-retryable-errors   retries 3   http-request disable-l7-retry if METH_POST METH_PUT METH_DELETE   default-server inter 2s fall 3 rise 2   server s1 10.0.0.51:443 ssl verify none maxconn 500   server s2 10.0.0.52:443 ssl verify none maxconn 500   stick-table type ip size 1m expire 10m store conn_rate(10s)   tcp-request connection track-sc0 src   tcp-request connection reject if { sc0_conn_rate gt 100 } <\/code><\/pre>\n<p>\u0421\u0435\u0440\u0432\u0435\u0440\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0435 \u0434\u0432\u0435 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043f\u043e \u043f\u0443\u0442\u0438 \/health. \u041e\u043d\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u043f\u0443\u043b\u0430 \u043f\u043e\u0441\u043b\u0435 \u0442\u0440\u0451\u0445 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u0445 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u0434\u0432\u0443\u0445 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0445. \u0415\u0441\u043b\u0438 \u043b\u0438\u043c\u0438\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 (500 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439) \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d, \u043b\u0438\u0448\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u043e\u0436\u0438\u0434\u0430\u044e\u0442 <code>timeout queue<\/code> (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u2014 \u043e\u0442 <code>timeout connect<\/code>), \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f 503. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>retries 3<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0434\u043e \u0442\u0440\u0451\u0445 \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f (\u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f + \u0434\u043e \u0434\u0432\u0443\u0445 \u043f\u043e\u0432\u0442\u043e\u0440\u043e\u0432), \u0430 \u043e\u043f\u0446\u0438\u044f <code>retry-on all-retryable-errors<\/code> \u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0430 <code>http-request disable-l7-retry<\/code> \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044e\u0442, \u0447\u0442\u043e HAProxy \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0442\u0440\u0430\u0438\u0442\u044c POST, PUT, DELETE. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <code>global maxconn<\/code> \u0438 <code>server maxconn<\/code> \u0437\u0430\u0434\u0430\u044e\u0442 \u0432\u0435\u0440\u0445\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 backend. \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0435\u0434\u0435\u043b \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0442\u0430\u043a\u0436\u0435 \u043e\u0442 \u043b\u0438\u043c\u0438\u0442\u0430 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u043e\u0432 (<code>ulimit -n<\/code>), \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u0434\u043d\u043e \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u0432\u0430 FD(\u22481\u20132 FD \u043d\u0430 \u0441\u0435\u0441\u0441\u0438\u044e). \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e stick-tables \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u044e\u0442 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u043f\u043e\u0440\u043e\u0433\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 100 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u0437\u0430 10 \u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<p> NGINX \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u0435 health-check (<code>max_fails<\/code>\/<code>fail_timeout<\/code>) \u0438 <code>proxy_next_upstream<\/code> \u0434\u043b\u044f fallback. \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043d\u044e\u0430\u043d\u0441 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043e\u0432: <code>proxy_next_upstream_tries N<\/code> \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u0441\u044e upstream-\u0433\u0440\u0443\u043f\u043f\u0443, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438 proxy_next_upstream_tries 3 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 + \u0434\u043e 2 \u043f\u043e\u0432\u0442\u043e\u0440\u043e\u0432 \u043f\u043e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c (\u0438\u0442\u043e\u0433\u043e 1 + 2), \u0430 \u043d\u0435 1 + 3 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e backend. <\/p>\n<pre><code class=\"nginx\">worker_processes auto; worker_rlimit_nofile 4096; # \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d worker-\u043f\u0440\u043e\u0446\u0435\u0441\u0441   events {   worker_connections 2048; # \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0434\u0438\u043d worker-\u043f\u0440\u043e\u0446\u0435\u0441\u0441    multi_accept on; }  http {   upstream api_pool {     least_conn;     server 10.0.0.51 max_fails=3 fail_timeout=5s;     server 10.0.0.52 max_fails=3 fail_timeout=5s;   }    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=100r\/s;    server {     listen 443 ssl;     limit_req zone=req_limit burst=50;     proxy_pass https:\/\/api_pool;     proxy_next_upstream error timeout http_502 http_503 http_504;     proxy_next_upstream_tries 3;   } } <\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0442\u0440\u0451\u0445 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u043f\u043e\u0434\u0440\u044f\u0434 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043f\u0443\u043b\u0430 \u043d\u0430 \u043f\u044f\u0442\u044c \u0441\u0435\u043a\u0443\u043d\u0434. \u0414\u043b\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f <code>limit_req<\/code> \u0438 <code>limit_conn<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u0443\u044e\u0442 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e. \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0438\u0437 <code>worker_connections<\/code> \u0438 <code>worker_rlimit_nofile<\/code>, \u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0435\u0434\u0435\u043b \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432 \u0440\u0430\u0432\u0435\u043d \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044e \u0447\u0438\u0441\u043b\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043d\u0430 \u043b\u0438\u043c\u0438\u0442 \u0432\u043e\u0440\u043a\u0435\u0440\u0430, \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043e\u0434\u043d\u043e \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043e\u043a\u043e\u043b\u043e \u0434\u0432\u0443\u0445 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u043e\u0432. \u0412 Open-Source NGINX \u043d\u0435\u0442 per-backend \u043b\u0438\u043c\u0438\u0442\u043e\u0432, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0445 <code>server maxconn<\/code>; \u044d\u0442\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 (max_conns \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u0430\u043f\u0441\u0442\u0440\u0438\u043c\u0435) \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 NGINX Plus.<\/p>\n<p>Envoy \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432: \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 health-check (HTTP\/TCP\/gRPC), circuit breaking \u0441 \u043b\u0438\u043c\u0438\u0442\u0430\u043c\u0438 \u043f\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f\u043c, \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c \u0438 \u043e\u0448\u0438\u0431\u043a\u0430\u043c, retries \u0441 \u0433\u0438\u0431\u043a\u043e\u0439 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u043e\u0439, outlier detection \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 \u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0434\u043b\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439<\/p>\n<pre><code class=\"go\">static_resources:   listeners:   - name: https_listener     address: { socket_address: { address: 0.0.0.0, port_value: 443 } }     filter_chains:     - filters:       - name: envoy.filters.network.connection_limit         typed_config:           \"@type\": type.googleapis.com\/envoy.extensions.filters.network.connection_limit.v3.ConnectionLimit           stat_prefix: conn_limit           max_connections: 10000           delay: 0s       - name: envoy.filters.network.http_connection_manager         typed_config:           \"@type\": type.googleapis.com\/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager           stat_prefix: ingress           route_config: { ... }           http_filters: [ { name: envoy.filters.http.router } ]    clusters:   - name: api_pool     lb_policy: LEAST_REQUEST     circuit_breakers:       thresholds:       - max_connections: 500         max_requests: 1000           health_checks:     - timeout: 1s       interval: 2s       unhealthy_threshold: 3       healthy_threshold: 2       http_health_check: { path: \/health }     outlier_detection:       consecutive_5xx: 5       interval: 5s       base_ejection_time: 30s <\/code><\/pre>\n<p>\u0424\u0438\u043b\u044c\u0442\u0440 <code>connection_limit<\/code> \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043d\u0430 listener, \u0430 circuit breakers \u0437\u0430\u0434\u0430\u044e\u0442 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0443. \u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c retries \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 <code>retry_policy<\/code>: \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>num_retries<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0438, \u0432\u0441\u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 + <code>num_retries<\/code>, \u0430 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043e\u0442\u043a\u0430\u0437\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043e\u0442\u0432\u0435\u0442\u0430\u0445 503) \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e backoff. \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u041e\u0421 \u0447\u0435\u0440\u0435\u0437 <code>ulimit -n<\/code>, \u0430 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e outlier detection, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u044b \u0441 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u044b\u043c\u0438 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438 5xx.<\/p>\n<p><strong>HAProxy<\/strong> \u2014 \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u0433\u0438\u0439 \u043e\u0445\u0440\u0430\u043d\u043d\u0438\u043a \u0443 \u043a\u043b\u0443\u0431\u0430: \u043b\u0438\u0448\u043d\u0438\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u043f\u0443\u0441\u0442\u0438\u0442, \u043f\u044c\u044f\u043d\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0432\u044b\u0433\u043e\u043d\u0438\u0442 (stick-tables), \u0441\u0435\u0440\u0434\u0446\u0435\u0431\u0438\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0435\u043a\u0443\u043d\u0434\u0443. Circuit breaker \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0447\u0451\u0442\u043a\u043e. \u041c\u0438\u043d\u0443\u0441: \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 Lua \u0438\u043b\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u044e\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u043a\u0443 \u2014 \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0451 \u0440\u0443\u043a\u0430\u043c\u0438, \u043a\u0430\u043a \u0432 \u0441\u0442\u0430\u0440\u043e\u0439 \u0448\u043a\u043e\u043b\u0435 DevOps.<\/p>\n<p><strong>NGINX <\/strong>\u2014 \u043e\u0445\u0440\u0430\u043d\u043d\u0438\u043a \u0431\u0435\u0437 \u0440\u0430\u0446\u0438\u0438: \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u043b\u0438\u0435\u043d\u0442 \u0443\u043f\u0430\u043b, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043e\u043d \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0441\u0432\u0430\u043b\u0438\u043b\u0441\u044f \u043d\u0430 \u043f\u043e\u043b. \u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0445 health-check \u043d\u0435\u0442 (\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0434\u043b\u044f \u043f\u043b\u0430\u0442\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438), circuit breaker \u0432 \u0437\u0430\u0447\u0430\u0442\u043a\u0435. \u0417\u0430\u0442\u043e \u043b\u0438\u043c\u0438\u0442\u044b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u0430\u0440\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432, \u0431\u0435\u0437 \u043c\u0430\u0433\u0438\u0438 \u0438 Lua. \u0425\u043e\u0440\u043e\u0448 \u0434\u043b\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u0443\u043b\u043e\u0432, \u0433\u0434\u0435 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0431\u0435\u0433\u0430\u0435\u0442 \u0438 \u0441\u0432\u0435\u0442 \u043d\u0435 \u043c\u0438\u0433\u0430\u0435\u0442.<\/p>\n<p><strong>Envoy<\/strong> \u2014 \u043e\u0445\u0440\u0430\u043d\u043d\u0438\u043a \u0441 \u043a\u0430\u043c\u0435\u0440\u043e\u0439, \u0442\u0435\u043f\u043b\u043e\u0432\u0438\u0437\u043e\u0440\u043e\u043c \u0438 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u0439 \u043d\u0430 \u0418\u0418: \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, circuit breaker \u043d\u0430 \u0432\u0441\u0451 \u043f\u043e\u0434\u0440\u044f\u0434, outlier detection, retries \u0441 \u0443\u043c\u043d\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439. \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0438\u043b\u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 rate limiting \u2014 \u043d\u0430 \u0432\u044b\u0431\u043e\u0440. \u041c\u0438\u043d\u0443\u0441: \u043e\u043d \u043f\u0440\u043e\u0441\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0437\u0430\u0440\u043f\u043b\u0430\u0442\u0443 (CPU\/memory) \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0430\u0436 \u043f\u043e\u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0438\u043d\u0430\u0447\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0437\u0430\u043a\u0440\u043e\u0435\u0442 \u0434\u0432\u0435\u0440\u044c \u0434\u0430\u0436\u0435 \u043f\u0435\u0440\u0435\u0434 \u0445\u043e\u0437\u044f\u0438\u043d\u043e\u043c.<\/p>\n<p><strong>\u0412\u044b\u0432\u043e\u0434:<\/strong><\/p>\n<ul>\n<li>\n<p><strong>HAProxy<\/strong> \u2014 \u043b\u0443\u0447\u0448\u0438\u0439 \u0432\u044b\u0431\u043e\u0440 \u0434\u043b\u044f L4\/L7-\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u0432, \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u0430 \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0437\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0443\u0447\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>NGINX <\/strong>\u2014 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442, \u0435\u0441\u043b\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043b\u0438\u043c\u0438\u0442\u043e\u0432 \u0431\u0435\u0437 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>Envoy<\/strong> \u2014 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0436\u0438\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u0441 \u0430\u0432\u0442\u043e\u0441\u043a\u0435\u0439\u043b\u043e\u043c \u0438 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u043c \u0442\u0440\u0430\u0444\u0438\u043a\u0430, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h2>\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u044c<\/h2>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b53\/9c7\/e0e\/b539c7e0ee3df93fb5d9f83e019dd6a7.png\" width=\"935\" height=\"832\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b53\/9c7\/e0e\/b539c7e0ee3df93fb5d9f83e019dd6a7.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b53\/9c7\/e0e\/b539c7e0ee3df93fb5d9f83e019dd6a7.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>HAProxy \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u043b\u043e\u0433\u0438 \u0447\u0435\u0440\u0435\u0437 syslog (<code>RFC5424\/3164<\/code>), \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 structured logging (JSON) \u0447\u0435\u0440\u0435\u0437 <code>log-format<\/code> \u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u043c\u0435\u0442\u0440\u0438\u043a \u0432 Prometheus \u0447\u0435\u0440\u0435\u0437 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 <code>prometheus-exporter<\/code> \u0438\u043b\u0438 <code>stats socket<\/code>. \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0432\u0435\u0431-\u0441\u0442\u0430\u0442\u0443\u0441 (<code>stats uri<\/code>) \u0435\u0441\u0442\u044c, \u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0435\u0442 \u2014 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0430\u0433\u0435\u043d\u0442\u044b (Jaeger, Zipkin).<\/p>\n<pre><code class=\"go\">global     log stdout format raw local0     stats socket \/var\/run\/haproxy.sock mode 600 level admin     stats timeout 30s  defaults     log global     option httplog     log-format { \"time\":\"%t\", \"frontend\":\"%f\", \"backend\":\"%b\", \"srv\":\"%s\", \"status\":%ST, \"bytes\":%B }  frontend prometheus     bind *:8405     mode http     http-request use-service prometheus-exporter if { path \/metrics }     no log<\/code><\/pre>\n<p>\u041b\u043e\u0433\u0438 \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0432 stdout, \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u044e\u0442\u0441\u044f \u043f\u043e <code>http:\/\/&lt;host&gt;:8405\/metrics.<\/code> \u041f\u043b\u044e\u0441\u044b: \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b, \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043b\u043e\u0433\u0438. \u041c\u0438\u043d\u0443\u0441\u044b: \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<p>NGINX \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 <code>access\/error<\/code> \u043b\u043e\u0433\u0438, \u043c\u043e\u0436\u0435\u0442 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 JSON \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u0432 ELK\/Graylog. \u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 (<code>nginx-module-vts<\/code>, <code>nginx-prometheus-exporter<\/code>). \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0435\u0442 (\u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 NGINX Plus, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c OpenTelemetry).<\/p>\n<pre><code class=\"nginx\">http {     log_format json_combined escape=json         '{ \"time\":\"$time_iso8601\",'         '\"remote\":\"$remote_addr\",'         '\"host\":\"$host\",'         '\"request\":\"$request\",'         '\"status\":$status,'         '\"bytes\":$body_bytes_sent }';      access_log \/var\/log\/nginx\/access.json json_combined;      server {         listen 80;         location \/ {             proxy_pass http:\/\/10.0.0.52:8080;         }     } }<\/code><\/pre>\n<p>\u0422\u0440\u0430\u0444\u0438\u043a \u043b\u043e\u0433\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 JSON, \u0433\u043e\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438. \u041f\u043b\u044e\u0441\u044b: \u0433\u0438\u0431\u043a\u0438\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u043b\u043e\u0433\u043e\u0432, \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c ELK. \u041c\u0438\u043d\u0443\u0441\u044b: \u043d\u0435\u0442 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u043c\u0435\u0442\u0440\u0438\u043a \u0438 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438, \u043d\u0443\u0436\u0435\u043d \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440.<\/p>\n<p>Envoy \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 structured logging, \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0432 Prometheus, \u0430 \u0442\u0430\u043a\u0436\u0435 OpenTelemetry \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 (Jaeger, Zipkin, Datadog). \u041a\u0430\u0436\u0434\u044b\u0439 \u0444\u0438\u043b\u044c\u0442\u0440 \u043c\u043e\u0436\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438.<\/p>\n<pre><code class=\"go\">admin:   access_log_path: \/dev\/stdout   address:     socket_address: { address: 0.0.0.0, port_value: 9901 }  tracing:   http:     name: envoy.tracers.opentelemetry     typed_config:       \"@type\": type.googleapis.com\/envoy.config.trace.v3.OpenTelemetryConfig       grpc_service:         envoy_grpc:           cluster_name: otel_collector<\/code><\/pre>\n<p>Envoy \u043f\u0438\u0448\u0435\u0442 \u043b\u043e\u0433\u0438 \u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e(<code>http:\/\/&lt;host&gt;:9901\/stats\/prometheus<\/code>), \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 OpenTelemetry Collector. \u041f\u043b\u044e\u0441\u044b: \u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Prometheus \u0438 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438, \u0434\u0435\u0442\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 L4\/L7.<\/p>\n<p><strong>HAProxy<\/strong> \u2014 \u043f\u0438\u0448\u0435\u0442 \u043b\u043e\u0433\u0438 \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u0447\u0435\u0441\u0442\u043d\u043e, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u0432\u0435\u0434\u0451\u0442 \u0434\u043d\u0435\u0432\u043d\u0438\u043a \u0431\u0435\u0437 \u0446\u0435\u043d\u0437\u0443\u0440\u044b. \u041b\u0435\u0433\u043a\u043e \u043e\u0442\u0434\u0430\u0451\u0442 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 Prometheus \u0447\u0435\u0440\u0435\u0437 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440, \u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0432\u0435\u0431-\u0441\u0442\u0430\u0442\u0443\u0441 \u0434\u0430\u0451\u0442 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041d\u043e \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u043c\u0443 \u2014 Lua, \u0430\u0433\u0435\u043d\u0442\u044b, \u0448\u0430\u043c\u0430\u043d\u0441\u043a\u0438\u0439 \u0431\u0443\u0431\u0435\u043d.<\/p>\n<p><strong>NGINX <\/strong>\u2014 \u043b\u043e\u0433\u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u0443\u0434\u043e\u0431\u043e\u0432\u0430\u0440\u0438\u043c\u044b\u043c\u0438 \u0432 JSON \u0438 \u0441\u0440\u0430\u0437\u0443 \u0433\u043e\u0442\u043e\u0432\u044b\u043c\u0438 \u0434\u043b\u044f ELK, \u043d\u043e \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0438 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0438\u043b\u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440\u044b. \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u043d\u043e \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043c\u0430\u0433\u0438\u0438 \u0434\u043b\u044f L7-\u043c\u0435\u0442\u0440\u0438\u043a \u0438\u043b\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0430. \u0422\u043e \u0435\u0441\u0442\u044c \u0432\u0438\u0434\u043d\u043e, \u043a\u0442\u043e \u0437\u0430\u0448\u0451\u043b, \u043d\u043e \u043d\u0435 \u043a\u0443\u0434\u0430 \u043e\u043d \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u0448\u0451\u043b.<\/p>\n<p><strong>Envoy<\/strong> \u2014 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u0442 \u0437\u0430 \u0432\u0441\u0435\u043c, \u043a\u0430\u043a \u043f\u0430\u0440\u0430\u043d\u043e\u0438\u0434\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043e\u0441\u0435\u0434 \u0441 \u0431\u0438\u043d\u043e\u043a\u043b\u0435\u043c \u043d\u0430 \u043f\u0435\u043d\u0441\u0438\u0438. \u041b\u043e\u0433\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b, \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0438\u0434\u0443\u0442 \u043f\u0440\u044f\u043c\u043e \u0432 Prometheus, \u0430 OpenTelemetry \u0432\u0441\u0442\u0440\u043e\u0435\u043d \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438: \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0434\u043e \u0431\u0430\u0437\u044b \u0431\u0435\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439. \u041c\u0438\u043d\u0443\u0441: \u0441\u044a\u0435\u0434\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u0438\u043d\u0430\u0447\u0435 \u043b\u0435\u0433\u043a\u043e \u0443\u0442\u043e\u043d\u0443\u0442\u044c \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0433\u0440\u0430\u0444\u0438\u043a\u0430\u0445.<\/p>\n<p><strong>\u0412\u044b\u0432\u043e\u0434:<\/strong><\/p>\n<ul>\n<li>\n<p><strong>HAProxy<\/strong> \u2014 \u043b\u0451\u0433\u043a\u0438\u0439 \u0438 \u0431\u044b\u0441\u0442\u0440\u044b\u0439, \u043d\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0437\u043e\u0432\u0430\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>NGINX <\/strong>\u2014 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043b\u043e\u0433\u0438, \u043d\u043e \u0437\u0430 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0438 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u043b\u0430\u0442\u0438\u0442\u044c \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c\u0438 \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c.<\/p>\n<\/li>\n<li>\n<p><strong>Envoy<\/strong> \u2014 \u043b\u0438\u0434\u0435\u0440 \u0434\u043b\u044f \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0439 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u0438 \u0438 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0431\u0435\u0437 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439, \u0435\u0441\u043b\u0438 \u0433\u043e\u0442\u043e\u0432\u044b \u043c\u0438\u0440\u0438\u0442\u044c\u0441\u044f \u0441 \u0435\u0433\u043e \u0430\u043f\u043f\u0435\u0442\u0438\u0442\u0430\u043c\u0438.<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h2>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c <\/h2>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ce0\/b7d\/d4b\/ce0b7dd4b40c48b7259a64cf8ea67d98.gif\" width=\"800\" height=\"600\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ce0\/b7d\/d4b\/ce0b7dd4b40c48b7259a64cf8ea67d98.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ce0\/b7d\/d4b\/ce0b7dd4b40c48b7259a64cf8ea67d98.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p><strong>HAProxy <\/strong>\u2014 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 TLS 1.3 \u0438 mTLS \u043f\u0440\u044f\u043c\u043e \u043d\u0430 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430\u0445, \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 2.5 \u0443\u043c\u0435\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c JWT \u0438 <a href=\"https:\/\/www.haproxy.com\/documentation\/haproxy-configuration-tutorials\/security\/authentication\/oauth-authorization\/\" rel=\"noopener noreferrer nofollow\">OAuth2 <\/a>\u0431\u0435\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 (<code>http_auth_bearer<\/code>, <code>jwt_verify<\/code>, <code>jwt_payload<\/code>), \u0430 \u0434\u043b\u044f RBAC \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442 ACL \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435. Zero Trust-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u044b \u0447\u0435\u0440\u0435\u0437 SPIFFE\/SPIRE, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e glue-\u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u0440\u043e\u0442\u0430\u0446\u0438\u0438 \u043a\u043b\u044e\u0447\u0435\u0439.<\/p>\n<pre><code class=\"go\">frontend https_in   bind :443 ssl crt \/etc\/haproxy\/certs.pem ca-file \/etc\/haproxy\/ca.pem verify required   http-request set-var(txn.jwt)       http_auth_bearer   http-request set-var(txn.verified)  var(txn.jwt),jwt_verify(alg=RS256,key=\/etc\/haproxy\/jwks.json)   http-request deny if { var(txn.verified) -m int 0 }   http-request set-var(txn.role)      var(txn.jwt),jwt_payload,query(role)   acl role_admin var(txn.role) -m str admin   http-request deny unless role_admin   default_backend web <\/code><\/pre>\n<p>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0441\u043e\u043a\u0430\u044f, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043f\u043e\u043b\u0438\u0442\u0438\u043a \u043c\u0435\u043d\u0435\u0435 \u0433\u0438\u0431\u043a\u0438\u0439, \u0447\u0435\u043c \u0432 Envoy, \u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f edge-\u0437\u0430\u0449\u0438\u0442\u044b. \u0417\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0433\u043b\u044f\u043d\u0443\u0442\u044c <a href=\"https:\/\/www.haproxy.com\/blog\/verify-oauth-jwt-tokens-with-haproxy\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u0412 OSS \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e WAF \u043d\u0435\u0442. \u041e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 ModSecurity \u0447\u0435\u0440\u0435\u0437 SPOE-\u0430\u0433\u0435\u043d\u0442 \u0438\u043b\u0438 \u0432\u044b\u043d\u043e\u0441\u044f\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438 OWASP CRS. \u042d\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b.<\/p>\n<p><strong>NGINX<\/strong> \u2014 \u043f\u0440\u043e\u0441\u0442 \u0432 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438, \u043d\u043e \u0431\u0435\u0437 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 JWT \u0432 OSS-\u0432\u0435\u0440\u0441\u0438\u0438. TLS 1.3 \u0438 mTLS \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 ssl-\u043c\u043e\u0434\u0443\u043b\u044c. JWT, OIDC \u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 RBAC-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u0447\u0435\u0440\u0435\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0442\u043e\u0440 (\u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e oauth2-proxy) \u0441 <code>auth_request<\/code> \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 Lua\/OpenResty. Zero Trust \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d, \u043d\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441\u043e SPIFFE\/SPIRE \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0443\u0447\u043d\u0430\u044f  <\/p>\n<pre><code class=\"nginx\">server {   listen 443 ssl;   ssl_certificate     \/etc\/nginx\/ssl\/server.crt;   ssl_certificate_key \/etc\/nginx\/ssl\/server.key;   ssl_client_certificate \/etc\/nginx\/ssl\/ca.pem;   ssl_verify_client on;    location \/ {     auth_request \/oauth2\/auth;     error_page 401 = \/oauth2\/sign_in;     proxy_set_header X-Auth-Request-User  $upstream_http_x_auth_request_user;     proxy_set_header X-Auth-Request-Email $upstream_http_x_auth_request_email;     proxy_pass http:\/\/backend;   }   location = \/oauth2\/auth { internal; proxy_pass http:\/\/oauth2-proxy; }   location \/oauth2\/       {           proxy_pass http:\/\/oauth2-proxy; } }<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0441\u0442 \u0432 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438, \u043d\u0430\u0434\u0451\u0436\u0435\u043d, \u043d\u043e \u0431\u0435\u0437 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0440\u0443\u0434\u043d\u043e. \u0412 OSS \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e WAF \u043d\u0435\u0442. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442 libmodsecurity + \u043c\u043e\u0434\u0443\u043b\u044c ModSecurity-nginx \u0441 \u043f\u0440\u043e\u0444\u0438\u043b\u0435\u043c OWASP CRS. \u0412\u0441\u0451 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u043d\u0443\u0436\u043d\u043e \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b \u0438 \u0442\u044e\u043d\u0438\u043d\u0433\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443.<\/p>\n<p><strong>Envoy<\/strong> \u2014 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u0435\u043d \u0434\u043b\u044f Zero Trust. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 TLS 1.3, mTLS, \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/latest\/configuration\/security\/secret#secret-discovery-service-sds\" rel=\"noopener noreferrer nofollow\">SDS<\/a>, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u044b JWT, RBAC \u0438 OAuth2. \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441\u043e SPIFFE\/SPIRE \u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f, \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. OAuth2\/OIDC \u0440\u0435\u0448\u0430\u044e\u0442 \u0447\u0435\u0440\u0435\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 IdP \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e \u0441 jwt_authn \u0438\u043b\u0438 ext_authz    <\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433 (danger)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"go\">static_resources:   listeners:   - name: main_listener     address:       socket_address:         address: 0.0.0.0         port_value: 8080     filter_chains:     - filters:       - name: envoy.filters.network.http_connection_manager         typed_config:           \"@type\": type.googleapis.com\/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager           stat_prefix: ingress_http           route_config:             name: local_route             virtual_hosts:             - name: local_service               domains: [\"*\"]               routes:               - match:                   prefix: \"\/\"                 route:                   cluster: service_cluster            http_filters:           - name: envoy.filters.http.jwt_authn             typed_config:               \"@type\": type.googleapis.com\/envoy.extensions.filters.http.jwt_authn.v3.JwtAuthentication               providers:                 example_provider:                   issuer: https:\/\/example.com                   audiences:                   - api.example.com                   remote_jwks:                     http_uri:                       uri: https:\/\/example.com\/.well-known\/jwks.json                       cluster: jwks_cluster                       timeout: 1s                     cache_duration:                       seconds: 300            - name: envoy.filters.http.rbac             typed_config:               \"@type\": type.googleapis.com\/envoy.extensions.filters.http.rbac.v3.RBAC               rules:                 policies:                   \"require-valid-jwt\":                     permissions:                       - any: true                     principals:                       - metadata:                           filter: envoy.filters.http.jwt_authn                           path:                             - key: example_provider                           value:                             string_match:                               exact: verified            - name: envoy.filters.http.router             typed_config:               \"@type\": type.googleapis.com\/envoy.extensions.filters.http.router.v3.Router    clusters:   - name: service_cluster     connect_timeout: 0.25s     type: STATIC     lb_policy: ROUND_ROBIN     load_assignment:       cluster_name: service_cluster       endpoints:       - lb_endpoints:         - endpoint:             address:               socket_address:                 address: 127.0.0.1                 port_value: 8081    - name: jwks_cluster     connect_timeout: 5s     type: LOGICAL_DNS     lb_policy: ROUND_ROBIN     load_assignment:       cluster_name: jwks_cluster       endpoints:       - lb_endpoints:         - endpoint:             address:               socket_address:                 address: example.com                 port_value: 443     transport_socket:       name: envoy.transport_sockets.tls       typed_config:         \"@type\": type.googleapis.com\/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext         sni: example.com<\/code><\/pre>\n<\/div>\n<\/details>\n<p>JWT \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 jwt_authn filter \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0438 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0445 JWKS, \u0430 RBAC-\u0444\u0438\u043b\u044c\u0442\u0440 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c allow\/deny-\u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. WAF<strong>:<\/strong> \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0435\u0442. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 WASM-\u0444\u0438\u043b\u044c\u0442\u0440\u044b \u043d\u0430 \u0431\u0430\u0437\u0435 Coraza (\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b \u0441 OWASP CRS) \u0438\u043b\u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u044e\u0442 Curiefense \u043a\u0430\u043a Envoy-\u0444\u0438\u043b\u044c\u0442\u0440. \u041f\u043e\u0434\u0445\u043e\u0434 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432 \u043f\u043e\u0434 \u043f\u0440\u043e\u0434-\u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u0430\u0432\u0438\u043b.<\/p>\n<p><strong>HAProxy<\/strong> \u2014 \u0448\u0438\u0444\u0440\u0443\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e, JWT\/OAuth2 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u0442\u0438\u0432\u043d\u043e \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 2.5 \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. TLS 1.3 \u0438 mTLS \u043d\u0430 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430\u0445, ACL \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f RBAC. Zero Trust \u0447\u0435\u0440\u0435\u0437 SPIFFE\/SPIRE \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d, \u043d\u043e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u00ab\u043a\u043b\u0435\u0439\u00bb \u0434\u043b\u044f \u0440\u043e\u0442\u0430\u0446\u0438\u0438 \u043a\u043b\u044e\u0447\u0435\u0439 \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f SVID. \u0425\u043e\u0440\u043e\u0448, \u043a\u043e\u0433\u0434\u0430 \u0432\u0430\u0436\u043d\u044b \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0435\u0439 \u043c\u0430\u0433\u0438\u0438.<\/p>\n<p><strong>NGINX<\/strong> \u2014 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a \u0436\u0435 \u043b\u0435\u0433\u043a\u043e, \u043a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 upstream. TLS 1.3 \u0438 mTLS \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u044b, \u043d\u043e JWT \u0438 OIDC \u0432 OSS \u043d\u0435\u0442 \u2014 \u0432\u0441\u0451 \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0442\u043e\u0440 (\u0447\u0430\u0449\u0435 oauth2-proxy). \u0421\u043b\u043e\u0436\u043d\u044b\u0439 RBAC \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438. Zero Trust \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b, \u043d\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0443\u0447\u043d\u0430\u044f. \u041a\u043e\u043d\u0444\u0438\u0433 \u043f\u0440\u043e\u0441\u0442, \u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0443 HAProxy \u0438 Envoy.<\/p>\n<p><strong>Envoy <\/strong>\u2014 Zero Trust \u0432 \u0447\u0438\u0441\u0442\u043e\u043c \u0432\u0438\u0434\u0435. TLS 1.3, mTLS, SDS \u0434\u043b\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438 \u043a\u043b\u044e\u0447\u0435\u0439, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u044b JWT, RBAC, OAuth2. SPIFFE\/SPIRE \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u043e, \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0430\u043c\u0438. \u041c\u043e\u0436\u043d\u043e \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 \u0445\u043e\u0442\u044c \u043f\u043e\u0434 \u043c\u0438\u043a\u0440\u043e\u0441\u043a\u043e\u043f\u043e\u043c, \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439.<\/p>\n<p><strong>\u0412\u044b\u0432\u043e\u0434:<\/strong><\/p>\n<ul>\n<li>\n<p><strong>HAProxy<\/strong> \u2014 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0437\u043c: \u043f\u0440\u043e\u0441\u0442\u044b\u0435 ACL \u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f JWT\/OAuth2-\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>NGINX<\/strong> \u2014 \u043d\u0430\u0434\u0451\u0436\u0435\u043d \u0438 \u043f\u043e\u043d\u044f\u0442\u0435\u043d, \u043d\u043e \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u043e\u043b\u0438\u0442\u0438\u043a \u043d\u0443\u0436\u043d\u044b \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b.<\/p>\n<\/li>\n<li>\n<p><strong>Envoy<\/strong> \u2014 \u0432\u0441\u0451 \u0434\u043b\u044f Zero Trust \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438: TLS, mTLS, JWT, RBAC, OAuth2, SDS \u0438 SPIFFE.<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h2>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435<\/h2>\n<p>HAProxy \u2014 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0431\u044b\u0432\u0430\u044e\u0442 \u043a\u0430\u043a \u043a\u043e\u0442\u044b \u0432 \u043a\u043e\u0440\u043e\u0431\u043a\u0435 \u0428\u0440\u0451\u0434\u0438\u043d\u0433\u0435\u0440\u0430: \u0436\u0438\u0432\u0443\u0442 \u0442\u043e \u0432 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 (<code>txn.*<\/code>), \u0442\u043e \u0432 \u0441\u0435\u0441\u0441\u0438\u0438 (<code>sess.*<\/code>), \u0442\u043e \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 (<code>req.*<\/code>) \u0438\u043b\u0438 \u043e\u0442\u0432\u0435\u0442\u0435 (<code>res.*<\/code>). \u041c\u043e\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e: IP, \u0442\u043e\u043a\u0435\u043d\u044b, \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0444\u043b\u0430\u0433\u0438. \u042d\u0442\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0432 ACL, \u043b\u043e\u0433\u0438 \u0438\u043b\u0438 Lua.<\/p>\n<pre><code class=\"go\">frontend fe_https     bind :443 ssl crt \/etc\/haproxy\/certs\/site.pem alpn h2,http\/1.1     mode http     http-request set-var(txn.client_ip) src     http-request set-header X-Client-IP %[var(txn.client_ip)]     default_backend be_api  backend be_api     mode http     http-request set-var(sess.backend_name) be_api     server s1 10.0.0.31:443 ssl verify none     server s2 10.0.0.32:443 ssl verify none <\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c IP \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0438 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0443\u0435\u0437\u0436\u0430\u0435\u0442 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a. \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>sess.backend_name<\/code> \u0436\u0438\u0432\u0451\u0442 \u0434\u043e\u043b\u044c\u0448\u0435 \u2014 \u043f\u043e\u043a\u0430 TCP-\u0441\u0435\u0441\u0441\u0438\u044f \u043d\u0435 \u0443\u043c\u0440\u0451\u0442. \u041f\u043b\u044e\u0441\u044b: \u0431\u044b\u0441\u0442\u0440\u044b\u0435 ACL, \u0432\u0441\u0451 \u043c\u043e\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0432 \u043f\u0440\u043e\u043a\u0441\u0438. \u041c\u0438\u043d\u0443\u0441\u044b: \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0447\u0430\u0441\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u044e\u0442 Lua \u2014 \u0433\u043e\u0442\u043e\u0432\u044c\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435, \u043a\u0430\u043a \u0432 2000-\u0445.<\/p>\n<p>NGINX \u2014 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043a\u0430\u043a \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u044b \u043d\u0430 \u043f\u0430\u0440\u0435: \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043f\u043e\u0442\u043e\u043c \u0438\u0441\u043f\u0430\u0440\u044f\u044e\u0442\u0441\u044f. \u0415\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 (<code>$host<\/code>, <code>$remote_addr<\/code>) \u0438 \u0442\u0435, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u0451\u0448\u044c \u0440\u0443\u043a\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 <code>set<\/code>. \u041c\u0435\u0436\u0434\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0435 \u0434\u0435\u0440\u0436\u0430\u0442 \u2014 \u0445\u043e\u0447\u0435\u0448\u044c \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u043e\u0442\u0430\u0449\u0438\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435, \u043f\u0440\u043e\u043a\u0438\u0434\u044b\u0432\u0430\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438\u043b\u0438 \u0441\u0442\u0430\u0432\u044c cookie.<\/p>\n<pre><code class=\"nginx\">server {     listen 443 ssl http2;     ssl_certificate     \/etc\/nginx\/certs\/site.pem;     ssl_certificate_key \/etc\/nginx\/certs\/site.key;      set $client_ip $remote_addr;      location \/ {         proxy_set_header X-Client-IP $client_ip;         proxy_pass https:\/\/backend_pool;     } }  upstream backend_pool {     least_conn;     server 10.0.0.31:443;     server 10.0.0.32:443; } <\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f <code>$client_ip<\/code> \u0436\u0438\u0432\u0451\u0442 \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d \u0437\u0430\u043f\u0440\u043e\u0441, \u043a\u0430\u043a \u0431\u0430\u0442\u0430\u0440\u0435\u0439\u043a\u0430 \u0432 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u043e\u043c \u0444\u043e\u043d\u0430\u0440\u0438\u043a\u0435. \u041f\u043b\u044e\u0441\u044b: \u043f\u0440\u043e\u0441\u0442\u043e, \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0443\u0442\u0435\u0447\u0435\u043a \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. \u041c\u0438\u043d\u0443\u0441\u044b: \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u00ab\u0434\u043e\u043b\u0433\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438\u00bb, \u0432\u0441\u0451 \u0440\u0443\u043a\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438.<\/p>\n<p>Envoy  \u2014 \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0442\u0443\u0442 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435. <code>%DOWNSTREAM_REMOTE_ADDRESS%<\/code>, <code>%REQ(:authority)%<\/code>, <code>%UPSTREAM_HOST%<\/code> \u0438 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0434\u0440\u0443\u0433\u0438\u0445. \u041c\u043e\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u044f\u043c\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432 \u2014 \u0445\u043e\u0447\u0435\u0448\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c TCP, \u0445\u043e\u0447\u0435\u0448\u044c \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n<pre><code class=\"go\">static_resources:   listeners:   - name: https_listener     address:       socket_address: { address: 0.0.0.0, port_value: 443 }     filter_chains:     - filters:       - name: envoy.filters.network.http_connection_manager         typed_config:           \"@type\": type.googleapis.com\/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager           stat_prefix: ingress           route_config:             virtual_hosts:             - name: api               domains: [\"*\"]               routes:               - match: { prefix: \"\/\" }                 route:                    cluster: api_pool                   request_headers_to_add:                   - header:                       key: X-Client-IP                       value: \"%DOWNSTREAM_REMOTE_ADDRESS%\"           http_filters:           - name: envoy.filters.http.router<\/code><\/pre>\n<p>Envoy \u0441\u0430\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 <code>X-Client-IP<\/code> \u0438\u0437 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438. \u0410 \u0435\u0441\u043b\u0438 \u0437\u0430\u0445\u043e\u0447\u0435\u0448\u044c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0435\u0449\u0451 \u0447\u0442\u043e-\u0442\u043e \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 Dynamic Metadata, \u0438 \u0443 \u0442\u0435\u0431\u044f \u0431\u0443\u0434\u0435\u0442 \u00ab\u043a\u0430\u0440\u043c\u0430\u043d\u043d\u0430\u044f \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u043e\u043a\u0441\u0438\u00bb. \u041f\u043b\u044e\u0441\u044b: \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u043a\u0430\u043a LEGO. \u041c\u0438\u043d\u0443\u0441\u044b: \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0430, \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0431\u0435\u0437 \u043a\u043e\u0444\u0435 \u043e\u043f\u0430\u0441\u043d\u043e.<\/p>\n<p><strong>\u0412\u044b\u0432\u043e\u0434:<\/strong><\/p>\n<ul>\n<li>\n<p><strong>HAProxy<\/strong> \u2014 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u0432\u043a\u0443\u0441 \u0438 \u0441\u0440\u043e\u043a \u0436\u0438\u0437\u043d\u0438, \u043d\u043e Lua \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0443\u0447\u0438\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p><strong>NGINX <\/strong>\u2014 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043a\u0430\u043a \u043e\u0434\u043d\u043e\u0440\u0430\u0437\u043e\u0432\u044b\u0435 \u0441\u0442\u0430\u043a\u0430\u043d\u0447\u0438\u043a\u0438: \u0443\u0434\u043e\u0431\u043d\u043e, \u043d\u043e \u0431\u0435\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>Envoy<\/strong> \u2014 \u044d\u0442\u043e \u043a\u0430\u043a \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u0435 \u043c\u0430\u0433\u0438\u0435\u0439: \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u0430\u044f \u043c\u043e\u0449\u044c, \u043d\u043e \u043e\u0434\u0438\u043d \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0432 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438 \u0442\u044b \u0443\u0436\u0435 \u043d\u0435 \u043f\u043e\u0432\u0435\u043b\u0435\u0432\u0430\u0435\u0448\u044c \u0442\u0440\u0430\u0444\u0438\u043a\u043e\u043c, \u0430 \u0442\u0443\u0448\u0438\u0448\u044c \u0444\u0430\u0435\u0440\u0432\u043e\u043b.  <\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h2>\u0422\u0430\u0439\u043c\u0430\u0443\u0442\u044b<\/h2>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a25\/ae7\/665\/a25ae766584fbb1490b6004dae048f0a.png\" width=\"134\" height=\"245\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/a25\/ae7\/665\/a25ae766584fbb1490b6004dae048f0a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a25\/ae7\/665\/a25ae766584fbb1490b6004dae048f0a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p><strong>HAProxy <\/strong>\u0442\u0430\u0439\u043c\u0430\u0443\u0442\u043e\u0432 \u0441\u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c\u0441\u044f.  \u0422\u0430\u0439\u043c\u0430\u0443\u0442\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0432 \u0441\u0435\u043a\u0446\u0438\u044f\u0445 <code>defaults<\/code>\/<code>frontend<\/code>\/<code>backend<\/code>. \u0413\u043b\u0430\u0432\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b: <code>timeout connect<\/code> (\u0442\u0430\u0439\u043c-\u0430\u0443\u0442 \u043d\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 TCP), <code>timeout client<\/code> (\u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0430), <code>timeout server<\/code> (\u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0431\u044d\u043a\u0435\u043d\u0434\u0430), <code>timeout http-request<\/code> (\u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430), <code>timeout http-keep-alive<\/code> \u0438 <code>timeout tunnel<\/code> \u0434\u043b\u044f \u0442\u0443\u043d\u043d\u0435\u043b\u0435\u0439\/\u0432\u0435\u0431\u0441\u043e\u043a\u0435\u0442\u043e\u0432. \u0422\u0430\u0439\u043c\u0430\u0443\u0442\u044b \u0447\u0430\u0441\u0442\u043e \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u044f\u0432\u043d\u043e \u0432 <code>defaults<\/code>; \u0431\u0435\u0437 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u00ab\u0437\u0430\u043b\u0438\u043f\u0430\u0442\u044c\u00bb \u0438\u043b\u0438 \u043f\u0430\u0434\u0430\u0442\u044c. \u041a\u0430\u0436\u0434\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0441\u0432\u043e\u0439 \u044d\u0442\u0430\u043f: \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435, \u0437\u0430\u043f\u0440\u043e\u0441, \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0442\u0443\u043d\u043d\u0435\u043b\u044c. \u041c\u043e\u0436\u043d\u043e \u0433\u0438\u0431\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438 \u043d\u0430 L4, \u0438 \u043d\u0430 L7.<\/p>\n<pre><code class=\"go\">defaults   timeout connect 5s   timeout client 1m   timeout server 1m   timeout http-request 10s   timeout queue 15s   timeout http-keep-alive 15s   timeout tunnel 1h<\/code><\/pre>\n<p>\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043a backend \u0436\u0434\u0451\u043c 5 \u0441\u0435\u043a\u0443\u043d\u0434, \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u2014 \u043f\u043e 1 \u043c\u0438\u043d\u0443\u0442\u0435, \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 HTTP \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c 10 \u0441\u0435\u043a\u0443\u043d\u0434, \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435 \u0434\u0435\u0440\u0436\u0438\u043c \u0434\u043e\u043b\u044c\u0448\u0435 15 \u0441\u0435\u043a\u0443\u043d\u0434. \u041f\u043b\u044e\u0441\u044b: \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c, \u043c\u043e\u0436\u043d\u043e \u00ab\u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u043e \u0431\u043e\u043b\u0442\u0438\u043a\u0430\u00bb. \u041c\u0438\u043d\u0443\u0441\u044b: \u043b\u0435\u0433\u043a\u043e \u0437\u0430\u043f\u0443\u0442\u0430\u0442\u044c\u0441\u044f, \u0435\u0441\u043b\u0438 \u043b\u0435\u043f\u0438\u0442\u044c \u0432\u0441\u0451 \u043f\u043e\u0434\u0440\u044f\u0434, \u043a\u043e\u043d\u0444\u0438\u0433 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u00ab\u0442\u0430\u0439\u043c\u0430\u0443\u0442\u043d\u043e\u0435 \u0431\u043e\u043b\u043e\u0442\u043e\u00bb.<\/p>\n<p> <strong>NGINX <\/strong>\u0434\u0430\u0451\u0442 \u043d\u0430\u0431\u043e\u0440 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432 \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438 \u043f\u0440\u043e\u043a\u0441\u0438. \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435: <code>client_header_timeout<\/code>, <code>client_body_timeout<\/code> \u2014 \u0432\u0440\u0435\u043c\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432\/\u0442\u0435\u043b\u0430 \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430; <code>keepalive_timeout<\/code> \u2014 \u0432\u0440\u0435\u043c\u044f \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f keep-alive; <code>proxy_connect_timeout<\/code>, <code>proxy_read_timeout<\/code>, <code>proxy_send_timeout<\/code> \u2014 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 proxy_pass: \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0447\u0442\u0435\u043d\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438, \u0430 \u043d\u0435 \u0437\u0430 \u0432\u0435\u0441\u044c \u043e\u0442\u0432\u0435\u0442. \u0422\u043e \u0435\u0441\u0442\u044c <code>proxy_read_timeout<\/code> \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442 \u043f\u0430\u0443\u0437\u0443 \u043c\u0435\u0436\u0434\u0443 \u0447\u0442\u0435\u043d\u0438\u044f\u043c\u0438, \u0430 \u043d\u0435 \u043e\u0431\u0449\u0438\u0439 \u0441\u0440\u043e\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438.  <\/p>\n<pre><code class=\"nginx\">http {   client_header_timeout 60s;   client_body_timeout   60s;   keepalive_timeout     75s;   proxy_connect_timeout 10s;   proxy_read_timeout    300s;  # \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0434\u043b\u044f \u0434\u043e\u043b\u0433\u0438\u0445 \u043e\u0442\u0432\u0435\u0442\u043e\u0432\/streaming   proxy_send_timeout    300s; }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0445 gRPC\/HTTP2 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c <code>proxy_*_timeout<\/code> \u0438 \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 <code>http2_recv_timeout<\/code>\/\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 upstream. \u041c\u0438\u043d\u0443\u0441\u044b: \u043c\u0435\u043d\u044c\u0448\u0435 \u0433\u0440\u0430\u043d\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438, \u0447\u0435\u043c \u0443 HAProxy, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438\u043b\u0438 \u0442\u0443\u043d\u043d\u0435\u043b\u044f \u2014 \u0432\u0441\u0451 \u00ab\u043e\u043f\u0442\u043e\u043c\u00bb.<\/p>\n<p> <strong>Envoy <\/strong>\u043e\u043f\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430\u043c\u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 connection manager, route \u0438 cluster. \u0412\u0430\u0436\u043d\u044b\u0435 \u043f\u0443\u043d\u043a\u0442\u044b: <code>route timeout<\/code> \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 15s (\u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e upstream-\u043e\u0442\u0432\u0435\u0442\u0430; \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e downstream-\u0437\u0430\u043f\u0440\u043e\u0441\u0430), <code>stream_idle_timeout<\/code> \u0443 HTTP connection manager \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 5 \u043c\u0438\u043d\u0443\u0442 (\u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0431\u0435\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u0438\u043c\u044b), <code>cluster.connect_timeout<\/code>\/<code>transport_socket_connect_timeout<\/code> \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e ~5s. \u0422\u0430\u0439\u043c\u0430\u0443\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e \u0438 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430; per-route <code>timeout: 0s<\/code> \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0442\u0430\u0439\u043c\u0430\u0443\u0442 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430. \u0414\u043b\u044f \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u043e\u0432\u044b\u0445 API \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0442\u044c\/\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c route\/stream \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u044b.<\/p>\n<pre><code class=\"go\">http_connection_manager:   stream_idle_timeout: 300s   # \u043e\u0431\u044b\u0447\u043d\u043e 5m \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e route_config:   virtual_hosts:   - name: default     domains: [\"*\"]     routes:     - match: { prefix: \"\/\" }       route:         cluster: service_a         timeout: 0s         # \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c route timeout \u0434\u043b\u044f \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u0430         idle_timeout: 0s    # \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c per-route idle<\/code><\/pre>\n<p>\u0412 Envoy \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u043e\u0432 \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0438\u0437-\u0437\u0430 retry\/retry-timeout \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f connection-manager \u2194 route \u2194 cluster. \u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0441 retry \u0438 streaming. \u041f\u043b\u044e\u0441\u044b: \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0442\u043e\u043d\u043a\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438. \u041c\u0438\u043d\u0443\u0441\u044b: \u043a\u043e\u043d\u0444\u0438\u0433 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u00ab\u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0443 \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u00bb, \u0431\u0435\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0441\u0430\u043c\u043e\u043c\u0443 \u0441\u0435\u0431\u0435 \u2014 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0434\u0435\u043b\u044e \u043d\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u0448\u044c\u0441\u044f.<\/p>\n<p><strong>HAProxy <\/strong>\u2014 \u0441 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430\u043c\u0438 \u043a\u0430\u043a \u0441\u043e \u0448\u0432\u0435\u0439\u0446\u0430\u0440\u0441\u043a\u0438\u043c\u0438 \u0447\u0430\u0441\u0430\u043c\u0438. \u0412\u0441\u0451 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u044f\u0432\u043d\u043e: connect, client, server, http-request, keep-alive, tunnel. \u0425\u043e\u0447\u0435\u0448\u044c \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433 \u2014 \u043f\u043e\u0441\u0442\u0430\u0432\u044c timeout tunnel \u0438 \u0437\u0430\u0431\u0443\u0434\u044c. \u041c\u0438\u043d\u0438\u043c\u0443\u043c \u043c\u0430\u0433\u0438\u0438, \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f. \u0415\u0441\u043b\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u043b\u043e \u2014 \u044d\u0442\u043e \u0442\u0432\u043e\u044f \u0432\u0438\u043d\u0430, \u0430 \u043d\u0435 \u0441\u044e\u0440\u043f\u0440\u0438\u0437 \u0432 \u0434\u0435\u0444\u043e\u043b\u0442\u0430\u0445.<\/p>\n<p><strong>NGINX <\/strong>\u2014 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u044b \u043a\u0430\u043a \u0431\u044b\u0442\u043e\u0432\u0430\u044f \u0442\u0435\u0445\u043d\u0438\u043a\u0430. Client, proxy, keepalive \u2014 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043d\u043e \u043d\u0430\u0434\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e <code>proxy_read_timeout<\/code> \u043c\u0435\u0440\u044f\u0435\u0442 \u043f\u0430\u0443\u0437\u044b \u043c\u0435\u0436\u0434\u0443 \u0431\u0430\u0439\u0442\u0430\u043c\u0438, \u0430 \u043d\u0435 \u0432\u0441\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443. \u0414\u043b\u044f \u0434\u043e\u043b\u0433\u0438\u0445 gRPC \u0438\u043b\u0438 \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u0430 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u044b \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0440\u0443\u043a\u0430\u043c\u0438. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430\u0434\u0451\u0436\u043d\u043e, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u043f\u0440\u043e \u0432\u0441\u0435 \u0440\u0443\u0447\u043a\u0438.<\/p>\n<p><strong>Envoy <\/strong>\u2014 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u044b \u043a\u0430\u043a \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0434\u0435\u0434\u043b\u0430\u0439\u043d\u044b. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e <code>route timeout<\/code> 15 \u0441\u0435\u043a\u0443\u043d\u0434, <code>stream_idle_timeout<\/code> 5 \u043c\u0438\u043d\u0443\u0442 \u2014 \u0438 Envoy \u0431\u0435\u0437\u0436\u0430\u043b\u043e\u0441\u0442\u043d\u043e \u0440\u0430\u0437\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0435\u043a\u0442 \u0435\u0449\u0451 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432. \u0413\u0438\u0431\u043a\u043e\u0441\u0442\u0438 \u043c\u043e\u0440\u0435: \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u044b, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c idle \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043d\u0430 route \u0438 cluster, \u043d\u043e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0434\u0443\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0442\u044c.<\/p>\n<p><strong>\u0412\u044b\u0432\u043e\u0434:<\/strong><\/p>\n<ul>\n<li>\n<p><strong>HAProxy<\/strong> \u2014 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u0435\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f: \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432\u0441\u0451, \u0434\u0430\u0436\u0435 \u00ab\u0442\u0430\u0439\u043c\u0430\u0443\u0442 \u043d\u0430 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u00bb. \u041d\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>NGINX <\/strong>\u2014 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043d\u0430\u0431\u043e\u0440: \u0431\u044b\u0441\u0442\u0440\u043e, \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043d\u043e \u0431\u0435\u0437 \u0440\u0435\u0434\u043a\u0438\u0445 \u00ab\u0441\u043f\u0435\u0446\u0440\u0435\u0436\u0438\u043c\u043e\u0432\u00bb.<\/p>\n<\/li>\n<li>\n<p><strong>Envoy<\/strong> \u2014 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0441 \u043b\u044e\u0431\u044b\u043c\u0438 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430\u043c\u0438 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c, \u043d\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043c\u043e\u0437\u0433\u043e\u0432 \u0438 \u043a\u043e\u0444\u0435.<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h2>Kubernetes-\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f<\/h2>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/776\/d1e\/40c\/776d1e40cd336f5e31d95f3254a4f56b.gif\" width=\"800\" height=\"600\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/776\/d1e\/40c\/776d1e40cd336f5e31d95f3254a4f56b.gif 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/776\/d1e\/40c\/776d1e40cd336f5e31d95f3254a4f56b.gif 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p><strong>HAProxy. <\/strong>\u0415\u0441\u0442\u044c \u0434\u0432\u0430 OSS-\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430:<\/p>\n<ul>\n<li>\n<p><strong>haproxytech\/kubernetes-ingress<\/strong> \u2014 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 Ingress \u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c\u0438, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Gateway API \u0444\u043b\u0430\u0433\u043e\u043c. \u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u0434\u043b\u044f Prometheus \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438. \u041f\u043b\u0430\u0432\u043d\u0430\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u043d\u0430 \u043d\u043e\u0432\u044b\u0435 API.<\/p>\n<\/li>\n<li>\n<p><strong>jcmoraisjr\/haproxy-ingress<\/strong> \u2014 \u0442\u043e\u0436\u0435 Ingress v1, \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Gateway API (HTTPRoute\/Gateway \u0432 v0.14). \u041f\u043e\u0434\u043e\u0439\u0434\u0451\u0442, \u0435\u0441\u043b\u0438 \u0431\u043b\u0438\u0436\u0435 \u0435\u0433\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u0438\u043d\u0438\u043c\u0443\u043c \u043c\u0430\u0433\u0438\u0438, \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f. \u0415\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u2014 \u0432\u0438\u043d\u043e\u0432\u0430\u0442\u044b \u043d\u0435 \u00ab\u0443\u043c\u043d\u044b\u0435 \u0434\u0435\u0444\u043e\u043b\u0442\u044b\u00bb, \u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.<\/p>\n<p><strong>NGINX Ingress Controller <\/strong>\u2014 \u0444\u043e\u043a\u0443\u0441 \u043d\u0430 Ingress v1. TLS\/mTLS \u0447\u0435\u0440\u0435\u0437 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 (<code>auth-tls-*<\/code>), \u0432\u043d\u0435\u0448\u043d\u044f\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f (<code>auth-url<\/code>), \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0447\u0435\u0440\u0435\u0437 ConfigMap. \u0412\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u043e \u0437\u0430 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u043b\u0430\u0442\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e, \u043d\u043e \u00ab\u043e\u0441\u043e\u0431\u044b\u0435 \u0440\u0435\u0436\u0438\u043c\u044b\u00bb \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0440\u0443\u043a\u0430\u043c\u0438.<\/p>\n<p><strong>Envoy Gateway (OSS)<\/strong> \u2014 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 Gateway API, \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f SecurityPolicy \u0434\u043b\u044f mTLS\/JWT \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e \u043a\u043b\u0435\u0439\u043c\u0430\u043c, \u043c\u0435\u0442\u0440\u0438\u043a\u0438 Prometheus. <\/p>\n<p><strong>Contour<\/strong> \u2014 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 Envoy, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Gateway API \u0438 \u0441\u0432\u043e\u0438 CRD \u0434\u043b\u044f HTTP\/gRPC\/TCP. \u0413\u0438\u0431\u043a\u043e\u0441\u0442\u0438 \u043c\u043e\u0440\u0435: route, cluster, policy \u2014 \u0432\u0441\u0451 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u041d\u043e \u0437\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u043e\u043f\u0446\u0438\u044e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0434\u0443\u043c\u0430\u0442\u044c.<\/p>\n<p><strong>Istio \u2014 mesh \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0434\u0435\u043b.<\/strong> Envoy \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0440\u043e\u043b\u044c data plane, \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u0438 \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u044f \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c-\u043f\u043b\u0435\u0439\u043d. \u0415\u0441\u043b\u0438 mesh \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0438\u043b\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u2014 Ingress \u043b\u0443\u0447\u0448\u0435 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u0430 Istio \u0438\u043b\u0438 Gateway API \u0441 Envoy Gateway, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043b\u043e\u0434\u0438\u0442\u044c \u0437\u043e\u043e\u043f\u0430\u0440\u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432.<\/p>\n<p><strong>\u041a\u0440\u0430\u0442\u043a\u043e:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0425\u043e\u0442\u0438\u0442\u0435 \u00ab\u0432\u0441\u0451 \u043f\u043e\u0434 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u043c\u00bb \u0438 \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0441\u044e\u0440\u043f\u0440\u0438\u0437\u043e\u0432 \u2014 HAProxy.<\/p>\n<\/li>\n<li>\n<p>\u0425\u043e\u0442\u0438\u0442\u0435 \u00ab\u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u00bb \u2014 NGINX.<\/p>\n<\/li>\n<li>\n<p>\u0425\u043e\u0442\u0438\u0442\u0435 \u00ab\u0442\u043e\u043d\u043a\u0430\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u0438 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 API\u00bb \u2014 Envoy Gateway \u0438\u043b\u0438 Contour.<\/p>\n<\/li>\n<li>\n<p>\u0425\u043e\u0442\u0438\u0442\u0435 \u00ab\u0435\u0434\u0438\u043d\u0430\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u043d\u0430 \u0432\u0435\u0441\u044c \u0442\u0440\u0430\u0444\u0438\u043a\u00bb \u2014 Istio.<\/p>\n<\/li>\n<\/ul>\n<h4>\u0412\u044b\u0432\u043e\u0434<\/h4>\n<ul>\n<li>\n<p><strong>HAProxy<\/strong> \u2014 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u0435\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432\u0441\u0451. \u041d\u043e \u043b\u0435\u0433\u043a\u043e \u0443\u0442\u043e\u043d\u0443\u0442\u044c \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445.<\/p>\n<\/li>\n<li>\n<p><strong>NGINX <\/strong>\u2014 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u043f\u0443\u0442\u044c. \u0411\u044b\u0441\u0442\u0440\u043e \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u0442\u044c, \u0431\u0435\u0437 \u0440\u0435\u0434\u043a\u0438\u0445 \u00ab\u0441\u044e\u0440\u043f\u0440\u0438\u0437\u043e\u0432\u00bb.<\/p>\n<\/li>\n<li>\n<p><strong>Envoy\/Contour<\/strong> \u2014 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0438 \u0433\u043b\u0443\u0431\u043e\u043a\u0430\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 Gateway API. \u0422\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u043d\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>Istio<\/strong> \u2014 \u0435\u0441\u043b\u0438 mesh \u0443\u0436\u0435 \u0432 \u043f\u043b\u0430\u043d\u0430\u0445, Ingress \u043b\u0443\u0447\u0448\u0435 \u0441\u0440\u0430\u0437\u0443 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u0430 \u043d\u0451\u043c.<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h2>\u0412\u044b\u0432\u043e\u0434\u044b \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438<\/h2>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/baf\/3e8\/9ff\/baf3e89ff46e1c8587cfd224d631fbdc.png\" width=\"2000\" height=\"1000\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/baf\/3e8\/9ff\/baf3e89ff46e1c8587cfd224d631fbdc.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/baf\/3e8\/9ff\/baf3e89ff46e1c8587cfd224d631fbdc.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<div class=\"floating-image\">\n<p>\u041f\u043e\u0434\u043e\u0439\u0434\u0451\u0442, \u043a\u043e\u0433\u0434\u0430 \u0432\u0430\u0436\u043d\u0430 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c, \u0432\u044b\u0441\u043e\u043a\u0430\u044f \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 control-plane. \u041d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0441\u0438\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u2014 L4\/L7 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0441 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0443\u0447\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 (\u0442\u0430\u0439\u043c\u0430\u0443\u0442\u044b, maxconn, stick-tables, httpchk). QUIC\/H3 \u0432 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u2014 \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u043e \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0439\u0442\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b.<\/p>\n<\/div>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0431\u0440\u0430\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>Edge TLS-\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0446\u0438\u044f \u0441 \u0432\u044b\u0441\u043e\u043a\u0438\u043c\u0438 SLA \u043f\u043e latency.<\/p>\n<\/li>\n<li>\n<p>\u0411\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u0431\u044a\u0451\u043c\u044b TCP\/HTTP \u0442\u0440\u0430\u0444\u0438\u043a\u0430, \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u0430 \u043c\u0430\u043b\u0430\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0443\u0436\u0435\u043d \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u0438 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0430\u0432\u0442\u043e\u0437\u0430\u043c\u0435\u043d\u044b \u0431\u044d\u043a\u0435\u043d\u0434\u043e\u0432 (seamless reload).<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u043a\u0430\u043c\u043d\u0438:<\/p>\n<ul>\n<li>\n<p>\u0421\u043b\u043e\u0436\u043d\u044b\u0435 L7-\u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 Lua \u0438\u043b\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043b\u043e\u0433\u0438\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>HTTP\/3 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u0437\u043d\u0430\u043d\u0438\u0439 \u043e QUIC.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u2014 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c OTEL\/\u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u044b.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c83\/ad4\/7e7\/c83ad47e7196397f9101d60108b2f2c8.png\" width=\"2398\" height=\"1408\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c83\/ad4\/7e7\/c83ad47e7196397f9101d60108b2f2c8.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c83\/ad4\/7e7\/c83ad47e7196397f9101d60108b2f2c8.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<div class=\"floating-image\">\n<p>\u041b\u0443\u0447\u0448\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0438 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0432\u0435\u0431-\u0444\u0440\u043e\u043d\u0442\u043e\u0432, \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0439, \u0433\u0434\u0435 \u043a\u043e\u043d\u0444\u0438\u0433 \u00ab\u0440\u0430\u0437\u043b\u043e\u0436\u0438\u043b \u0438 \u0437\u0430\u0431\u044b\u043b\u00bb. HTTP\/2 \u0437\u0440\u0435\u043b, HTTP\/3 \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 mainline. \u0414\u043b\u044f WAF\/JWT\/metrics\/tracing \u2014 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0438\u043b\u0438 Plus<\/p>\n<\/div>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0431\u0440\u0430\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043d\u0442, reverse-proxy \u0441 \u043a\u0435\u0448\u0435\u043c, rate-limiting \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 edge.<\/p>\n<\/li>\n<li>\n<p>\u0411\u044b\u0441\u0442\u0440\u044b\u0439 rollout \u0438 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0431\u0435\u0437 control-plane.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0443\u0436\u0435\u043d \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0434\u0438\u043d\u0433 (lua, njs) \u0434\u043b\u044f \u043b\u0451\u0433\u043a\u043e\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u043a\u0430\u043c\u043d\u0438:<\/p>\n<ul>\n<li>\n<p>\u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0435 health-checks, advanced LB \u0438 enterprise-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0432 Plus.<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u0438 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440\u043e\u0432\/\u043c\u043e\u0434\u0443\u043b\u0435\u0439.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/575\/333\/034\/575333034a55adc5e5a3ca881935c8d5.png\" width=\"768\" height=\"768\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/575\/333\/034\/575333034a55adc5e5a3ca881935c8d5.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/575\/333\/034\/575333034a55adc5e5a3ca881935c8d5.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<div class=\"floating-image\">\n<p>\u0415\u0441\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f, \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0430\u044f, \u0441 gRPC, \u043a\u0430\u043d\u0430\u0440\u0435\u0435\u0447\u043d\u044b\u043c\u0438 \u0440\u0435\u043b\u0438\u0437\u0430\u043c\u0438, shadow-\u0442\u0440\u0430\u0444\u0438\u043a\u043e\u043c \u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0439 \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u0438 \u2014 Envoy \u0434\u0430\u0451\u0442 \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443. \u0422\u0440\u0435\u0431\u0443\u0435\u0442 control-plane (xDS) \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<\/div>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0431\u0440\u0430\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>Service mesh \u0438\u043b\u0438 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 L7-\u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p>gRPC-first \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0438 \u043e\u0431\u0448\u0438\u0440\u043d\u0430\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430\/OTel.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0443\u0436\u043d\u043e \u0433\u0438\u0431\u043a\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0430\u043d\u0430\u0440\u0435\u044f\u043c\u0438, retry\/circuit-breaker, rate-limit \u0447\u0435\u0440\u0435\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u043a\u0430\u043c\u043d\u0438:<\/p>\n<ul>\n<li>\n<p>\u0412\u044b\u0441\u043e\u043a\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f YAML-\u043f\u043e\u043b\u0438\u0442\u0438\u043a.<\/p>\n<\/li>\n<li>\n<p>\u0411\u043e\u043b\u044c\u0448\u0435 CPU\/RAM \u043d\u0430 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u0430\u0445 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 NGINX\/HAProxy.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0440\u0435\u0431\u0443\u0435\u0442 CI\/CD \u0434\u043b\u044f xDS\/\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c-\u043f\u043b\u0435\u0439\u043d\u0430 \u0438 \u0445\u043e\u0440\u043e\u0448\u0435\u0439 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<p><strong>\u0418\u0442\u043e\u0433\u043e \u043f\u043e \u0441\u0438\u043d\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0440\u0430\u0437\u0431\u043e\u0440\u0443:<\/strong><\/p>\n<ul>\n<li>\n<p>\u041d\u0438\u0437\u043a\u0430\u044f \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0438 \u0433\u0440\u0443\u0431\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c L4\/L7 \u2192 <strong>HAProxy<\/strong><\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0435\u0431-\u0444\u0440\u043e\u043d\u0442, \u043a\u0435\u0448, \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043d\u0442, \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438 \u2192 <strong>NGINX<\/strong><\/p>\n<\/li>\n<li>\n<p>\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u043d\u0430\u044f \u0441\u0440\u0435\u0434\u0430, gRPC, mesh, \u043a\u0430\u043d\u0430\u0440\u0435\u0438\/\u0442\u0440\u0430\u0444\u0438\u043a-\u043c\u0435\u043d\u0435\u0434\u0436\u043c\u0435\u043d\u0442 \u2192 <strong>Envoy<\/strong><\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u043e\u0432\u0435\u0442\u044b \u043f\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044e<\/strong><\/p>\n<ul>\n<li>\n<p>Test-first: \u0434\u043b\u044f HTTP\/3 \u0438 QUIC \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0439\u0442\u0435 \u044d\u0442\u0430\u043f \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430 \u0438 SLO-\u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e<\/p>\n<\/li>\n<li>\n<p>Observability: \u0435\u0441\u043b\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0435 Envoy \u2014 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u0439\u0442\u0435 OTEL-\u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0441\u0440\u0430\u0437\u0443. \u0414\u043b\u044f HAProxy\/NGINX \u0433\u043e\u0442\u043e\u0432\u044c\u0442\u0435 Prometheus \u2192 OTEL\/Jaeger \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e<\/p>\n<\/li>\n<li>\n<p>K8s: \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e ingress \u2014 ingress-nginx \u0438\u043b\u0438 haproxy-ingress; \u0434\u043b\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0438 mesh \u2014 Envoy Gateway\/Contour\/Istio. \u041f\u043b\u0430\u043d\u0438\u0440\u0443\u0439\u0442\u0435 \u0435\u0434\u0438\u043d\u044b\u0439 control-plane, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043b\u043e\u0434\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0441\u0443\u0440\u0441\u044b: \u0437\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0439\u0442\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 CPU\/RAM \u043f\u043e\u0434 Envoy \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0435\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439.<\/p>\n<\/li>\n<\/ul>\n<p>NGINX \u2014 \u043a\u0430\u043a \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434 \u0441 \u043a\u043e\u0440\u0437\u0438\u043d\u043a\u043e\u0439: \u0437\u0430\u0432\u0451\u043b \u0438 \u0437\u0430\u0431\u044b\u043b, \u043d\u043e \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0443\u0435\u0434\u0435\u0448\u044c. HAProxy\u00a0\u2014 \u043a\u0430\u043a \u043d\u0430\u0434\u0451\u0436\u043d\u044b\u0439 \u0436\u0438\u0433\u0443\u043b\u044c: \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e, \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e, \u043d\u043e \u0431\u0435\u0437 \u043d\u0430\u0432\u043e\u0440\u043e\u0442\u043e\u0432. Envoy\u00a0\u2014 \u043a\u0430\u043a BMW: \u043b\u0435\u0442\u0438\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e, \u043d\u043e \u0432\u0435\u0447\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u043e\u0432\u044b\u0440\u044f\u0442\u044c\u0441\u044f \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c. \u0412\u0441\u0451 \u0435\u0434\u0435\u0442, \u0432\u043e\u043f\u0440\u043e\u0441 \u0442\u043e\u043b\u044c\u043a\u043e \u2014 \u043a\u0443\u0434\u0430 \u0438 \u0441 \u043a\u0430\u043a\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e.<\/p>\n<h4>\u041a\u0442\u043e \u043f\u043e\u0431\u0435\u0434\u0438\u043b?<\/h4>\n<p>\u041f\u043e \u0441\u0443\u043c\u043c\u0435 \u043f\u043b\u044e\u0441\u043e\u0432 \u2014 <strong>Envoy<\/strong>, \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0438\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445, telemetry-heavy \u0438 gRPC-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. <strong>HAProxy<\/strong> \u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0435\u0440\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u043f\u043e \u0441\u044b\u0440\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0435 L4\/L7 \u0432 \u0432\u044b\u0441\u043e\u043a\u0438\u0445 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430\u0445. <strong>NGINX<\/strong> \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0438\u043c \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0445 web\/edge \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0441 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0438 \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c.<\/p>\n<p>P.S.\u00a0\u0415\u0441\u043b\u0438 \u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0433\u0434\u0435-\u0442\u043e \u0447\u0442\u043e-\u0442\u043e \u0443\u043f\u0443\u0441\u0442\u0438\u043b, \u043e\u0448\u0438\u0431\u0441\u044f \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435 \u0438\u043b\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u2014 \u043f\u0440\u0438\u0441\u044b\u043b\u0430\u0439\u0442\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043b\u0438\u0447\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u044f \u043c\u043e\u0433 \u0432\u043d\u0435\u0441\u0442\u0438 \u0438\u0445 \u0432 \u0441\u0442\u0430\u0442\u044c\u044e.  <\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/937898\/\"> https:\/\/habr.com\/ru\/articles\/937898\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u043f\u0438\u0441\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u044e \u043f\u0440\u043e <a href=\"https:\/\/habr.com\/ru\/companies\/gnivc\/articles\/935146\/\" rel=\"noopener noreferrer nofollow\">HAProxy<\/a>, \u0443 \u043c\u0435\u043d\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0434\u0435\u044f \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c proxy-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441 <a href=\"https:\/\/habr.com\/ru\/companies\/gnivc\/articles\/864528\/\" rel=\"noopener noreferrer nofollow\">Envoy<\/a>. \u041d\u043e \u0442\u043e\u0433\u0434\u0430 \u043c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0432 \u0432\u0438\u0434\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438\u043b\u0438 \u043f\u0430\u0440\u044b \u0430\u0431\u0437\u0430\u0446\u0435\u0432 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u2014 \u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u2014 \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c! \u0417\u0434\u0435\u0441\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u043d\u0435 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043d\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u2014 \u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0430\u0436\u043d\u044b \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435.<\/p>\n<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0437\u0431\u0435\u0440\u0443 \u0442\u0440\u0438 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043f\u0440\u043e\u043a\u0441\u0438, \u0441\u0440\u0430\u0432\u043d\u044e \u0438\u0445 \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443: \u0447\u0442\u043e, \u0433\u0434\u0435 \u0438 \u043a\u043e\u0433\u0434\u0430 \u043b\u0443\u0447\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c. \u041f\u043e\u0434 \u00ab\u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c\u0438\u00bb \u044f \u0438\u043c\u0435\u044e \u0432 \u0432\u0438\u0434\u0443 \u0442\u0435, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441\u0430\u043c \u0438 \u0438\u0437\u0443\u0447\u0438\u043b \u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u00ab\u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c\u00bb. \u041f\u0440\u043e\u043a\u0441\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435, \u043d\u043e \u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443 \u2014 \u043b\u0438\u0431\u043e \u043d\u0435 \u043a\u043e\u043f\u0430\u043b \u0433\u043b\u0443\u0431\u043e\u043a\u043e, \u043b\u0438\u0431\u043e \u0437\u043d\u0430\u044e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0430\u043b\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438\u0445 \u0432 \u0440\u0430\u0437\u0431\u043e\u0440. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u043c\u0435\u0447\u0443 \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438: \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u0437\u0430\u043f\u0443\u0442\u0430\u043d\u0430 \u0438\u043b\u0438 \u043d\u0435\u043f\u043e\u043b\u043d\u0430, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0433\u0430\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u0438 \u0433\u0434\u0435 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c, \u0430 \u044d\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043e\u0442\u0431\u0438\u0432\u0430\u0435\u0442 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c.<\/p>\n<p><strong>HAProxy 3.3<\/strong>, <strong>NGINX 1.29<\/strong> \u0438 <strong>Envoy 1.35<\/strong> \u2014 \u0442\u0440\u0438 open source-\u043f\u0440\u043e\u043a\u0441\u0438 \u0441 \u0440\u0430\u0437\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439 \u0438 \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f. Enterprise-\u0432\u0435\u0440\u0441\u0438\u0438 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443 \u2014 \u043a\u0430\u043f\u0438\u0442\u0430\u043b\u0438\u0437\u043c \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0432\u043e\u0435 \u0434\u0435\u043b\u043e: \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u044b\u0445 \u043e\u0442\u043b\u0438\u0447\u0438\u0439 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u0442, \u0430 \u0432\u043e\u0442 \u0432 OSS-\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u0445 \u0435\u0441\u0442\u044c \u0447\u0442\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u2014 \u0432 \u0440\u044f\u0434\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0446\u0438\u044f \u043f\u043e\u0448\u043b\u0430 \u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u0443.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c. \u0420\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c \u0441\u0430\u043c\u044b\u0435 \u0441\u0432\u0435\u0436\u0438\u0435 \u0440\u0435\u043b\u0438\u0437\u044b \u043d\u0430 \u0434\u0430\u0442\u0443 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438.<\/p>\n<p><strong>\u041f\u043b\u0430\u043d \u0440\u0430\u0437\u0431\u043e\u0440\u0430:<\/strong><\/p>\n<ol>\n<li>\n<p><strong>\u0426\u0435\u043b\u044c \u0438 \u0432\u0435\u0440\u0441\u0438\u0438 <\/strong>(\u0442\u043e\u043b\u044c\u043a\u043e open source, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 stable-\u0432\u0435\u0442\u043a\u0438)<\/p>\n<\/li>\n<li>\n<p><strong>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 <\/strong>(\u041c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u0442\u043e\u043a\u043e\u0432\/\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, event-loop, \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f vs \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f (xDS, Data Plane API).<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b<\/strong> L4\/L7 (HTTP\/1.1, HTTP\/2, HTTP\/3\/QUIC, gRPC, WebSocket, TCP\/UDP)<\/p>\n<\/li>\n<li>\n<p><strong>\u0411\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u044f<\/strong> (\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b round-robin, least-conn, hash, L7-\u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b, \u0430\u0444\u0444\u0438\u043d\u0438\u0442\u0438)<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u0438 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c<\/strong> (Health-check, retries, circuit-breaking, rate-limiting)<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u044c <\/strong>(\u041c\u0435\u0442\u0440\u0438\u043a\u0438 Prometheus\/StatsD, \u043b\u043e\u0433\u0438, OpenTelemetry\/Jaeger, \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430)<\/p>\n<\/li>\n<li>\n<p><strong>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c <\/strong>(TLS 1.3, mTLS, RBAC, OAuth\/JWT)<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 <\/strong>(\u041e\u0431\u043b\u0430\u0441\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435, \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435)<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u0430\u0439\u043c\u0430\u0443\u0442\u044b <\/strong>(\u0432\u0438\u0434\u044b, \u0433\u0434\u0435\\\u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c, \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b)<\/p>\n<\/li>\n<li>\n<p><strong>Kubernetes-\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f (<\/strong>gateway, ingress, service mesh)<\/p>\n<\/li>\n<\/ol>\n<h2>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h2>\n<p><strong>HAProxy.<\/strong> \u0412\u044b\u0441\u043e\u043a\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 L4\/L7-\u043f\u0440\u043e\u043a\u0441\u0438 \u0441 \u043c\u043e\u0434\u0435\u043b\u044c\u044e master\u2013worker \u0438 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u043c event-loop. \u041c\u0430\u0441\u0442\u0435\u0440 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438, \u0432\u043e\u0440\u043a\u0435\u0440\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u0442\u0440\u0430\u0444\u0438\u043a \u2014 \u043a\u0430\u043a \u0448\u0435\u0444-\u043f\u043e\u0432\u0430\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0435\u0442 \u0435\u0434\u0443, \u043d\u043e \u0441\u043b\u0435\u0434\u0438\u0442, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0432\u0430\u0440\u0430 \u043d\u0435 \u0441\u043f\u0430\u043b\u0438. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 TCP\/HTTP, TLS-\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0446\u0438\u044e, health-checks \u0438 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438. \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u0430, \u043d\u043e \u0435\u0441\u0442\u044c Runtime API \u0434\u043b\u044f \u0436\u0438\u0432\u044b\u0445 \u043f\u0440\u0430\u0432\u043e\u043a; \u043f\u043e\u043b\u043d\u044b\u0439 reconfigure \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0431\u0435\u0441\u0448\u043e\u0432\u043d\u044b\u0439 reload. \u0422\u0438\u043f\u043e\u0432\u043e\u0439 \u043a\u0435\u0439\u0441: <code>frontend<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 HTTPS, \u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u0443\u0435\u0442 TLS, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 <code>backend<\/code> \u043f\u043e <code>leastconn<\/code> \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u2014 pipeline \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0435\u0435, \u0447\u0435\u043c \u0431\u044e\u0434\u0436\u0435\u0442 \u0432 \u0441\u0442\u0430\u0440\u0442\u0430\u043f\u0435. <\/p>\n<figure class=\"full-width\"><\/figure>\n<p><strong>NGINX.<\/strong> \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u00abmaster + workers\u00bb. \u0412\u043e\u0440\u043a\u0435\u0440\u044b \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 TLS\/HTTP, \u043f\u0430\u0440\u0441\u044f\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442 \u0444\u0438\u043b\u044c\u0442\u0440\u044b, \u043a\u0435\u0448 \u0438 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u0443\u044e\u0442 \u043d\u0430 <code>upstream<\/code>. \u0425\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439, \u0435\u0441\u043b\u0438 \u00ab\u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430\u00bb \u043d\u0443\u0436\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438 Lua. \u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0431\u0435\u0441\u0448\u043e\u0432\u043d\u0430\u044f: \u0441\u0442\u0430\u0440\u044b\u0435 \u0432\u043e\u0440\u043a\u0435\u0440\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043d\u043e\u0432\u044b\u0435 \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b \u2014 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0434\u0440\u0430\u043c\u044b, \u043a\u0440\u043e\u043c\u0435 \u043a\u0430\u043a \u0443 \u0430\u0434\u043c\u0438\u043d\u0430 \u0432 3 \u043d\u043e\u0447\u0438. \u0422\u0438\u043f\u043e\u0432\u043e\u0439 \u043a\u0435\u0439\u0441: <code>server<\/code> \u0441 <code>proxy_pass<\/code> \u043d\u0430 \u043f\u0443\u043b API, \u0441 \u043a\u0435\u0448\u0435\u043c \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043f\u043e \u043a\u043b\u044e\u0447\u0443. JWT\/OAuth? \u0418\u043b\u0438 Plus, \u0438\u043b\u0438 Lua \u2014 \u0432\u044b\u0431\u0438\u0440\u0430\u0439\u0442\u0435, \u0447\u0442\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u043b\u043e\u043c\u0430\u0435\u0442 \u043c\u043e\u0437\u0433.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p><strong>Envoy.<\/strong> \u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 L4\/L7-\u043f\u0440\u043e\u043a\u0441\u0438 \u0441 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/latest\/intro\/arch_overview\/operations\/dynamic_configuration#xds-configuration-api-overview\" rel=\"noopener noreferrer nofollow\">xDS<\/a>. \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0434\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u0438\u0431\u043a\u0430\u044f \u0434\u043e \u0430\u0431\u0441\u0443\u0440\u0434\u0430: \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0442\u0440\u0430\u0444\u0438\u043a \u0445\u043e\u0442\u044c \u043d\u0430 \u043a\u043e\u0444\u0435\u043c\u0430\u0448\u0438\u043d\u0443, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u043e\u0431\u044a\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432 <a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/latest\/intro\/arch_overview\/operations\/dynamic_configuration#eds\" rel=\"noopener noreferrer nofollow\">EDS<\/a>. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 HTTP\/1.1, HTTP\/2, HTTP\/3, gRPC, \u0440\u0435\u0442\u0440\u0430\u0438, \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 hot-restart \u0431\u0435\u0437 \u043e\u0431\u0440\u044b\u0432\u0430 \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u2014 \u0445\u043e\u0442\u044c \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0439\u0441\u044f \u043a\u0430\u0436\u0434\u0443\u044e \u043c\u0438\u043d\u0443\u0442\u0443. \u0422\u0438\u043f\u043e\u0432\u043e\u0439 \u043a\u0435\u0439\u0441: listener \u0441 TLS, \u0434\u0430\u043b\u0435\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432 (ALPN \u2192 HTTP\/2 \u2192 router) \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u0442 gRPC-\u043f\u043e\u0442\u043e\u043a\u0438 \u043f\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0430\u043c\u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0438 \u0443\u0445\u043e\u0434\u044f\u0442, \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u0434\u0435\u043c\u043e.<\/p>\n<figure class=\"full-width\"><\/figure>\n<p><strong>\u0418\u0442\u043e\u0433\u043e \u043f\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435:<\/strong><\/p>\n<ul>\n<li>\n<p>HAProxy \u2014 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0437\u043c, \u0432\u044b\u0441\u043e\u043a\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043c\u0430\u0433\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>NGINX \u2014 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u0437\u0440\u0435\u043b\u0430\u044f \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u043d\u043e \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c\u044e.<\/p>\n<\/li>\n<li>\n<p>Envoy \u2014 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u0438 API-\u0446\u0435\u043d\u0442\u0440\u0438\u0447\u043d\u043e\u0441\u0442\u044c, \u043d\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0432 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h2>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b <\/h2>\n<figure class=\"full-width\"><\/figure>\n<p>HAProxy \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a TCP\/UDP-\u043f\u0440\u043e\u043a\u0441\u0438 \u0438 \u043f\u043e\u043b\u043d\u043e\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 HTTP-\u043f\u0440\u043e\u043a\u0441\u0438. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 HTTP\/1.1, HTTP\/2 \u0438 HTTP\/3 (<code>QUIC<\/code>), \u0432\u043a\u043b\u044e\u0447\u0430\u044f ALPN (<code>Application-Layer Protocol Negotiation<\/code>) \u0438 SNI (<code>Server Name Indication<\/code>). \u041c\u043e\u0436\u0435\u0442 \u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c TLS \u0438\u043b\u0438 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c TLS passthrough. gRPC \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 HTTP\/2 \u0431\u0435\u0437 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432.   <\/p>\n<pre><code class=\"go\"> frontend fe   mode http   bind :80   bind :443  ssl crt \/etc\/haproxy\/certs\/foo.com\/cert.crt alpn h2   bind quic4@:443 ssl crt \/mycert.pem alpn h3   http-request redirect scheme https unless { ssl_fc }   http-after-response add-header alt-svc 'h3=\":443\"; ma=60'  backend be_api     mode http     option httpchk GET \/health     server s1 10.0.0.31:443 ssl verify none sni str(api.example.com) alpn h2 check     server s2 10.0.0.32:443 ssl verify none sni str(api.example.com) alpn h2 check<\/code><\/pre>\n<p>\u0412\u0445\u043e\u0434\u044f\u0449\u0438\u0439 TLS-\u0442\u0440\u0430\u0444\u0438\u043a \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 443, ALPN \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 HTTP\/2 \u0438\u043b\u0438 HTTP\/3, \u0437\u0430\u0442\u0435\u043c HAProxy \u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435, \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u0443\u0435\u0442 \u043f\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 h2 \u0438 \u0448\u0438\u0444\u0440\u0443\u0435\u0442 \u0442\u0440\u0430\u0444\u0438\u043a \u0437\u0430\u043d\u043e\u0432\u043e. \u041f\u043b\u044e\u0441\u044b: \u0432\u044b\u0441\u043e\u043a\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430 L4 \u0438 L7, \u0437\u0440\u0435\u043b\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 HTTP\/2. \u041c\u0438\u043d\u0443\u0441\u044b: \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 HTTP\/3\/QUIC \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438; \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 L7-\u043f\u0440\u0430\u0432\u0438\u043b \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e ACL \u0438 Lua. Downstream\/Upstream: HAProxy \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c HTTP\/1.1, HTTP\/2 \u0438\u043b\u0438 HTTP\/3 \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 (downstream) \u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043a \u0431\u044d\u043a\u0435\u043d\u0434\u0443 (upstream). \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 h1\u2192h2, h2\u2192h1, h2\u2192h2, h3\u2192h1 \u0438 \u0442.\u0434., \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043c\u0435\u0436\u0434\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0431\u0435\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439.    <\/p>\n<p>NGINX \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a TCP-stream \u043f\u0440\u043e\u043a\u0441\u0438 \u0438 \u043a\u0430\u043a HTTP-\u043f\u0440\u043e\u043a\u0441\u0438. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 HTTP\/1.1 \u0438 HTTP\/2 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438. HTTP\/3\/QUIC \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 1.25+ \u0447\u0435\u0440\u0435\u0437 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u044b <code>quic<\/code> \u0438 <code>http3<\/code>. gRPC \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c <code>grpc_pass<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0432\u0435\u0440\u0445 HTTP\/2.<\/p>\n<pre><code class=\"nginx\">server {     listen 443 ssl http2;     ssl_certificate     \/etc\/nginx\/certs\/site.pem;     ssl_certificate_key \/etc\/nginx\/certs\/site.key;      location \/ {         proxy_pass https:\/\/backend_pool;         proxy_http_version 1.1;     } }  server {     listen 8443 quic reuseport;     listen 8443 ssl;     ssl_certificate     \/etc\/nginx\/certs\/site.pem;     ssl_certificate_key \/etc\/nginx\/certs\/site.key;      location \/api {         add_header Alt-Svc 'h3=\":8443\"; ma=86400';         proxy_pass https:\/\/backend_pool;         proxy_http_version 1.1;     } }  upstream backend_pool {     least_conn;     server 10.0.0.31:443;     server 10.0.0.32:443; } <\/code><\/pre>\n<p>NGINX \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 TLS-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 HTTP\/2 \u0438\u043b\u0438 HTTP\/3 \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u043d\u043e \u043a backend \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0445\u043e\u0434\u0438\u0442 \u043f\u043e HTTP\/1.1 (\u043a\u0440\u043e\u043c\u0435 gRPC). \u041f\u043b\u044e\u0441\u044b: \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 HTTP\/2, \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433. \u041c\u0438\u043d\u0443\u0441\u044b: HTTP\/3 \u043c\u0435\u043d\u0435\u0435 \u0437\u0440\u0435\u043b\u044b\u0439 \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f; stream-\u0440\u0435\u0436\u0438\u043c TCP \u043d\u0435 \u0434\u0430\u0451\u0442 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0439 L7-\u043b\u043e\u0433\u0438\u043a\u0438; \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0432 Plus-\u0432\u0435\u0440\u0441\u0438\u0438. Downstream\/Upstream: \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043f\u043e HTTP\/1.1, HTTP\/2 \u0438\u043b\u0438 HTTP\/3, \u043d\u043e \u043a backend \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e HTTP\/1.1 (\u043a\u0440\u043e\u043c\u0435 gRPC-location).<\/p>\n<p>Envoy \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u043a\u0430\u043a L4\/L7-\u043f\u0440\u043e\u043a\u0441\u0438 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 <a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/latest\/configuration\/listeners\/network_filters\/tcp_proxy_filter\" rel=\"noopener noreferrer nofollow\">TCP<\/a>\/<a href=\"https:\/\/www.envoyproxy.io\/docs\/envoy\/latest\/configuration\/listeners\/udp_filters\/udp_proxy\" rel=\"noopener noreferrer nofollow\">UDP <\/a>HTTP\/1.1, HTTP\/2, HTTP\/3 \u0438 gRPC. \u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 ALPN, \u0430 \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u043a TCP, \u0442\u0430\u043a \u0438 \u043f\u043e\u043b\u043d\u044b\u0439 HTTP-\u043f\u043e\u0442\u043e\u043a. \u0414\u043b\u044f upstream \u043d\u0430 TLS\/443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c <code>http2_protocol_options<\/code> \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c <code>transport_socket<\/code> \u0434\u043b\u044f TLS.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u043e\u043d\u0444\u0438\u0433 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 h1\/h2\/h3<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"go\">admin:   address:     socket_address:       address: 127.0.0.1       port_value: 9901  static_resources:   listeners:   - name: main_listener     address:       socket_address:         address: 0.0.0.0         port_value: 443     # TLS \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0434\u043b\u044f HTTPS     listener_filters:     - name: envoy.filters.listener.tls_inspector       typed_config:         \"@type\": type.googleapis.com\/envoy.extensions.filters.listener.tls_inspector.v3.TlsInspector      filter_chains:     - filter_chain_match:         application_protocols: [\"h2\", \"http\/1.1\"]       transport_socket:         name: envoy.transport_sockets.tls         typed_config:           \"@type\": type.googleapis.com\/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsConfig           common_tls_context:             tls_certificates:             - certificate_chain: {filename: \"\/etc\/envoy\/cert.pem\"}               private_key: {filename: \"\/etc\/envoy\/privkey.pem\"}           require_client_certificate: false       filters:       - name: envoy.filters.network.http_connection_manager         typed_config:           \"@type\": type.googleapis.com\/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager           stat_prefix: ingress_http           http2_protocol_options: {}           http_protocol_options: {}           codec_type: AUTO            route_config:             name: local_route             virtual_hosts:             - name: local_service               domains: [\"*\"]               routes:               - match: {prefix: \"\/\"}                 route: {cluster: backend_cluster}            http_filters:           - name: envoy.filters.http.router             typed_config:               \"@type\": type.googleapis.com\/envoy.extensions.filters.http.router.v3.Router      # \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 filter chain \u0434\u043b\u044f HTTP\/3     - filter_chain_match:         transport_protocol: \"quic\"       transport_socket:         name: envoy.transport_sockets.quic         typed_config:           \"@type\": type.googleapis.com\/envoy.extensions.transport_sockets.quic.v3.QuicDownstreamTransportConfig           downstream_tls_context:             common_tls_context:               tls_certificates:               - certificate_chain: {filename: \"\/etc\/envoy\/cert.pem\"}                 private_key: {filename: \"\/etc\/envoy\/privkey.pem\"}       filters:       - name: envoy.filters.network.http_connection_manager         typed_config:           \"@type\": type.googleapis.com\/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager           stat_prefix: ingress_http_quic           http2_protocol_options: {}           http_protocol_options: {}           codec_type: HTTP3            route_config:             name:<\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-471709","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/471709","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=471709"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/471709\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=471709"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=471709"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=471709"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}