HTTP рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╕рдордп рдкрд░реАрдХреНрд╖рдг рдФрд░ рддреНрд░реБрдЯрд┐

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!

рдЖрдЬ рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдУрд╕реНрдЯреНрд░реЛрд╡реЛрдХреЙрд╡ рд╣реЛрдЯрд▓ рдЖрд░рдХреНрд╖рдг рд╕реЗрд╡рд╛ рдЯреАрдо рдиреЗ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд╡рд░ рд╡рд┐рдХрд╛рд╕ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдХрд╛ рдХрд╛рд░реНрдп рд╣рдорд╛рд░реЗ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕реВрдЪрдирд╛ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реИред рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдУрдбреНрд░реЛрд╡реЙрдХ рдореЗрдВ рджреЗрд╡рдУрдкреНрд╕ рдЯреАрдо рд▓реАрдбред


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдорд╛рдЗрдХреНрд░реЛрд╕реИрд╕ рд╕рд░реНрд╡рд┐рд╕ рдЫреЛрдЯрд╛ рдерд╛ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░рддрд╛ рдерд╛:

  • рд╕реНрдерд╛рдиреАрдп рд╕реЗрд╡рд╛ рд╕реЗ рдЕрдиреБрд░реЛрдз рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ;
  • рдПрдХ рд╕рд╛рдереА рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ;
  • рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░реЗрдВ;
  • рдХреНрд╡реЗрд░реА рд╕реЗрд╡рд╛ рдкрд░ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдПрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рдордп рдмреАрдд рдЧрдпрд╛, рд╕реЗрд╡рд╛ рднрд╛рдЧреАрджрд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЙрдирдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдмрдврд╝рддреА рдЧрдИред

рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рд╕реЗрд╡рд╛ рдмрдврд╝реА, рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ рдЙрднрд░рдиреЗ рд▓рдЧреАрдВред рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рджрд╛рддрд╛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рдЖрдЧреЗ рд░рдЦрддреЗ рд╣реИрдВ: рдХреЛрдИ рдЕрдзрд┐рдХрддрдо рдХрдиреЗрдХреНрд╢рди рдХреА рд╕реАрдорд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХреЛрдИ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╕рдлреЗрдж рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдкрдбрд╝рд╛:

  • рдХрдИ рдирд┐рд╢реНрдЪрд┐рдд рдмрд╛рд╣рд░реА рдЖрдИрдкреА рдкрддреЗ рд╣реЛрдирд╛ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕рдлреЗрдж рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рдЧреАрджрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХреЗрдВ,
  • рд╕рднреА рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХрд╛ рдПрдХ рдПрдХрд▓ рдкреВрд▓ рд╣реИ рддрд╛рдХрд┐ рдЬрдм рд╣рдорд╛рд░реЗ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреЛ рд╕реНрдХреЗрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП рддреЛ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рд╕реЗ рдХрдо рдмрдиреА рд░рд╣реЗ,
  • SSL рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдПрдХ рд╕реНрдерд╛рди рдкрд░ рд░рдЦреЗрдВ, рдЬрд┐рд╕рд╕реЗ рднрд╛рдЧреАрджрд╛рд░реЛрдВ рдкрд░ рднрд╛рд░ рдХрдо рд╣реЛред

рдЙрдиреНрд╣реЛрдВрдиреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдФрд░ рддреБрд░рдВрдд рд╕реЛрдЪрд╛ рдХрд┐ рдХреНрдпрд╛ рдЪреБрдирдирд╛ рд╣реИ: рдирдЧрдиреЗрдХреНрд╕ рдпрд╛ рд╣рд╛рдкреНрд░реЛрд╕реАред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреЗрдВрдбреБрд▓рдо рдиреЗрдЧреНрдиреЗрдХреНрд╕ рдХреА рдУрд░ рдШреВрдо рдЧрдпрд╛, рдХреНрдпреЛрдВрдХрд┐ HTTP / HTTPS I рд╕реЗ рдЬреБрдбрд╝реА рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЗрд╕рдХреА рдорджрдж рд╕реЗ рд╣рд▓ рд╣реБрдИрдВ рдФрд░ рд╣рдореЗрд╢рд╛ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдереАрдВред

