Автор: An Dong Данная статья является оригинальной, для перепечатки укажите автора и источник
задний план
Некоторое время назад я неожиданно получил уведомление от коллеги по операции, что учитель из Хуцзяна не может войти в аккаунт Хуцзяна за границей. Это очень распространенная ошибка, но процесс устранения неполадок не прост Мы получили много неожиданных результатов, которыми делимся с вами здесь.
Сначала мы решили, что с точки зрения явления сбоя, это должно иметь отношение не к серверной части, а к внешнему интерфейсу, поэтому мы быстро проверили журналы внешнего интерфейса. интерфейс продолжал иметь ошибки.Появилось большое количество кодов состояния HTTP 406 (более 1w за 24 часа). В соответствии со спецификацией кода состояния HTTP код ошибки в начале 4 связан с клиентом.Учитывая, что эта ошибка возникает только у одного учителя, изначально предполагается, что 406 является основной причиной проблемы.
С увеличением информации и углублением анализа мы быстро устранили вину преподавателя-иностранца, к сожалению, подтвердилось, что она не имеет никакого отношения к 406.
Однако мы не можем останавливаться на достигнутом. В конце концов, код состояния HTTP ответа должен быть 200 при нормальных обстоятельствах, так что же такое большое число 406? Почему мы не можем воспроизвести это? Как они запускаются? Должно ли такое большое количество вспышек вызывать отзывы пользователей? Почему отзывы в сети такие тихие?
На следующем рисунке показана ситуация с ошибкой 406 в лог-платформе.
Процесс устранения неполадок
Чтобы обеспечить производительность, наша сторона Node не записывает подробно каждый запрос, поэтому простой просмотр журнала 406 не может определить конкретную причину. Чтобы устранить эту проблему, мы срочно выпустили онлайн-патч для записи деталей каждого запроса, а затем увидели следующий запрос в журнале платформы
Для простоты сравнения мы перехватывали обычные запросы в браузере. Как показано ниже
При тщательном сравнении этих двух запросов в сочетании с определением кода ошибки 406 наше внимание сосредоточено на заголовке Accept.
в журнале
Accept: text/html,application/xhtml+xml,application/xml;
скопировать код
в то время как обычное поведение браузера
Accept: */* ;
скопировать код
Итак, мы смоделировали неправильный запрос в Postman и, конечно же, воспроизвели ошибку 406, поэтому мы можем подтвердить, что проблема вызвана полем Accept.
Код состояния 406 Not Acceptable указывает на ошибку клиента, указывающую на то, что характеристики содержимого запрошенного ресурса не могут соответствовать условиям в заголовке запроса, поэтому объект ответа не может быть сгенерирован. Переведено из документа RFC спецификации протокола HTTP.
Мы проверили информацию в Интернете и обсудили код ошибки 406 с нашими коллегами из back-end.Мы узнали, что если Accept в заголовке запроса не соответствует заранее согласованному контракту, будет возвращена ошибка 406. Сообщается об ошибке службы API, которая возвращает данные в формате application/json, однако Accept в запросе указывает, что он не поддерживает этот формат, поэтому будет сообщено об ошибке 406.
Мы тщательно изучили запросы, отправляемые распространенными браузерами, и обнаружили, что все они содержат Accept: */* ;. Похоже, что эти запросы, вызывающие ошибку 406, исходят не от обычных пользователей. Итак, кто именно делал эти запросы?
Это CDN?
Полное название CDN — Content Delivery Network, то есть Content Delivery Network. Его цель — дать пользователям возможность получать желаемый контент поблизости, решить ситуацию с перегрузкой интернет-сети и повысить скорость отклика пользователей, посещающих веб-сайты. Сеть CDN может кэшировать содержимое сервера в узлах CDN, распределенных по всему миру, и подключаться к ближайшей CDN в соответствии с IP-адресом доступа пользователя для повышения скорости отклика веб-сайта. (цитата с google.com)
Сегодня CDN стала обычной конфигурацией для различных компаний, и Hujiang не исключение. Мы тщательно изучили исходный IP-адрес запроса, вызвавшего ошибку 406, и обнаружили, что все они были от нескольких узлов Beijing Unicom. С этой точки зрения, подозрение на CDN очень велико, и есть, вероятно, две возможности: 1. Поле Accept в заголовке исходного запроса неверно; 2. Поле Accept в заголовке исходного запроса верное, но оно заблокирован при прохождении через узел CDN. Поскольку мы уже сталкивались с проблемой подделки заголовка CDN, мы изначально считаем, что это проблема CDN.
Затем мы временно вернули узел Beijing Unicom источнику, чтобы проверить, не подделал ли CDN заголовок, а также получили конечный IP-адрес пользователя. Поищите в интернете подробную информацию об этом IP, а на нем написан краулер определенной поисковой системы. Получается, что 406 приходит не от обычных пользователей, а от поисковых роботов.
Мелочи
За последние несколько дней написания статьи я обнаружил, что журнал ошибок сильно упал, а ошибок 406 нет. Подумав, что некая поисковая система раскаялась, я просмотрел лог-платформу с неправильным на тот момент IP и обнаружил, что поисковая система просто изменила свою стратегию. Его поле Accept было изменено, а в заголовок UA добавлен уникальный логотип поисковика, и он снова стал обычным поисковиком.
резюме
Для разработчиков, когда на сайте встречается большое количество ошибок 406, не стоит сильно переживать, внимательно проверяйте лог, скорее всего это вызвано краулерами поисковой системы.
Подводя итог этому событию с кодом ошибки 406, когда поисковая система сканирует страницу Hujiang, параметр Accept в заголовке запроса отличается от поля Accept, принятого серверной службой, что приводит к большому количеству ошибок 406.
Наконец, подробно объясните соответствующие знания о Accept в заголовке.
Accept
Он используется в заголовке, чтобы сообщить клиенту, какой контент может обрабатывать клиент, который представлен типом MIME (цитата из MDN).
Тип содержимого
text/html, application/xhtml+xml, application/xml — все это типы MIME, которые также можно назвать типами мультимедиа и типами контента.
Accept:application/json
скопировать код
В примере application — это тип, а json — подтип. В нем указано, что клиент может получать ответы только такого типа, как application/json. Если сервер не может вернуть этот тип ответа, сервер ДОЛЖЕН вернуть ошибку 406.
Подстановочный знак * для любого типа
Например: Accept: / означает, что браузер может обрабатывать все типы
Accept может поддерживать несколько типов, разделенных ,
С помощью механизма согласования содержимого сервер может выбрать один из нескольких вариантов для применения и сообщить клиенту о своем выборе с помощью заголовка ответа Content-Type.
Accept: text/html,application/xhtml+xml,application/xml
скопировать код
Он показывает, что существует только три типа ответов, которые может получить клиент: text/html, application/xhtml+xml и application/xml.
Факторные веса (q)
q — это значение от 0 до 1, значение q по умолчанию равно 1, q=0 означает неприемлемо, чем больше значение q, тем больше вероятность того, что запрос получит содержимое, представленное типом перед «;»
Accept: text/html;q=0.9,application/xhtml+xml;0.7,application/xml,*/*;q=0.5
скопировать код
Это показывает, что клиент предпочитает ответ в формате text/html, затем следует application/xhtml+xml и, наконец, application/xml, */*.
Техническая рекомендация салона
Нажмите на изображение ниже, чтобы прочитать
Как элегантно проектировать компоненты React
Мост между обратными вызовами и промисами - promisify
Пошаговая оптимизация внешнего кода с использованием соответствующих шаблонов проектирования