КАК Я ЧИНИЛ САЙТ
Кейс: Joomla показывает «Error», сайт за NAT (reverce-proxy Nginx→Apache), кончилось место на диске
Живой разбор: сайт на Joomla 3.5 за обратным прокси Nginx (192.168.88.202) → Apache (192.168.88.198) начал отдавать белую страницу с надписью Error. Диагностика показала: переполнен корневой раздел, в логах Apache — No space left on device. Ниже — симптомы, проверка и пошаговое восстановление.
- Платформа: Ubuntu, Nginx (reverse proxy) → Apache, MySQL/MariaDB, Joomla 3.5.
- Симптом: белая страница «Error».
- Причина: кончилось место на
/
— забиты/tmp
и/var/log/journal
. - Итог: очистка и ограничение логов/кэша вернули сайт в онлайн.
Симптомы
- Joomla отдаёт белую страницу с «Error» (часто это скрытая фатальная ошибка PHP из-за невозможности записи в сессии/кэш/логи).
- В
apache2/error.log
— No space left on device, а ранее — server reached MaxRequestWorkers.
[mpm_prefork:error] AH00161: server reached MaxRequestWorkers setting
[log_config:warn] (28)No space left on device: AH00646: Error writing to /var/log/apache2/access.log
Быстрая диагностика
Проверяем диски и «тяжёлые» каталоги:
df -h
df -i
sudo du -xhd1 / | sort -h
sudo du -h -d1 /var/log | sort -h
sudo du -xha /var | sort -h | tail -50
В нашем кейсе было так:
Вывод
df -h
(фрагмент)Filesystem Size Used Avail Use% Mounted on
/dev/sda1 46G 46G 0 100% /
/dev/sda3 46G 7,6G 36G 18% /webserver
/dev/sda4 359G 230G 111G 68% /home
...
Топ «пожирателей» места
/tmp 27G
/var/log/journal 4G
/var/log/postgresql 332M
/var/lib/snapd 3.3G
/var/lib/mysql 3.1G (в т.ч. x9k26_session.ibd ~653M)
Восстановление за несколько минут (команды)
- Очистить старые файлы в
/tmp
(даст больше всего):sudo find /tmp -xdev -type f -mtime +2 -delete sudo find /tmp -xdev -type d -empty -delete
- Урезать systemd-журнал:
sudo journalctl --vacuum-size=200M
- Подрезать логи PostgreSQL (оставив текущий):
sudo rm -f /var/log/postgresql/*.log.[0-9] /var/log/postgresql/*.log.[0-9].gz
- Почистить APT-кэш:
sudo apt-get clean
- Удалить старые версии snap-пакетов:
sudo snap set system refresh.retain=2 snap list --all | awk '/disabled/{print $1, $2}' | while read name rev; do sudo snap remove "$name" --revision="$rev"; done
- Если нужно — обнулить логи Apache:
sudo truncate -s0 /var/log/apache2/access.log /var/log/apache2/error.log
- Перезапустить веб-сервисы:
sudo systemctl restart apache2 sudo systemctl restart php*-fpm 2>/dev/null || true
- Проверить бэкенд Apache в обход Nginx:
curl -I -H 'Host: madmentat.ru' http://192.168.88.198/ curl -s -H 'Host: madmentat.ru' http://192.168.88.198/ | head -n 50
Joomla: разрослась таблица сессий
У Joomla 3.x сессии часто копятся в БД. Если таблица большая — можно её безопасно очистить (все пользователи разлогинятся):
-- подставьте свой префикс таблиц и имя БД из configuration.php
TRUNCATE TABLE mad.x9k26_session;
OPTIMIZE TABLE mad.x9k26_session;
Пути сессий PHP можно проверить так:
php -i | grep -i '^session.save_path'
Профилактика: чтобы не повторилось
1) Автоочистка /tmp
sudo tee /etc/tmpfiles.d/tmp.conf >/dev/null <<'EOF'
d /tmp 1777 root root 1d
EOF
sudo systemctl restart systemd-tmpfiles-setup.service
2) Ограничить journald
sudo tee -a /etc/systemd/journald.conf >/dev/null <<'EOF'
SystemMaxUse=200M
SystemMaxFileSize=50M
RuntimeMaxUse=100M
EOF
sudo systemctl restart systemd-journald
3) Ротация логов Apache
В /etc/logrotate.d/apache2
убедитесь, что есть что-то вроде:
daily
rotate 14
compress
delaycompress
missingok
notifempty
dateext
maxsize 50M
Применить принудительно:
sudo logrotate -f /etc/logrotate.d/apache2
4) Перенести «тяжёлые» каталоги на свободный раздел
Например, связать /var/log
с /webserver/var_log
через bind-mount:
sudo systemctl stop apache2 php*-fpm 2>/dev/null || true
sudo systemctl stop systemd-journald
sudo rsync -aHAX /var/log/ /webserver/var_log/
sudo mv /var/log /var/log.old
sudo mkdir /var/log
echo "/webserver/var_log /var/log none bind 0 0" | sudo tee -a /etc/fstab
sudo mount -a
sudo systemctl start systemd-journald
sudo systemctl start apache2
sudo systemctl start php*-fpm 2>/dev/null || true
sudo rm -rf /var/log.old
5) (Опционально) Крон-задача ежедневной гигиены
Пример для root
(редактировать через crontab -e
):
# чистим /tmp и урезаем journald раз в сутки в 03:15
15 3 * * * find /tmp -xdev -type f -mtime +2 -delete; find /tmp -xdev -type d -empty -delete; journalctl --vacuum-size=200M
# чистим APT-кеш раз в неделю
30 4 * * 0 apt-get clean
# удаляем старые ревизии snap раз в неделю
45 4 * * 0 snap list --all | awk '/disabled/{print $1, $2}' | while read n r; do snap remove "$n" --revision="$r"; done
# (по желанию) чистим таблицу сессий Joomla
0 5 * * * mysql -e "TRUNCATE TABLE mad.x9k26_session;"
Заметки по Nginx→Apache
Для обратного прокси важно пробрасывать заголовок Host
, иначе может открыться не тот vhost:
location / {
proxy_pass http://192.168.88.198;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_read_timeout 300;
}
Проверьте, что в Apache выбран корректный vhost:
<VirtualHost *:80>
ServerName madmentat.ru
ServerAlias www.madmentat.ru
DocumentRoot /path/to/site
ErrorLog ${APACHE_LOG_DIR}/madmentat_error.log
CustomLog ${APACHE_LOG_DIR}/madmentat_access.log combined
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 192.168.88.202
</VirtualHost>
# Диагностика раскладки vhost'ов:
apachectl -S
Joomla 3.5 и версии PHP
Если после восстановления места сайт всё ещё показывает «Error», проверьте совместимость версии PHP. Joomla 3.5 не дружит с PHP 8.x — для неё обычно нужен PHP 5.6–7.x (например, 7.4). Либо временно переключите сайт на подходящую версию PHP, либо обновляйтесь до Joomla 3.10.x (а затем 4/5) с учётом совместимости расширений.
php -v
apachectl -M | grep -i php
ps aux | grep php-fpm
php-fpm -v
Фрагменты из реального кейса
apache2/error.log
[mpm_prefork:notice] AH00163: Apache/2.4.41 (Ubuntu) configured -- resuming normal operations
[core:notice] AH00094: Command line: '/usr/sbin/apache2'
[mpm_prefork:error] AH00161: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting
[log_config:warn] (28)No space left on device: AH00646: Error writing to /var/log/apache2/access.log
...
Самые большие файлы/каталоги
/tmp — 27G
/var/log/journal — 4G
/var/lib/snapd — 3.3G
/var/lib/mysql/mad/x9k26_session.ibd — 653M
Чек-лист «сайт упал из-за места»
- Понять причину:
df -h
,df -i
,du
по /tmp и /var. - Быстро освободить: чистка
/tmp
,journalctl --vacuum-size
, APT-кэш, snap-ревизии, ротация логов. - Вернуть сервис:
systemctl restart apache2
(+php-fpm
при наличии), проверить бэкендcurl -H 'Host: ...'
. - Добить корень проблемы: обрезать таблицу сессий Joomla, настроить ротацию и автоочистку, по возможности вынести логи/кэш на отдельный раздел.
Готово: сайт встал, а повторения этой истории в будущем — гораздо менее вероятны.