рдпрд╣ рдпреЛрдЬрдирд╛ рд╕рд░рд▓ рдереА: Nginx рдкрд░ рд╣рдорд╛рд░реЗ рдирдП рдкреНрд░реЙрдХреНрд╕реА рд╕рд░реНрд╡рд░ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдлреЙрд░реНрдо рдХреЗ рдПрдХ рдбреЛрдореЗрди рдХреЗ рд╕рд╛рде <partner_tag>.domain.local , Nginx рдореЗрдВ рдПрдХ map рдерд╛ рдЬрд╣рд╛рдВ <partner_tag> рд╕рд╛рдЭреЗрджрд╛рд░ рдХреЗ рдкрддреЗ рдХреЗ рдЕрдиреБрд░реВрдк рдерд╛ред рдПрдХ рдкрддрд╛ map рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ proxy_pass рдХреЛ рдЗрд╕ рдкрддреЗ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг map рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдбреЛрдореЗрди рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реВрдЪреА рд╕реЗ рдЕрдкрд╕реНрдЯреНрд░реАрдо рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ:

 ###     : <tag>.domain.local map $http_host $upstream_prefix { default 0; "~^([^\.]+)\." $1; } ###      map $upstream_prefix $upstream_address { include snippet.d/upstreams_map; default http://127.0.0.1:8080; } ###   upstream_host    upstream_address map $upstream_address $upstream_host { default 0; "~^https?://([^:]+)" $1; } 

рдФрд░ рдпрд╣рд╛рдБ " snippet.d/upstreams_map " рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
 тАЬoneтАЭ тАЬhttp://one.domain.netтАЭ; тАЬtwoтАЭ тАЬhttps://two.domain.orgтАЭ; 

рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ server{} :

 server { listen 80; location / { proxy_http_version 1.1; proxy_pass $upstream_address$request_uri; proxy_set_header Host $upstream_host; proxy_set_header X-Forwarded-For ""; proxy_set_header X-Forwarded-Port ""; proxy_set_header X-Forwarded-Proto ""; } } # service for error handling and logging server { listen 127.0.0.1:8080; location / { return 400; } location /ngx_status/ { stub_status; } } 

рд╕рдм рдХреБрдЫ рд╢рд╛рдВрдд рд╣реИ, рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдпрджрд┐ рдПрдХ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред

рдкреНрд░реЙрдХреНрд╕реА_рдкрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЕрдиреБрд░реЛрдз рд╕реАрдзреЗ рдПрдХ рд╡рд╛рдВрдЫрд┐рдд рдкрддреЗ рдкрд░ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, HTTP / 1.0 рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдмрд┐рдирд╛ keepalive рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рд╣рдо proxy_http_version 1.1 , рддреЛ рднреА рдЕрдкрд╕реНрдЯреНрд░реАрдо ( рдкреНрд░реЙрдХреНрд╕реА_http_version ) рдХреЗ рдмрд┐рдирд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред

рдХреНрдпрд╛ рдХрд░реЗрдВ? рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рд╕рднреА рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрдкрд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд▓рд╛рдирд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕рд░реНрд╡рд░ рдХреЛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛ рдХрд╛ рдкрддрд╛ рд╣реЛрдЧрд╛, рдФрд░ map "tag" "upstream_name" ред

рдпреЛрдЬрдирд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ map рдЬреЛрдбрд╝реЗрдВ:

 ###     : <tag>.domain.local map $http_host $upstream_prefix { default 0; "~^([^\.]+)\." $1; } ###      map $upstream_prefix $upstream_address { include snippet.d/upstreams_map; default http://127.0.0.1:8080; } ###   upstream_host    upstream_address map $upstream_address $upstream_host { default 0; "~^https?://([^:]+)" $1; } ###   ,       https,    ,    -  http map $upstream_address $upstream_scheme { default "http://"; "~(https?://)" $1; } 

рдФрд░ рдЯреИрдЧ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде upstreams рдмрдирд╛рдПрдВ:
  upstream one { keepalive 64; server one.domain.com; } upstream two { keepalive 64; server two.domain.net; } 

