Исправляем ошибку неожиданной остановки MySQL на Vesta

Исправляем ошибку периодической остановки службы базы данных MySQL на сервере под управлением Vesta на CentOS.

В логах MySQL:

ошибка имеет следующий вид:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
171015  1:57:54 [Warning] IP address '111.111.123.123' could not be resolved: Name or service not known
171015 02:11:21 mysqld_safe Number of processes running now: 0
171015 02:11:21 mysqld_safe mysqld restarted
171015  2:11:21 [Warning] 'THREAD_CONCURRENCY' is deprecated and will be removed in a future release.
171015  2:11:21 [Note] /usr/libexec/mysqld (mysqld 5.5.52-MariaDB) starting as process 9286 ...
171015  2:11:21 InnoDB: The InnoDB memory heap is disabled
171015  2:11:21 InnoDB: Mutexes and rw_locks use GCC atomic builtins
171015  2:11:21 InnoDB: Compressed tables use zlib 1.2.7
171015  2:11:21 InnoDB: Using Linux native AIO
171015  2:11:21 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137756672 bytes) failed; errno 12
171015  2:11:21 InnoDB: Completed initialization of buffer pool
171015  2:11:21 InnoDB: Fatal error: cannot allocate memory for the buffer pool
171015  2:11:21 [ERROR] Plugin 'InnoDB' init function returned error.
171015  2:11:21 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
171015  2:11:21 [ERROR] mysqld: Out of memory (Needed 128917504 bytes)
171015  2:11:21 [Note] Plugin 'FEEDBACK' is disabled.
171015  2:11:21 [ERROR] Unknown/unsupported storage engine: InnoDB
171015  2:11:21 [ERROR] Aborting

Конфигурационный файл MySQL

Корректируем данные в файле MySQL

Файл конфигурации MySQL находится по адресу:

Ищем max_connections и max_user_connections и меняем на следующее:

Почему меняем?

Стандартная конфигурация панели Vesta создана для определенной мощности серверов. И если VPS сервер имеет всего 1 гб оперативной памяти (а может и меньше), этого может быть недостаточно для работы панели.

Конфигурационный файл межсетевого экрана (брандмауэр)

Изменяем конфигурацию брандмауэра в Linux, который называется IPTables.

Файл лежит здесь:

Закомментируем всё что там есть. А затем добавим следующее:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [16807:31509796]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -m state --state NEW -m recent --rcheck --seconds 6000 --name BLOCK --rsource -j DROP
-A INPUT -p tcp -m tcp --dport 21 -m state --state NEW -m hashlimit --hashlimit-above 2/min --hashlimit-burst 2 --hashlimit-mode srcip --hashlimit-name BLOCK -m recent --set --name BLOCK --rsource -j DROP
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --rcheck --seconds 6000 --name BLOCK --rsource -j DROP
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m hashlimit --hashlimit-above 2/min --hashlimit-burst 2 --hashlimit-mode srcip --hashlimit-name BLOCK -m recent --set --name BLOCK --rsource -j DROP
-A INPUT -p tcp -m tcp --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -m limit --limit 600/min --limit-burst 100 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -m state --state NEW -m limit --limit 600/min --limit-burst 100 -j ACCEPT
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m limit --limit 1/sec -j ACCEPT
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j DROP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK RST -m limit --limit 1/sec -j ACCEPT
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK RST -j DROP
-A INPUT -p icmp -m icmp --icmp-type 8 -m limit --limit 1/sec -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j DROP
-A INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT

Почему это делаем?

Мы ограничиваем лимит в 600 соединений в минуту с одного IP адреса, а затем блокируем его на 100 секунд (limit-burst 100). Это позволит избежать перенагрузки сервера от одного пользователя.

Конфигурационный файл nginx

Находится:

Уменьшаем нагрузку, вынося обработку статистики отдельно. Вырезаем её из:

1
2
3
location / {

}

И ставим на следующей строке отдельно:

1
2
3
4
5
6
7
8
location ~* ^.+\.(jpg|jpeg|gif|png|ico|svg|css|zip|tgz|gz|rar|bz2|exe|pdf|doc|xls|ppt|txt|odt|ods|odp|odf|tar|bmp|rtf|js|mp3|avi|mpeg|flv|html|htm)$ {

root /home/UserName/web/ploshadka.net/public_html;
access_log /var/log/httpd/domains/ploshadka.net.log combined;
access_log /var/log/httpd/domains/ploshadka.net.bytes bytes;
expires max;
try_files $uri @fallback;
}

А затем в этой location / уменьшаем лимиты (10 подключений в секунду):

1
2
3
4
location / {
limit_req zone=dyn burst=10;
proxy_pass http://1.11.72.33:8080;
}

limit_req (burst=10) дублирует функционал iptables (limit 600/min), но на всякий случай оставляем его там.

На этом нагрузка на сервер должна значительно уменьшится. А неожиданные остановки и выключения служб базы данных больше не беспокоить.

Добавить комментарий

Напишите свой комментарий, если вам есть что добавить/поправить/спросить по теме текущей статьи: "Исправляем ошибку неожиданной остановки MySQL на Vesta".

Ваш e-mail не будет опубликован. Обязательные поля помечены *