Disk quota exceeded при наличии свободного места

Порой при работе сайта на арендованном VPS может появиться подобная ошибка:

Warning: mkdir(): Disk quota exceeded
in /var/www/site.ru/logger.php
on line XXX Can’t log exception

Работа сайта может быть нарушена при обращениях к БД. Сама БД при перезагрузке может выдавать ошибку:

mysql open: Disk quota exceeded

Аналогичную ошибку при запуске могут выдавать и все остальные программы.
Если при проверке наличия свободного места (команда df -h) мы видим, что свободного места ещё достаточно, то вероятно дело в ограничении максимального количества дескрипторов, установленных хостером. Следует обратиться в службу технической поддержки, уточнить, подошли ли Вы к пределу количества инод, и если это так, то попросить увеличить лимит. После этого попытаться заново запустить все необходимые службы.

SSHD — POSSIBLE BREAK-IN ATTEMPT!

Запись в журнале /var/log/auth.log вида

sshd[16793]: Address XXX.XXX.XXX.XXX maps to somedomain.com, but this does not map back to the address — POSSIBLE BREAK-IN ATTEMPT!

говорит о том, что при попытке проверить обратное сопоставление домена, полученный IP-адрес отличается от IP-адреса клиента SSH.
Это вполне распространённая ситуация, например: сервер А обслуживает домен somedomain.com и использует его в качестве своего имени, сам сайт somedomain.com физически находится на сервере Б; сервер А пытается подключиться к серверу С; сервер С проводя обратное сопоставление доменного имени клиента видит, что у домена somedomain.com должен быть IP-адрес сервера Б, который отличается от IP-адреса сервера А.
Данная запись может служить поводом для блокировки клиента, например программой fail2ban. Если IP-адрес XXX.XXX.XXX.XXX, указанный в записи журнала, является доверенным, а программа защиты блокирует этот адрес под предлогом спуфинга, то данную проблему можно решить добавив в файл конфигурации /etc/ssh/sshd_config строку (или отредактировав, при её наличии):

UseDNS no

Альтернативным способом отключения блокировок является правка фильтров программы защиты, например всё той же fail2ban, то есть исключение вышеуказанной фразы о взломе из регулярных выражений фильтров.

Open file limits

Часто при использовании какой-либо программы, при открытии большого количества файлов она сваливается, т.к. упирается в ограничение (по умолчанию 1024 открытых файла), выводя ошибку: failed (24: Too many open files). Текущее использование открытых файлов программой можно узнать так:

lsof -u процесс | wc -l

Многие программы умеют изменять ограничения самостоятельно, поэтому задать ограничение на количество открытых файлов можно в конфигурационном файле. Например, используя параметр open_files_limit в конфигурационном файле my.cnf сервера MySQL, или параметр worker_rlimit_nofile для Nginx.
Однако, заданные значения в конфигурационных файлах этих программ могут не применяться при перезапуске. В этом случае ограничение накладывается системой.
Можно узнать ограничение системы для текущего пользователя с помощью команды:

ulimit -a

А для всей системы в целом:

sysctl fs.file-max

Установить же новое значение для ограничения по файлам для текущего пользователя можно так:

ulimit -n значение

Если новые ограничения устанавливаются пользователем root и им же перезапускается Ваша программа, то, несмотря на то, что программа работает от имени другого пользователя, у неё должны вступить в силу новые настройки. Перезапустив программу, можно проверить, применились ли новые значения. Например, выполнить в MySQL команду:

show variables like ‘open_files_limit’;

Однако, новые значения ограничений, устанавливаемые утилитой ulimit действуют в рамках одной сессии. Это означает, что при следующем подключении, настройки ограничений системы вернуться к исходным. Чтобы не использовать каждый раз данную утилиту, можно задать параметры ограничений в файле /etc/security/limits.conf. Например, для снятия ограничения на количество одновременно открытых файлов (до 65к, чего хватает в большинстве случаев) для всех пользователей, добавить в конец файла строки:

* soft nofile 65536
* hard nofile 65536

Также следует знать, что файл limits.conf является конфигурационным файлом PAM. А далеко не все программы при запуске используют PAM. Если Ваша программа из числа тех, что не используют PAM, то перед правкой файла limits.conf следует проверить директорию /etc/default/ на наличие конфигурационных файлов Вашей программы. И, если таковые имеются, добавить в конец её конфигурационного файла команду «ulimit -n 65536». Если же в /etc/default/ конфигурационных файлов Вашей программы нет, то можно принудить использовать настройки limits.conf для всех, добавив в конец файлов /etc/pam.d/common-session и /etc/pam.d/common-session-noninteractive (при наличии оного) строку:

session required pam_limits.so

После чего перезагрузить систему.

Cron — Выполнение PHP сценария с GET запросом

Для выполнения PHP файла по крону с GET запросом, можно воспользоваться программой GET. Запись в crontab имеет примерно такой вид:

0 0 * * * www-data /usr/bin/GET ‘http://mysite.ru/cron.php?module[]=exchange’

При отсутствии в системе программы /usr/bin/GET, следует установить пакет libwww-perl.