рд╕рд░реНрд╡рд░ рдХреЛ рдпреЛрдЬрдирд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдФрд░ рдкрддреЗ рдХреЗ рдмрдЬрд╛рдп рдЕрдкрд╕реНрдЯреНрд░реАрдо рдХреЗ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 server { listen 80; location / { proxy_http_version 1.1; proxy_pass $upstream_scheme$upstream_prefix$request_uri; proxy_set_header Host $upstream_host; proxy_set_header X-Forwarded-For ""; proxy_set_header X-Forwarded-Port ""; proxy_set_header X-Forwarded-Proto ""; } } # service for error handling and logging server { listen 127.0.0.1:8080; location / { return 400; } location /ngx_status/ { stub_status; } } 

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ред рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрд╕реНрдЯреНрд░реАрдо рдореЗрдВ proxy_http_version 1.1 рдбрд╛рдпрд░реЗрдХреНрдЯрд┐рд╡ рдХреЛ рдЬреЛрдбрд╝реЗрдВ, proxy_http_version 1.1 рд╕реЗрдЯ рдХрд░реЗрдВ, - рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рд╣реИ, рдФрд░ рд╕рдм рдХреБрдЫ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕ рдмрд╛рд░, рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд▓реЗрдЦ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЪрд╛рдп рдкреА рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛ рдирд╣реАрдВ?

рджрд░рдЕрд╕рд▓, рдЬрдм рд╣рдо рдЪрд╛рдп рдкреА рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рдПрдХ рд╣реА рдбреЛрдореЗрди (рд╣рд╛рдп, рдЕрдореЗрдЬрд╝реЕрди) рдХреЗ рддрд╣рдд рдЖрдИрдкреА рдкрддреЗ рдпрд╛ рдкрддреЗ рдХреЗ рд╕рдореВрд╣ рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣рдорд╛рд░реА рдЪрд╛рдп рдкрд╛рд░реНрдЯреА рдХреА рдКрдВрдЪрд╛рдИ рдкрд░ рдЧрд┐рд░ рд╕рдХрддрд╛ рд╣реИред

рдЦреИрд░, рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ? рдиреЗрдЧреНрдиреЗрдХреНрд╕ рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рд╣реИ: рдкреБрдирдГ рд▓реЛрдб рдХреЗ рджреМрд░рд╛рди, рдпрд╣ рдКрдкрд░ рдХреЗ рд╕рд░реНрд╡рд░реЛрдВ рдХреЛ рдирдП рдкрддреЗ рддрдХ upstream рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрди рдкрд░ рдЯреНрд░реИрдлрд╝рд┐рдХ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рд╕рдорд╛рдзрд╛рди рднреАред рд╣рд░ 5 рдорд┐рдирдЯ рдореЗрдВ cron reload nginx рдореЗрдВ рдлреЗрдВрдХ рджреЗрдВ рдФрд░ рдЪрд╛рдп рдкреАрдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВред

рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдпрд╣ рдореБрдЭреЗ рдПрдХ рдмрд╣реБрдд рд╣реА рдирд┐рд░реНрдгрдп рд▓рдЧ рд░рд╣рд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╣рд╛рдкреНрд░реЛрд╕реА рдХреА рдУрд░ рдкреВрдЫрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред

рд╣рд╛рдкреНрд░реЛрд╕реА рдореЗрдВ dns resolvers рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдФрд░ dns cache рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рд╛рдкреНрд░реЛрд╕реА dns cache рдЕрдкрдбреЗрдЯ рдХрд░ рджреЗрдЧрд╛ рдпрджрд┐ рдЗрд╕рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ рд╣реИрдВ, рдФрд░ рдЕрдЧрд░ рд╡реЗ рдмрджрд▓ рдЧрдП рд╣реИрдВ рддреЛ рдЕрдкрд╕реНрдЯреНрд░реАрдо рдХреЗ рдкрддреЗ рдХреЛ рдмрджрд▓ рджреЗрдВред

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! рдЕрдм рдпрд╣ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред

рдпрд╣рд╛рдБ Haproxy рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╡рд┐рдиреНрдпрд╛рд╕ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

 frontend http bind *:80 http-request del-header X-Forwarded-For http-request del-header X-Forwarded-Port http-request del-header X-Forwarded-Proto capture request header Host len 32 capture request header Referer len 128 capture request header User-Agent len 128 acl host_present hdr(host) -m len gt 0 use_backend %[req.hdr(host),lower,field(1,'.')] if host_present default_backend default resolvers dns hold valid 1s timeout retry 100ms nameserver dns1 1.1.1.1:53 backend one http-request set-header Host one.domain.com server one--one.domain.com one.domain.com:80 resolvers dns check backend two http-request set-header Host two.domain.net server two--two.domain.net two.domain.net:443 resolvers dns check ssl verify none check-sni two.domain.net sni str(two.domain.net) 

рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рдмрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдореБрдЭреЗ рд╣рд╛рдкреНрд░реЛрд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рд╡рд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рд╡рд░рдг рдХреА рдЬрдЯрд┐рд▓рддрд╛ рд╣реИред рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдкрд╕реНрдЯреНрд░реАрдо рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЯреЗрдХреНрд╕реНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЖрд▓рд╕реНрдп рдкреНрд░рдЧрддрд┐ рдХрд╛ рдЗрдВрдЬрди рд╣реИ: рдпрджрд┐ рдЖрдк рдПрдХ рд╣реА рдмрд╛рдд рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдЬрдирд░реЗрдЯрд░ рд▓рд┐рдЦреЗрдВред

рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирдЧреНрдиреЗрдХреНрд╕ рд╕реЗ рдПрдХ рдкреНрд░рд╛рд░реВрдк рдерд╛ "tag" "upstream" рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдиреЗ, рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдФрд░ рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╣рд╛рдЗрдкреНрд░реЛрдпреЛ рдмреИрдХрдПрдВрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред

 #! /usr/bin/env bash haproxy_backend_map_file=./root/etc/haproxy/snippet.d/name_domain_map haproxy_backends_file=./root/etc/haproxy/99_backends.cfg nginx_map_file=./nginx_map while getopts 'n:b:m:' OPT;do case ${OPT} in n) nginx_map_file=${OPTARG} ;; b) haproxy_backends_file=${OPTARG} ;; m) haproxy_backend_map_file=${OPTARG} ;; *) echo 'Usage: ${0} -n [nginx_map_file] -b [haproxy_backends_file] -m [haproxy_backend_map_file]' exit esac done function write_backend(){ local tag=$1 local domain=$2 local port=$3 local server_options="resolvers dns check" [ -n "${4}" ] && local ssl_options="ssl verify none check-sni ${domain} sni str(${domain})" [ -n "${4}" ] && server_options+=" ${ssl_options}" cat >> ${haproxy_backends_file} <<EOF backend ${tag} http-request set-header Host ${domain} server ${tag}--${domain} ${domain}:${port} ${server_options} EOF } :> ${haproxy_backends_file} :> ${haproxy_backend_map_file} while read tag addr;do tag=${tag//\"/} [ -z "${tag:0}" ] && continue [ "${tag:0:1}" == "#" ] && continue IFS=":" read scheme domain port <<<${addr//;} unset IFS domain=${domain//\/} case ${scheme} in http) port=${port:-80} write_backend ${tag} ${domain} ${port} ;; https) port=${port:-443} write_backend ${tag} ${domain} ${port} 1 esac done < <(sort -V ${nginx_map_file}) 

рдЕрдм рд╣рдо рд╕рднреА рдХреЛ nginx_map рдореЗрдВ рдПрдХ рдирдпрд╛ рд╣реЛрд╕реНрдЯ рдЬреЛрдбрд╝рдирд╛ рд╣реИ, рдЬрдирд░реЗрдЯрд░ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рддреИрдпрд╛рд░ рд╣реИрдкреНрд░реЛрдХреНрд╕реА рдХреЙрдиреНрдлрд┐рдЧрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

рдЖрдЬ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдпрд╣ рд▓реЗрдЦ рдЕрдзрд┐рдХ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рд╣реИ рдФрд░ рдПрдХ рд╕рдорд╛рдзрд╛рди рдЪреБрдирдиреЗ рдФрд░ рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рд╡реЗрд╢ рдореЗрдВ рдЗрд╕рдХреЗ рдПрдХреАрдХрд░рдг рдХреА рд╕рдорд╕реНрдпрд╛ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред

рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рд╣рд╛рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╣рдореЗрдВ рдХреНрдпрд╛ рдиреБрдХрд╕рд╛рди рд╣реБрдП, рдЬреЛ рдХрд┐ рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдЙрдкрдпреЛрдЧреА рд╕рд╛рдмрд┐рдд рд╣реБрдП, рдФрд░ рд╕рд░реНрд╡рд░ рд╕реЗ рдЕрдзрд┐рдХрддрдо рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж, рджреЗрдЦрд┐рдпреЗ!

Source: https://habr.com/ru/post/hi436992/


All Articles