Вдруг на ровном месте перестал работать визуальный редактор статей Joomla JCE, работающий на основе JavaScript. Выглядит это так - запускаю редактирование статьи, а кнопок управления редактором нет. Иногда после десятикратного перезапуска кнопки появляются, но все равно нормально не работают.
На что я только не думал - проблема связана с браузером? Перепробовал все браузеры - Google Crome, Mozilla Firefox, Microsoft Edge, Opera, оказалось что проблема не в браузере, везде проблема имеет место быть. Может антивирус? Отключил антивирус Касперского, деактивировал AdGuard - нет, причина не в этом. Начал смотреть настройки браузера - может быть, запрещена работа JavaScript, на котором работает JCE? Нет, снова не то.
Заметил, что эта проблема как-то связана с ошибкой сервера 503, которая тоже начала появляться при попытке просто зайти на сайт или открыть произвольную статью на сайте.
503 Service Temporarily Unavailable
nginx/1.8.0
Для анализа проблемы запустил инструментарий DevTools браузера Chrome (эта утилита вызывается кнопкой F12) и начал просматривать логи ответа сервера. Заметил, что в логе иногда появляется все та же ошибка 503, причем при открытии статей она случайным образом и довольно редко, однако при почти постоянно появляется, когда запускается редактор статей JCE. Поиск в Интернете ничего полезного не дал, но нашел только банальные советы наподобие "Большое количество запросов к сайту", "Ошибки в скриптах", "Большая нагрузка на сервер MySQL" и тому подобное.
Заметил интересную особенность - если ограничить пропускную способность канала, что позволяет делать DevTools (функция Network throttling), то редактору JCE становится легче, кнопки редактора появляются. Но все равно глюки остаются, но они явно связаны с ошибкой 503, потому что ошибки редактора происходят синхронно с ошибками в логе 503. На скриншотах ниже показан глюк редактора JCE при нажатиях на кнопку добавления ссылки и соответсвующие записи в логе DevTools.
Логи ngnix показывают следующее, сокращенный фрагмент результатов поиска:
2022/11/18 20:06:29 [error] 457#0: *5682 limiting requests, excess: 0.994 by zone ..., client: a.b.c.d,
server: домен, request: "GET .. com_jce/..., referrer: ...&task=edit&view=article"
2022/11/18 20:07:31 [error] 457#0: *5705 limiting requests, excess: 0.994 by zone ..., client: a.b.c.d,
server: домен, request: "GET .. com_jce/..., referrer: ...&task=edit&view=article"
2022/11/18 20:08:37 [error] 457#0: *5822 limiting requests, excess: 0.838 by zone ..., client: a.b.c.d,
server: домен, request: "GET .. com_jce/..., referrer: ...&task=edit&view=article"
Таким образом можно сделать вывод, что ошибки 503 являются следствием установленного лимита. Сам лимит, обычно, устанавливается для защиты сайта от флуда (не распределенных DoS-атак), однако, следует понимать, что при открытии одной страницы сайта, для загрузки каждого элемента страницы (JS-скрипты, CSS-файлы, изображения и т.п.) браузер создает отдельный запрос и все эти запросы учитываются при обработке установленного лимита.
Обратился в техподдержку, они посоветовали дополнительно к стандартной настройке лимитов в nginx, помимо стандартного значения количество запросов в секунду, установить настройку всплеска (burst) [1]. Под руководством техподдержки внес правки в файл /etc/nginx/nginx.conf, отредактировав все записи для настойки лимита обращений к сайту. Записи вида:
limit_req zone=имязоны nodelay;
.. заменил на следующие:
limit_req zone=имязоны burst=180;
После внесения правок нужно перезапустить сервер nginx командой:
# /etc/init.d/nginx restart
После этой правки проблема ошибки 503 пропала, и редактор статей Joomla JCE начал работать нормально.
Чтобы полностью снять ограничение (временно, конечно, для теста), можно закомментировать эти строки, что полностью отключит лимит:
#limit_req zone=имязоны burst=180;
[Ссылки]
1. Модуль ngx_http_limit_req_module site:nginx.org. |