Иногда мой блог вместо страницы выдавал ошибку 500, с отображением SQL запроса, который не прошёл.
Это выглядело так:
Код ошибки мог меняться в замисимости от страницы, но почти всегда это был SQL запрос вроде такого
select count(distinct posts.id) as aggregate
from posts
where (posts.status = 'published' and posts.page = false)
Главное, что в нём всегда встречалось read ECONNRESET
.
Причина неполадок состояла в том, что сервер базы данных закрывал соединение с блог платформой, так как оно, по мнению сервера, не использовалось.
Данная неполадка чинится отправкой этих запросов на MariaDB сервер через консоль:
SET GLOBAL connect_timeout=28800;
SET GLOBAL wait_timeout=28800;
SET GLOBAL interactive_timeout=28800;
Эти переменные задают критерии, используемые сервером для того, чтобы определить, какие соединения считаются неиспользуемыми, и их можно разорвать. Я поставил значение в 8 часов (28800 секунд), и разрывы соединения пропали.
Подробнее о всех системных переменных базы данных MariaDB.
Обновление 1.
При перезагрузке сервера с базой данных, глобальные переменные к сожалению сбрасываются. Одно из возможных решений проблемы ошибки с разрывом соединения было описано в этом комментарии
https://github.com/TryGhost/Ghost/issues/9739#issuecomment-406240883
Пользователь с ником Toub посоветовал переодически загружать главную страницу блога, чтобы платформа посылала запросы к базе данных, и соединение восстанавливалось.
При этом техническая поддержка платформы Ghost показала особенную клиентоориентированность, и я понял, что они ничем помочь не могут и не хотят, по их мнению, официальные образы докера с не правильно работающим соединением с базой данных это нормально.
Поэтому, проблему я начал решать сам.
Я написал такой скрипт на nodejs, который открывает главную страницу блога до тех пор, пока не будет возвращаться ответ со статусом 200 - то есть блог работает в штатном режиме.
'use strict';
const async = require('async'); // tested with version >=2.6.2
const request = require('request'); // tested with version >=2.88.0
let i = 0;
async.doWhilst(
function (callback) {
request('https://blog.vodolaz095.life', function (error, response) {
if (error) {
return callback(error);
}
i += 1;
console.log('Test %s. Status code - %s', i, response.statusCode); // eslint-disable-line
callback(null, response.statusCode);
});
},
function (statusCode) {
return statusCode !== 200;
},
function (error) {
if (error) {
throw error;
}
console.log('Blog awaken!'); // eslint-disable-line
process.exit(0);
}
);
И поставил его в крон на запуск каждую минуту.
* * * * * cd /home/vodolaz095/ && node /home/vodolaz095/wakeBlog.js
Посмотрим, что из этого получится...