Π‘Ρ‚ΠΎΠ»ΠΊΠ½ΡƒΠ²ΡˆΠΈΡΡŒ с Π²Π½Π΅Π·Π°ΠΏΠ½Ρ‹ΠΌ ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠ»ΠΈ ΠΏΠΎΠ»Π½Ρ‹ΠΌ ΠΎΡ‚ΠΊΠ°Π·ΠΎΠΌ сСрвиса, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ часто ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ Π² Π»ΠΎΠ³Π°Ρ… Π²Π΅Π±-сСрвСра ΠΏΡƒΠ³Π°ΡŽΡ‰ΡƒΡŽ запись unhealthy upstream. На популярных ΠΏΠ»ΠΎΡ‰Π°Π΄ΠΊΠ°Ρ… Π²Ρ€ΠΎΠ΄Π΅ Авито, Π³Π΄Π΅ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° исчисляСтся ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π°ΠΌΠΈ запросов Π² сСкунду, эта ошибка ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ критичСский сбой Π² ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ балансировщиком Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ сСрвСром ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π­Ρ‚ΠΎ Π½Π΅ просто "сайт Π»Π΅ΠΆΠΈΡ‚", это сигнал ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ систСма ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° посчитала бэкСнд-сСрвСр нСдоступным ΠΈΠ»ΠΈ нСспособным ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ Π² Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π».

ПониманиС ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊΠΈ возникновСния этой ошибки Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ погруТСния Π² Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ взаимодСйствия Nginx (ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ³ΠΎ прокси) ΠΈ upstream-сСрвСров. Когда прокси-сСрвСр пСрСстаСт ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π²Π°Π»ΠΈΠ΄Π½Ρ‹Π΅ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ ΠΎΡ‚ ΠΏΡƒΠ»Π° сСрвСров, ΠΎΠ½ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ошибки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²ΠΈΠ΄ΠΈΡ‚ ΠΊΠ°ΠΊ Π½Π΅Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ страницы. ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠΌ являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ unhealthy upstream β€” это состояниС, присвоСнноС сСрвСру систСмой ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°, Π° Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ физичСский ΠΎΠ±Ρ€Ρ‹Π² соСдинСния. Π Π°Π·Π±ΠΎΡ€ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ ΠΈ способов устранСния Ρ‚Π°ΠΊΠΈΡ… ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚ΠΎΠ² Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ систСмного ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΈ знания Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… процСссов Π²Π΅Π±-сСрвСра.

АрхитСктурная ΡΡƒΡ‚ΡŒ ошибки ΠΈ Ρ€ΠΎΠ»ΡŒ Nginx

Π’ основС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π»Π΅ΠΆΠΈΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ прокси. Π‘Π΅Ρ€Π²Π΅Ρ€, принимая запрос ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠ΅Ρ€Π΅ΡΠ»Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΈΠ· сСрвСров Π² Π³Ρ€ΡƒΠΏΠΏΠ΅ upstream. Если Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ сСрвСр Π½Π΅ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚, зависаСт ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚, прокси ΠΏΠΎΠΌΠ΅Ρ‡Π°Π΅Ρ‚ Π΅Π³ΠΎ ΠΊΠ°ΠΊ unhealthy (Π½Π΅Π·Π΄ΠΎΡ€ΠΎΠ²Ρ‹ΠΉ). Π’ контСкстС высоконагруТСнных систСм, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Авито, Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ слоТныС схСмы балансировки, это состояниС ΠΌΠΎΠΆΠ΅Ρ‚ быстро Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π½Π° вСсь ΠΏΡƒΠ», Ссли Π½Π΅ настроСны ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ Π»ΠΈΠΌΠΈΡ‚Ρ‹ ΠΈ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Ρ‹.

