Исправляем ошибку периодической остановки службы базы данных MySQL на сервере под управлением Vesta на CentOS.
В логах MySQL:
ошибка имеет следующий вид:
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 и меняем на следующее:
max_connections=70
# Уменьшил с 50
max_user_connections=30
Почему меняем?
Стандартная конфигурация панели Vesta создана для определенной мощности серверов. И если VPS сервер имеет всего 1 гб оперативной памяти (а может и меньше), этого может быть недостаточно для работы панели.
Конфигурационный файл межсетевого экрана (брандмауэр)
Изменяем конфигурацию брандмауэра в Linux, который называется IPTables.
Файл лежит здесь:
Закомментируем всё что там есть. А затем добавим следующее:
: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
Находится:
Уменьшаем нагрузку, вынося обработку статистики отдельно. Вырезаем её из:
}
И ставим на следующей строке отдельно:
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 подключений в секунду):
limit_req zone=dyn burst=10;
proxy_pass http://1.11.72.33:8080;
}
limit_req (burst=10) дублирует функционал iptables (limit 600/min), но на всякий случай оставляем его там.
На этом нагрузка на сервер должна значительно уменьшится. А неожиданные остановки и выключения служб базы данных больше не беспокоить.
Интересная конечно статья.
Мое парадоксальное мнение возмущает мой мозг.
Мне наоборот советовали лимиты на коннекты поднимать по максимум.
ХМ. Но тут я тоже не просто так, пришел по ошибки коннекта.
Благодарю за очень полезную информацию!
Подскажите, а вот эту часть «Конфигурационный файл nginx» как реализовать, если стоит Apache?
Если у вас нет nginx, то эта часть вам не нужна.