Миттєвий 503 або 403: спершу перевірте рівні над застосунком
Сторінка помилки, яка приходить без затримки, була віддана до того, як запустився ваш застосунок, тож чекліст починається з edge і спускається до коду останнім.
У цій статті 4 розділів
- Повільна помилка дає вам щось для профілювання. Миттєва (503, 502, 403 або 429, що приходить за кілька мілісекунд) означає, що відповів рівень над застосунком, і саме з цього рівня починається чекліст.
- Рівні над застосунком, згори донизу: CDN і правила edge, балансувальник і стан його backends, панель керування або перемикач обслуговування, правила rewrite і deny web-сервера, DNS, права файлової системи і SELinux.
- Визначайте рівень за самою відповіддю: заголовки server, форма тіла, час до першого байта, і той самий запит, повторений прямо до origin, обходячи по одному рівню за раз.
Відсутність затримки є першим вимірюванням
Час до першого байта каже вам, чи застосунок узагалі щось робив. Помилка, яка приходить приблизно за час проходження мережею туди й назад, була вирішена без нього. Помилка, яку згенерував застосунок, несе час, який він витратив, перш ніж здатися.
curl -s -o /dev/null -w 'code=%{http_code} ttfb=%{time_starttransfer} total=%{time_total}\n' https://site.example/
curl -sI https://site.example/Заголовки частіше за все називають рівень. Заголовок Server або Via, який належить edge або балансувальнику, а не web-серверу, X-Cache або request id від edge, текстове тіло там, де застосунок рендерив би шаблон: кожне з цього каже, хто відповів. Із цим у руках чекліст короткий.
Чекліст, згори донизу
CDN або edge. Правило WAF, обмеження швидкості, геоправило, виклик для ботів або проблема із сертифікатом між edge і origin, яку edge звітує як власну 5xx. Обійдіть його: резолвте ім’я прямо на origin і повторіть запит.
curl -s -o /dev/null -w 'code=%{http_code} ttfb=%{time_starttransfer}\n' \
--resolve site.example:443:ORIGIN_IP https://site.example/Origin відповідає 200, edge відповідає 5xx: помилка належить edge, як і правило, що її породило.
Балансувальник. HAProxy сам відповідає 503, коли жоден backend не працює, з власним заголовком Server і тілом в один рядок. Це питання health check, а не застосунку: шлях перевірки, що змінився в останньому деплої, порт перевірки, що переїхав, або backend, позначений down з причини, яку показує сторінка статистики. Запросіть backend безпосередньо з хоста балансувальника, щоб підтвердити, що він обслуговує.
Рівень платформи. Стан призупинення або обслуговування в панелі керування, перемикач обслуговування інструменту деплою, сервіс, зменшений до нуля. Кожен віддає фіксовану сторінку, не викликаючи застосунок, і кожен є прапорцем, який можна прочитати, а не теорією.
Правила web-сервера. Одна директива return, rewrite або deny відповідає миттєво і виглядає катастрофічно. Вивантажте чинну конфігурацію, а не файл, який, як ви думаєте, завантажений.
# nginx: the configuration actually in effect, with the rules that short-circuit a request
nginx -T 2>/dev/null | grep -nE '^\s*(return|rewrite|deny|allow)\b'
# IIS: the URL Rewrite rules for the site
appcmd list config /section:system.webServer/rewrite/rulesНа Apache читайте чинний ланцюжок .htaccess для шляху, а не лише vhost.
DNS. Підтвердьте, що ім’я резолвиться на хост, який ви налагоджуєте. Застарілий запис, різниця split-horizon або зміна, що досі поширюється, означають, що машина, за якою ви стежите, не є тією, що відповідає.
Права і SELinux. Web-сервер не може прочитати document root або підключитися до upstream socket. 403 або 502 без жодного рядка в лозі застосунку. На системі в режимі enforcing журнал аудиту називає відмову, і виправленням є модуль політики, а не зміна режиму.
ausearch -m avc -ts recent | audit2whyЛише тепер застосунок. Pools workers, runtime, залежності, код. Їх окремо дорого досліджувати, і вони не можуть бути причиною відповіді, якої застосунок не породжував.
Дві деталі, що затягують пошук
429 має двох можливих авторів. Обмежувач на edge відповідає ним із власними заголовками edge і зазвичай із Retry-After; обмежувач застосунку відповідає зсередини застосунку, із заголовками застосунку і після того, як застосунок виконав якусь роботу. Час до першого байта і заголовки їх розрізняють, і виправлення для кожного в іншому місці.
Сторінка помилки може пережити свою причину. Edge і reverse proxies можуть ненадовго кешувати 5xx, тож origin відновлюється, а edge продовжує віддавати збережену помилку, доки та не спливе. Заголовок Age на відповіді з помилкою каже, що це кешована копія. Очистіть шлях на edge або перечекайте TTL, перш ніж робити висновок, що виправлення не спрацювало.
Змусьте кожен рівень довести себе
Кожен крок вище поєднує рівень зі способом його обійти: резолвинг прямо на origin обходить edge, запит до backend з хоста балансувальника обходить балансувальник, запит до порту застосунку на localhost обходить web-сервер. Перший стрибок, на якому відповідь змінюється з помилки на вміст, є рівнем, якому належить помилка. Метод навмисно механічний, і саме це робить його швидким о будь-якій годині.
Прямі відповіді
Що спричиняє миттєвий 503 без затримки?+
Щось відповіло до того, як запустився застосунок: правило edge, балансувальник без здорового backend, сторінка призупинення або обслуговування, правило rewrite, DNS, що вказує деінде, або відмова прав чи SELinux. Відсутність затримки означає: дивіться над застосунком.
Як зрозуміти, помилку повернув CDN чи мій сервер?+
Прочитайте заголовки Server і Via та тіло, потім повторіть запит через curl --resolve, спрямований на origin. Якщо origin віддає вміст, а edge віддає помилку, помилка належить edge.
Чому HAProxy повертає 503, коли мій застосунок працює?+
Бо його health check каже інакше. Шлях або порт перевірки, що змінився, або backend, який провалює перевірку з причини, яку показує сторінка статистики, залишає балансувальник без сервера для використання. Виправляйте перевірку, а не застосунок.
Як побачити правила rewrite, які можуть блокувати запит?+
На nginx nginx -T друкує чинну конфігурацію; шукайте в ній return, rewrite, deny і allow. На IIS appcmd list config /section:system.webServer/rewrite/rules перелічує правила сайту. На Apache читайте ланцюжок .htaccess для шляху.
Наступного 5xx, який не має сенсу, починайте з вершини стеку.
Або поговоріть з інженером, який уже так робить.
Поговоріть з інженеромВи дійшли до кінця.
Застосуйте прочитане на практиці
Що ви запускаєте?
Розкажіть нам про навантаження, трафік і вимоги до відновлення. Почніть з конструктора сервера або обговоріть деталі з інженером.
Написано інженерами, які будують і експлуатують інфраструктуру, про яку йдеться.Поговоріть з інженером