Часто ошибка Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈΠ·-Π·Π° исчСрпания рСсурсов. Когда всС Π²ΠΎΡ€ΠΊΠ΅Ρ€Ρ‹ Nginx заняты ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ΠΌ ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΎΡ‚ бэкСнда, Π½ΠΎΠ²Ρ‹Π΅ соСдинСния Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ установлСны. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ каскадному эффСкту. Π’Π°ΠΆΠ½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ ситуации, ΠΊΠΎΠ³Π΄Π° сСрвСр физичСски нСдоступСн (network unreachable), ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ просто Π½Π΅ успСваСт ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π·Π° ΠΎΡ‚Π²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ врСмя (timeout). Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Ρ‚Π΅Ρ€ΡΡŽΡ‚ΡΡ сразу, Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ β€” соСдинСниС висит Π² состоянии ESTABLISHED Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Ρ€Π°Π·Ρ€Ρ‹Π²Π°.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ proxy_pass ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π³Ρ€ΡƒΠΏΠΏΡ‹ upstream ΠΈΠ³Ρ€Π°ΡŽΡ‚ Ρ€Π΅ΡˆΠ°ΡŽΡ‰ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ. Если Π² настройках ΡƒΠΊΠ°Π·Π°Π½ΠΎ слишком ΠΌΠ°Π»ΠΎΠ΅ количСство ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Ρ… ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ (proxy_next_upstream), сСрвСр Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ Π½Π΅Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ слишком быстро. И Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, слишком Π΄ΠΎΠ»Π³ΠΈΠ΅ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ "Π·Π°ΠΌΠΎΡ€ΠΎΠ·ΠΈΡ‚ΡŒ" вСсь ΠΏΠΎΡ‚ΠΎΠΊ запросов. НСобходимо Ρ‚ΠΎΠ½ΠΊΠΎ Π±Π°Π»Π°Π½ΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ Π½Π° сбой ΠΈ toleranΡΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°ΠΌ сСти.

πŸ’‘

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ proxy_next_upstream_tries для ограничСния количСства ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ сСрвСр, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ бСсконСчных Ρ†ΠΈΠΊΠ»ΠΎΠ² пСрСнаправлСния ΠΏΡ€ΠΈ массовых сбоях.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ возникновСния статусов 502 ΠΈ 504

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ€Π΅Π΄ΠΊΠΎ Π²ΠΈΠ΄ΠΈΡ‚ тСхничСский Ρ‚Π΅Ρ€ΠΌΠΈΠ½ "unhealthy", Π΅ΠΌΡƒ доступны ΠΊΠΎΠ΄Ρ‹ состояния HTTP. Π§Π°Ρ‰Π΅ всСго это 502 Bad Gateway ΠΈΠ»ΠΈ 504 Gateway Timeout. Π­Ρ‚ΠΈ ΠΊΠΎΠ΄Ρ‹ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ шлюз (Nginx) ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Π½Π΅Π²Π°Π»ΠΈΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚ ΠΈΠ»ΠΈ Π½Π΅ доТдался Π΅Π³ΠΎ ΠΎΡ‚ Π²Ρ‹ΡˆΠ΅ΡΡ‚ΠΎΡΡ‰Π΅Π³ΠΎ сСрвСра. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΊΡ€Ρ‹Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Π² сСтСвых ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ…, Ρ‚Π°ΠΊ ΠΈ Π² логичСских ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… прилоТСния.

Одной ΠΈΠ· частых ΠΏΡ€ΠΈΡ‡ΠΈΠ½ являСтся ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΏΡƒΠ»Π° соСдинСний Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ внСшнСго API. Если бэкСнд-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π° Java ΠΈΠ»ΠΈ Go) ΠΆΠ΄Π΅Ρ‚ освобоТдСния соСдинСния с Π‘Π”, ΠΎΠ½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ прокси. Π’ Π»ΠΎΠ³Π°Ρ… это выглядит ΠΊΠ°ΠΊ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚. Π’Π°ΠΊΠΆΠ΅ стоит ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π»ΠΈΠΌΠΈΡ‚Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы: Ссли исчСрпан Π»ΠΈΠΌΠΈΡ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… дСскрипторов (ulimit), Π½ΠΎΠ²Ρ‹ΠΉ сокСт ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π΅ удастся, ΠΈ соСдинСниС Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ±Ρ€ΠΎΡˆΠ΅Π½ΠΎ.

НС стоит ΡΠ±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ со счСтов ΠΈ чСловСчСский Ρ„Π°ΠΊΡ‚ΠΎΡ€ ΠΈΠ»ΠΈ ошибки дСплоя. Π’Ρ‹ΠΊΠ°Ρ‚ΠΊΠ° Π½ΠΎΠ²ΠΎΠΉ вСрсии ΠΊΠΎΠ΄Π° с Π±Π°Π³Π°ΠΌΠΈ, Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΈ исполнСния, ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Ρ„Π°ΠΉΡ€Π²ΠΎΠ»Π° ΠΌΠΎΠ³ΡƒΡ‚ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π΄ΠΎΡ€ΠΎΠ²Ρ‹ΠΉ сСрвСр Π² unhealthy. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях автоматичСскиС систСмы оркСстрации (Kubernetes, Docker Swarm) ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°Ρ‡Π°Ρ‚ΡŒ бСсконСчно ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ‹, усугубляя ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ.

