КАК Я ЧИНИЛ САЙТ

Кейс: 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.logNo 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)

 

 


Восстановление за несколько минут (команды)

  1. Очистить старые файлы в /tmp (даст больше всего):
    sudo find /tmp -xdev -type f -mtime +2 -delete
    sudo find /tmp -xdev -type d -empty -delete
    
  2. Урезать systemd-журнал:
    sudo journalctl --vacuum-size=200M
    
  3. Подрезать логи PostgreSQL (оставив текущий):
    sudo rm -f /var/log/postgresql/*.log.[0-9] /var/log/postgresql/*.log.[0-9].gz
    
  4. Почистить APT-кэш:
    sudo apt-get clean
    
  5. Удалить старые версии 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
    
  6. Если нужно — обнулить логи Apache:
    sudo truncate -s0 /var/log/apache2/access.log /var/log/apache2/error.log
    
  7. Перезапустить веб-сервисы:
    sudo systemctl restart apache2
    sudo systemctl restart php*-fpm 2>/dev/null || true
    
  8. Проверить бэкенд 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

 

 


Чек-лист «сайт упал из-за места»

  1. Понять причину: df -h, df -i, du по /tmp и /var.
  2. Быстро освободить: чистка /tmp, journalctl --vacuum-size, APT-кэш, snap-ревизии, ротация логов.
  3. Вернуть сервис: systemctl restart apache2 (+php-fpm при наличии), проверить бэкенд curl -H 'Host: ...'.
  4. Добить корень проблемы: обрезать таблицу сессий Joomla, настроить ротацию и автоочистку, по возможности вынести логи/кэш на отдельный раздел.

Готово: сайт встал, а повторения этой истории в будущем — гораздо менее вероятны.