Добавить в корзинуПозвонить
Найти в Дзене
My Surfing - SSP

Как я месяц спасал сайт, который на самом деле не был сломан

Последний месяц я разбирался с ошибкой, которая довела меня почти до состояния, когда ты уже начинаешь сомневаться вообще во всём: в сервере, в сертификатах, в панели управления, в браузерах, в провайдерах, в маршрутах, в своих настройках и даже в том, что интернет ещё работает по какой-то понятной логике. У меня был самый обычный сайт, без серой тематики, без запрещённого контента, без каких-то подозрительных схем, просто нормальный веб-проект, который должен открываться по HTTPS так же, как открываются тысячи других сайтов каждый день. Но происходила какая-то мистика: у меня сайт открывался, с одних сетей он тоже открывался, через VPN открывался почти всегда, где-то с мобильного интернета работал без вопросов, а у части людей просто не грузился, зависал на подключении, сбрасывал соединение или показывал ошибку так, будто сайт полностью умер, хотя в этот же момент сервер спокойно отвечал, сертификат был валидный, DNS был в порядке, а все проверки показывали, что проект живой. Это, нав

Последний месяц я разбирался с ошибкой, которая довела меня почти до состояния, когда ты уже начинаешь сомневаться вообще во всём: в сервере, в сертификатах, в панели управления, в браузерах, в провайдерах, в маршрутах, в своих настройках и даже в том, что интернет ещё работает по какой-то понятной логике.

У меня был самый обычный сайт, без серой тематики, без запрещённого контента, без каких-то подозрительных схем, просто нормальный веб-проект, который должен открываться по HTTPS так же, как открываются тысячи других сайтов каждый день.

Но происходила какая-то мистика: у меня сайт открывался, с одних сетей он тоже открывался, через VPN открывался почти всегда, где-то с мобильного интернета работал без вопросов, а у части людей просто не грузился, зависал на подключении, сбрасывал соединение или показывал ошибку так, будто сайт полностью умер, хотя в этот же момент сервер спокойно отвечал, сертификат был валидный, DNS был в порядке, а все проверки показывали, что проект живой.

Это, наверное, самый неприятный тип ошибки, потому что она не падает красиво в лог с понятной строкой, не пишет тебе «вот тут сломалось», не повторяется у всех одинаково и не даёт быстро ткнуть пальцем в виновника; она просто появляется у части пользователей и превращает нормальный рабочий сайт в лотерею, где одному человеку страница открывается за секунду, а у другого висит бесконечная загрузка.

Я реально не спал ночами, потому что когда сайт не открывается у живого человека, уже неважно, что у тебя на сервере всё зелёное и красиво, потому что для клиента, пользователя или владельца бизнеса сайт в этот момент не работает, и все объяснения в стиле «а у меня открывается» звучат очень слабо.

Я перевыпускал SSL, проверял конфиги nginx, смотрел цепочки сертификатов, ковырял DNS, трогал настройки www и без www, отключал лишнее, возвращал обратно, проверял сайт с разных устройств, сверял ответы сервера, пытался поймать закономерность по браузерам, операторам, регионам и маршрутам, но каждый раз картина была почти издевательской: технически сайт живой, но для части людей он как будто застревает где-то между браузером и сервером.

И только когда таких проверок стало уже слишком много, начала складываться нормальная картина: проблема была не в коде сайта, не в настройки, не в базе данных и не в том, что сервер «не вывозит», а в том, как часть российских сетей пропускает HTTPS-трафик, особенно когда соединение идёт через TLS 1.3 и определённый вариант TLS ClientHello, то есть того самого начального приветствия браузера, с которого начинается защищённое соединение.

Если говорить простыми словами, браузер подходит к сайту, начинает договариваться о защищённом соединении, а где-то по дороге этот разговор ломается, режется или обрабатывается так криво, что до нормального подключения дело просто не доходит, хотя сам сайт в этот момент абсолютно живой и готов отдавать страницы.

В обычной жизни работает правило - начинай с самого лёгкого. Сломалась машина, проверь свечи, провода, сканером прочти ошибки. Но в айти мире причину лучше начинать искать с глобального мира, постепенно окунаясь в код, в сервер. В моём случае помогла временная настройка, которая делает подключение более совместимым для проблемных сетей: отключить TLS 1.3, оставить TLS 1.2, включить HTTP/2 и не использовать HTTP/3 / QUIC, если основная аудитория находится в России и уже есть жалобы на выборочную недоступность сайта.

Для nginx временная настройка может выглядеть так:

ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;

Важно не включать TLS 1.0 и TLS 1.1, потому что это старые небезопасные протоколы, которые лучше не возвращать даже из желания «лишь бы открылось», а вот TLS 1.2 в такой ситуации может стать нормальным временным компромиссом между безопасностью и доступностью.

Отдельно можно попросить пользователей попробовать открыть сайт через Mozilla Firefox, потому что у Firefox другой TLS-отпечаток, другой набор расширений и другой порядок параметров в момент подключения, и иногда этого уже достаточно, чтобы соединение прошло там, где Chrome или Safari просто молча отваливаются. Но, это не работает, сети заблокированы уже очень сильно.

Я не хочу подавать это как волшебную кнопку, потому что интернет сейчас стал слишком странным, а маршруты, операторы, фильтрация и промежуточные устройства могут вести себя по-разному, но именно эта логика помогла мне наконец-то разобраться с ошибкой, над которой я бился почти месяц.

Поэтому оставляю это здесь бесплатно для владельцев сайтов, вебмастеров, админов и всех, кто однажды столкнётся с ситуацией, когда обычный сайт внезапно перестал открываться у части людей, хотя сервер живой, сертификат нормальный, домен настроен, а сайт не отвечает по 15 минут.

В своем ТГ канале t.me/ssptalks я поделюсь программой которая будет анализировать работу вашего сайта и если у вас тоже присутствует такая же проблема, а она у вас присутствует на 98% - то что нужно делать я написал выше, а если страшно что то менять - буду рад помочь, пишите!