πŸ“Š Π§Ρ‚ΠΎ Ρ‡Π°Ρ‰Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ unhealthy upstream Π² вашСй ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅?
ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…
НСхватка памяти Π½Π° сСрвСрС
Π‘Π΅Ρ‚Π΅Π²Ρ‹Π΅ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ
Ошибки Π² ΠΊΠΎΠ΄Π΅ прилоТСния

Диагностика Ρ‡Π΅Ρ€Π΅Π· Π»ΠΎΠ³ΠΈ ΠΈ систСмныС ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ шагом Π² устранСнии Π½Π΅ΠΏΠΎΠ»Π°Π΄ΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡ‚Π°Ρ‚ΡŒ Π°Π½Π°Π»ΠΈΠ· Π»ΠΎΠ³ΠΎΠ². Π’ Π»ΠΎΠ³Π°Ρ… Nginx (error.log) ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Ρ‚ΠΎΡ‡Π½ΡƒΡŽ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ ΠΎΡ‚ΠΊΠ°Π·Π°. Записи Π²ΠΈΠ΄Π° upstream timed out ΠΈΠ»ΠΈ connect() failed Π΄Π°ΡŽΡ‚ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΡƒΡŽ подсказку. Однако ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Π»ΠΎΠ³ΠΈ Π²Π΅Π±-сСрвСра нСдостаточно. НСобходимо ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ самого прилоТСния: ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ CPU, ΠΏΠ°ΠΌΡΡ‚ΡŒ, количСство Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

ИспользованиС инструмСнтов ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° Π²Ρ€ΠΎΠ΄Π΅ Prometheus ΠΈΠ»ΠΈ Grafana позволяСт ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Ρƒ Π² Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠ΅. Π Π΅Π·ΠΊΠΈΠΉ скачок latency (Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ) часто ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΠ΅Ρ‚ появлСнию ошибок 502. Если Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ врСмя ΠΎΡ‚Π²Π΅Ρ‚Π° бэкСнда выросло с 50 мс Π΄ΠΎ 5 сСкунд, Π° Π·Π°Ρ‚Π΅ΠΌ пошли ΠΎΡ‚ΠΊΠ°Π·Ρ‹, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° явно Π½Π° сторонС прилоТСния ΠΈΠ»ΠΈ Π΅Π³ΠΎ зависимостСй. Π’Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ срСдниС значСния, Π½ΠΎ ΠΈ ΠΏΠ΅Ρ€Ρ†Π΅Π½Ρ‚ΠΈΠ»ΠΈ (p95, p99).

Для Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠΉ диагностики сСтСвых ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ tcpdump ΠΈΠ»ΠΈ wireshark. Они ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, доходят Π»ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Π΄ΠΎ сСрвСра ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ Ρ„Π»Π°Π³ΠΈ (RST, FIN) приходят Π² ΠΎΡ‚Π²Π΅Ρ‚. Иногда ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° кроСтся Π² MTU ΠΈΠ»ΠΈ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², Ρ‡Ρ‚ΠΎ стандартными ΠΏΠΈΠ½Π³Π°ΠΌΠΈ Π½Π΅ обнаруТиваСтся. Π’Π°ΠΊΠΆΠ΅ стоит ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ состояниС ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ соСдинСний Π² ядрС Linux.

Π‘ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ для Π°Π½Π°Π»ΠΈΠ·Π°

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ somaxconn Π² ядрС Linux β€” ΠΎΠ½ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ входящих соСдинСний. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ слишком ΠΌΠ°Π»ΠΎ, лишниС соСдинСния Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚Π±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒΡΡ Π΅Ρ‰Π΅ Π΄ΠΎ попадания Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

Настройка Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ΠΎΠ² ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Ρ… ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ

