11 miljoen sessies

Het was een grauwe Groninger ochtend, toen zich een merkwaardige reeks van herhalende foutmeldingen deed verschijnen:

PHP Fatal error:  Uncaught Error: Failed to create(read) session ID: files (path: /var/lib/php/sessions) in /www/index.php:5
Stack trace:
#0 /www/index.php(5): session_regenerate_id(true)
#1 {main}
thrown in /www/index.php on line 5

PHP Warning:  session_regenerate_id(): open(/var/lib/php/sessions/sess_1g6iklh46b2phg4vekq9n3uhbn, O_RDWR) failed: No space left on device (28)

Oh boy. Uw sessie is verlopen. Volle schijf? Even met df kijken of dat zo is. Hmmm, nope, slechts 33% vol. Misschien permissions, op de een of andere manier? Maar neen, stat geeft aan dat /var/lib/php/sessions keurig mode 1733 en owner root/root heeft. Hmmm. PHP klaagde dat open() faalde met code 28. Kijken wat dat dan is. man 3p open.

ENOSPC The directory or file system that would contain the new file cannot be expanded, the file does not exist, and O_CREAT is specified.

Waardeloze manpage zoals gewoonlijk. Zoeken naar "open() errno 28" wierp meer vruchten af: blijkbaar gaat het niet per se om hoeveel ruimte je nog over hebt op je schijf. Het kan ook liggen aan hoeveel inodes je over hebt. Goeie, hoeveel heb ik nog over?

$ df -i
Filesystem        Inodes IUsed IFree IUse% Mounted on
udev                3.9M   388  3.9M    1% /dev
tmpfs               3.9M   705  3.9M    1% /run
/dev/sda3            12M   11M  1.3M   89% /
tmpfs               3.9M     1  3.9M    1% /dev/shm
tmpfs               3.9M     5  3.9M    1% /run/lock
tmpfs               3.9M    15  3.9M    1% /sys/fs/cgroup
/var/XXXXXXXX/www    12M   11M  1.3M   89% /www
/dev/sda4           1.9M   265  1.9M    1% /var/log
/dev/sda1              0     0     0     - /boot/efi

Ah, blijkbaar heb ik 11 miljoen bestanden en daarmee 89% inode usage. Dat ziet er uit als een probleem. Maar waar staan die 11 miljoen bestanden? Daarvoor voeren we dit commando uit, eerst op / door cd / te doen.

# find . -maxdepth 1 -type d | grep -v '^\.$' | xargs -n 1 -i{} find {} -xdev -type f | cut -d "/" -f 2 | uniq -c | sort -n

Waaruit blijkt dat /var de meeste bestanden heeft... cd /var en herhaal... lib! php! sessions! /var/lib/php/sessions! Kut php, rm -r /var/lib/php/sessions && mkdir /var/lib/php/sessions && chmod 1733 /var/lib/php/sessions. Zo, dat zal 'm leren.

PHP Warning:  Unknown: Unable to create temporary file, Check permissions in temporary files directory. in Unknown on line 0
PHP Warning:  Unknown: POST data can't be buffered; all data discarded in Unknown on line 0

Oh-oh. Wat nou weer, php? service apache2 restart.

Job for apache2.service failed because of unavailable resources or another system error.
See "systemctl status apache2.service" and "journalctl -xe" for details.

Uhhh... Oeps? journalctl -xe dan maar.

Jul 27 10:17:24 realtime12 sudo[12789]:     root : TTY=pts/0 ; PWD=/var/lib/php ; USER=root ; COMMAND=/bin/systemctl restart apache2
Jul 27 10:17:24 realtime12 sudo[12789]: pam_unix(sudo:session): session opened for user root by michael(uid=0)
Jul 27 10:17:24 realtime12 systemd[1]: apache2.service: Failed to run 'start' task: No such file or directory
Jul 27 10:17:24 realtime12 systemd[1]: Failed to start The Apache HTTP Server.
-- Subject: Unit apache2.service has failed
-- Defined-By: systemd
-- Support: https://www.debian.org/support
-- 
-- Unit apache2.service has failed.
-- 
-- The result is failed.
Jul 27 10:17:24 realtime12 systemd[1]: apache2.service: Failed with result 'resources'.
Jul 27 10:17:24 realtime12 sudo[12789]: pam_unix(sudo:session): session closed for user root

Aha, informatief. Omdat php klaagde over een temporary directory, en apache ook klaagde over no such file/directory, had ik het vermoeden dat er iets was met /tmp. stat /tmp?

stat: cannot stat '/tmp': No such file or directory

Aha! Blijkbaar had mijn rm -r op de een of andere manier /tmp meegenomen en ook verwijderd. Kut php met z'n rare hacks en setup. mkdir /tmp && chmod /tmp 1777 eroverheen, klaar is kees. Apache startte weer, php hield z'n bek weer, en zelfs de zon begon weer door te breken.

2021-07-27 in blog #PHP #Linux #sysadmin #Apache