Грамотная настройка Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ΠΎΠ² β€” это искусство компромисса. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ proxy_connect_timeout опрСдСляСт, сколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΆΠ΄Π°Ρ‚ΡŒ установлСния соСдинСния с бэкСндом. Если ΠΎΠ½ слишком ΠΌΠ°Π», ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹Π΅ сСрвСры Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ proxy_read_timeout Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ сСрвСра. Π•Π³ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ спасти ΠΎΡ‚ Π»ΠΎΠΆΠ½Ρ‹Ρ… сбоСв ΠΏΡ€ΠΈ Π΄ΠΎΠ»Π³ΠΈΡ… запросах, Π½ΠΎ Π·Π°ΠΉΠΌΠ΅Ρ‚ Π²ΠΎΡ€ΠΊΠ΅Ρ€Ρ‹.

ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ proxy_next_upstream позволяСт ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ запрос Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ сСрвСр ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ошибки. Однако ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ остороТно. Если ошибка Π²Ρ‹Π·Π²Π°Π½Π° Π½Π΅ сбоСм ΠΎΠ΄Π½ΠΎΠ³ΠΎ сСрвСра, Π° ΠΎΠ±Ρ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡƒΠΏΠ°Π»Π° Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ…), Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ сСрвСр лишь создаст Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΈ ускорит ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ всСй систСмы. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ proxy_next_upstream non_idempotent с ΡƒΠΌΠΎΠΌ.

Π’ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ upstream Ρ‚Π°ΠΊΠΆΠ΅ Π²Π°ΠΆΠ½Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ max_fails ΠΈ fail_timeout. Они ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚, сколько Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹Ρ… ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ Π½ΡƒΠΆΠ½ΠΎ для ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠΈ сСрвСра ΠΊΠ°ΠΊ unhealthy ΠΈ ΠΊΠ°ΠΊ Π΄ΠΎΠ»Π³ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ. Для ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Ρ‹Ρ… сСрвисов эти значСния Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ быстро ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ сбойный ΡƒΠ·Π΅Π» ΠΈΠ· Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΈ, Π½ΠΎ Π½Π΅ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ°Π»Ρ‹ΠΌΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ сСтСвыС ΡˆΡƒΠΌΡ‹ Π½Π΅ Π²Ρ‹Π±ΠΈΠ²Π°Π»ΠΈ сСрвСры ΠΈΠ· строя.

β˜‘οΈ Настройка Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚ΠΎΠ² Nginx

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ: 0 / 4

Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΊΠΎΠ΄ΠΎΠ² ошибок ΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½

Для быстрого ориСнтирования Π² Ρ‚ΠΈΠΏΠ°Ρ… сбоСв ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ²ΠΎΠ΄Π½ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ. Она ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ быстро ΠΊΠ»Π°ΡΡΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΏΠΎ симптомам, Π½Π°Π±Π»ΡŽΠ΄Π°Π΅ΠΌΡ‹ΠΌ Π² Π»ΠΎΠ³Π°Ρ… ΠΈΠ»ΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π΅.

Код/Бтатус Π’ΠΈΠΏ ошибки ВСроятная ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π“Π΄Π΅ ΠΈΡΠΊΠ°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅
502 Bad Gateway НСвалидный ΠΎΡ‚Π²Π΅Ρ‚ Π‘Π΅Ρ€Π²Π΅Ρ€ Π·Π°ΠΊΡ€Ρ‹Π» соСдинСниС (RST) Π›ΠΎΠ³ΠΈ прилоТСния, Π»ΠΈΠΌΠΈΡ‚Ρ‹ памяти
504 Gateway Timeout Π’Π°ΠΉΠΌΠ°ΡƒΡ‚ Π‘Π΅Ρ€Π²Π΅Ρ€ Π½Π΅ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΠ» Π·Π° ΠΎΡ‚Π²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ врСмя ΠœΠ΅Π΄Π»Π΅Π½Π½Ρ‹Π΅ SQL-запросы, CPU
503 Service Unavailable БСрвис нСдоступСн ВсС сСрвСра Π² upstream unhealthy ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Nginx, Π·Π΄ΠΎΡ€ΠΎΠ²ΡŒΠ΅ всСх ΡƒΠ·Π»ΠΎΠ²
Connection Refused ΠžΡ‚ΠΊΠ°Π· соСдинСния ΠŸΠΎΡ€Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚ ΠΈΠ»ΠΈ процСсс ΡƒΠΏΠ°Π» Бтатус процСсса, Ρ„Π°ΠΉΡ€Π²ΠΎΠ»

Анализируя Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ 502 ΠΈ 504 β€” это Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ частыС спутники ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ unhealthy upstream. Однако 503 ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π±ΠΎΠ»Π΅Π΅ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΊΠΎΠ³Π΄Π° Π·Π΄ΠΎΡ€ΠΎΠ²Ρ‹Ρ… сСрвСров Π½Π΅ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ совсСм. Π­Ρ‚ΠΎ состояниС Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²ΠΌΠ΅ΡˆΠ°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ сСрвис ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠ°Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½.

АвтоматичСскоС восстановлСниС ΠΈ самодиагностика

Π’ соврСмСнных ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Ρ… инфраструктурах Ρ€ΡƒΡ‡Π½ΠΎΠ΅ исправлСниС Ρ‚Π°ΠΊΠΈΡ… ошибок ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ΅. БистСмы оркСстрации, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Kubernetes, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ liveness ΠΈ readiness ΠΏΡ€ΠΎΠ±. Если ΠΏΠΎΠ΄ Π½Π΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ liveness, ΠΎΠ½ пСрСзапускаСтся. Если Π½Π΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ readiness β€” Ρ‚Ρ€Π°Ρ„ΠΈΠΊ Π½Π° Π½Π΅Π³ΠΎ Π½Π΅ подаСтся. Π­Ρ‚ΠΎ позволяСт автоматичСски ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ unhealthy ΡƒΠ·Π»Ρ‹ ΠΈΠ· балансировщика Π±Π΅Π· участия Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°.

Однако Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠΊΠ° Π½Π΅ всСсильна. Если ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Π»ΠΎΠ³ΠΈΠΊΠ΅ прилоТСния (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, deadlock Π² ΠΊΠΎΠ΄Π΅), пСрСзапуск ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΏΠΎΠΌΠΎΡ‡ΡŒ, Π° лишь ΡƒΡ‡Π°ΡΡ‚ΠΈΡ‚ΡŒ падСния. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ критичСски Π²Π°ΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ "intelligent" ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΡŽΡ‚ Π½Π΅ просто Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΡ€Ρ‚Π°, Π° Ρ€Π΅Π°Π»ΡŒΠ½ΡƒΡŽ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ прилоТСния Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π΅Π»Π°Ρ‚ΡŒ тСстовый запрос ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ….

Π’Π°ΠΊΠΆΠ΅ стоит Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ Circuit Breaker (Ρ€Π°Π·ΠΌΡ‹ΠΊΠ°Ρ‚Π΅Π»ΡŒ Ρ†Π΅ΠΏΠΈ) Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ микросСрвисов. Если Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, сСрвис Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΉ Π½Π° Авито) Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ ошибками, Circuit Breaker размыкаСтся, ΠΈ запросы ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°ΡŽΡ‚ ΠΈΠ΄Ρ‚ΠΈ Ρ‚ΡƒΠ΄Π° Π²ΠΎΠΎΠ±Ρ‰Π΅, возвращая Π·Π°Π³Π»ΡƒΡˆΠΊΡƒ ΠΈΠ»ΠΈ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. Π­Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ каскадный ΠΎΡ‚ΠΊΠ°Π· всСй систСмы.

πŸ’‘

АвтоматичСскоС восстановлСниС эффСктивно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… настройках ΠΏΡ€ΠΎΠ± (probes); слСпыС ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΡΡƒΠ³ΡƒΠ±ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΏΡ€ΠΈ Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠ΅ рСсурсов.

ΠŸΡ€ΠΎΡ„ΠΈΠ»Π°ΠΊΡ‚ΠΈΠΊΠ° ΠΈ Π»ΡƒΡ‡ΡˆΠΈΠ΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ риски появлСния unhealthy upstream, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ±Π»ΡŽΠ΄Π°Ρ‚ΡŒ ряд ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΡƒΠ»Ρ‹ соСдинСний с Ρ€Π°Π·ΡƒΠΌΠ½Ρ‹ΠΌΠΈ Π»ΠΈΠΌΠΈΡ‚Π°ΠΌΠΈ. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, внСдряйтС graceful degradation: ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡƒΠΌΠ΅Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² усСчСнном Ρ€Π΅ΠΆΠΈΠΌΠ΅, Ссли Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅Π³ΠΎ части нСдоступны. Π’-Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΡ…, рСгулярно ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅ Π½Π°Π³Ρ€ΡƒΠ·ΠΎΡ‡Π½ΠΎΠ΅ тСстированиС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π½Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ своСй систСмы.

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Никогда Π½Π΅ устанавливайтС Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Ρ‹ Π½Π° бэкСндС большС, Ρ‡Π΅ΠΌ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Ρ‹ Π½Π° прокси-сСрвСрС. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ситуации, ΠΊΠΎΠ³Π΄Π° Nginx ΡƒΠΆΠ΅ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΠ» ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ‚ΡΠΆΠ΅Π»ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, Π²ΠΏΡƒΡΡ‚ΡƒΡŽ расходуя рСсурсы.

РСгулярный Π°ΡƒΠ΄ΠΈΡ‚ ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Ρ‚Π°ΠΊΠΆΠ΅ обязатСлСн. Π”ΠΎΠ»Π³ΠΈΠ΅ синхронныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π²Π½Π΅ΡˆΠ½ΠΈΡ… API Π²Π½ΡƒΡ‚Ρ€ΠΈ основного ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запроса β€” прямой ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Π°ΠΌ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ асинхронныС ΠΌΠΎΠ΄Π΅Π»ΠΈ взаимодСйствия ΠΈΠ»ΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π·Π°Π΄Π°Ρ‡ для Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

НаконСц, Π½Π΅ Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π›ΠΎΠ³ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ структурированными ΠΈ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ достаточно контСкста (trace-id), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ ΠΏΡƒΡ‚ΡŒ запроса Ρ‡Π΅Ρ€Π΅Π· всС сСрвисы. Π‘Π΅Π· качСствСнных Π»ΠΎΠ³ΠΎΠ² поиск ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ unhealthy upstream прСвращаСтся Π² Π³Π°Π΄Π°Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΡ„Π΅ΠΉΠ½ΠΎΠΉ Π³ΡƒΡ‰Π΅.

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠŸΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с upstream ΠΈΠ·Π±Π΅Π³Π°ΠΉΡ‚Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ verbose-логирования Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅ Π±Π΅Π· ограничСния ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ дискового пространства ΠΈ падСнию сСрвСра ΠΏΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠΈ мСста (No space left on device).

Π‘Π΅ΠΊΡ€Π΅Ρ‚ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π°Π΄Π°ΠΏΡ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ динамичСски ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π² зависимости ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½Π° систСму, вмСсто ТСстко Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… констант.

FAQ: Часто Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ вопросы

ΠœΠΎΠΆΠ΅Ρ‚ Π»ΠΈ ошибка unhealthy upstream Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°?

НСт, эта ошибка гСнСрируСтся Π½Π° сСрвСрС (прокси) ΠΈ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ сСрвСрной инфраструктуры. ΠšΠ»ΠΈΠ΅Π½Ρ‚ лишь ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ этой ошибки Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΠ΄Π° 502 ΠΈΠ»ΠΈ 504.

Как быстро Nginx ΠΏΠΎΠΌΠ΅Ρ‡Π°Π΅Ρ‚ сСрвСр ΠΊΠ°ΠΊ unhealthy ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ?

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ссли ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ max_fails Π½Π΅ Π·Π°Π΄Π°Π½, сСрвСр считаСтся Π½Π΅Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌ послС ΠΎΠ΄Π½ΠΎΠΉ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΉ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ, Π° врСмя ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (fail_timeout) составляСт 10 сСкунд. Π­Ρ‚ΠΈ значСния рСкомСндуСтся ΠΏΠ΅Ρ€Π΅ΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ.

ВлияСт Π»ΠΈ Ρ‚ΠΈΠΏ балансировки (round_robin, ip_hash) Π½Π° частоту ошибок?

Π”Π°, косвСнно. ΠŸΡ€ΠΈ использовании ip_hash запросы ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° всСгда ΠΈΠ΄ΡƒΡ‚ Π½Π° ΠΎΠ΄ΠΈΠ½ сСрвСр. Если этот сСрвСр ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² состояниС unhealthy, ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ошибки, ΠΏΠΎΠΊΠ° сСрвСр Π½Π΅ восстановится ΠΈΠ»ΠΈ Π½Π΅ истСчСт Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ.

Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ссли всС сСрвСры Π² upstream ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ ΠΊΠ°ΠΊ unhealthy?

Π’ этом случаС Nginx ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ состояниС "unhealthy" ΠΈ попытаСтся ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ запрос Π½Π° любой доступный сСрвСр (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π² round-robin порядкС), Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ сбойный. Π­Ρ‚ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ послСднСй Π½Π°Π΄Π΅ΠΆΠ΄Ρ‹, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ систСмС Π²Ρ‹ΠΆΠΈΡ‚ΡŒ Π² критичСской ситуации.