私のPHP mod_php
でApache2を使用する私のDebianウェブサーバー上のセッションは、それらを書き込むスペースがないと言って、ランダムに失敗しているようです:
Sudo tail -60 /var/log/Apache2/error.log
[Fri Jan 30 15:55:35 2015] [error] [client xxx.xxx.xxx.xxx] PHP Warning: session_start() [<a href='function.session-start'>function.session-start</a>]: open(/tmp/sess_555555555555555555, O_RDWR) failed: No space left on device (28) in /path/to-first-session-use/core/bootstrap.php on line 18
私がしようとすると:
ls /tmp
永久にハングアップするだけなので、それは悪いことです。
しかし、空き容量を確認し、inodeの使用が妥当であることを確認すると...
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 150G 121G 22G 85% /
tmpfs 2.0G 0 2.0G 0% /lib/init/rw
udev 10M 16K 10M 1% /dev
tmpfs 2.0G 4.0K 2.0G 1% /dev/shm
$ df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 19922944 11143605 8779339 56% /
tmpfs 513524 4 513520 1% /lib/init/rw
udev 513524 135 513389 1% /dev
tmpfs 513524 3 513521 1% /dev/shm
数字は問題ないようです。確かに、85%は私が望む以上のものですが、それは99%でも何でもありません。
5年間マシンを再起動しなかったため、問題が発生したのではないかと思っていました。おそらく、多数の小さなファイルが作成されていますが、iノードの情報が多少矛盾しています。代わりにどこを調査すればよいですか?
編集:
ls -l /
drwxrwxrwt 4 root root 692M Feb 1 11:09 tmp/
drwxr-xr-x 10 root root 4.0K Jan 1 2013 usr/
drwxr-xr-x 14 root root 4.0K Oct 7 2010 var/
...etc
/tmp/
ディレクトリ自体が古いPHPクリーンアップされていないセッションでいっぱいになっている可能性があります。つまり、問題の原因が/tmp/
ディレクトリ自体に分離されている可能性があります。その場合はすべての/tmp/sess_*
ファイルを削除するだけです。まず、次のようにすべてのsess_*
ファイルをリストします。
ls -la /tmp/sess_*
または、次のようにwc
を使用してカウントを取得できます。
ls -la /tmp/sess_* | wc -l
ここで、いくつかの非常に多くのファイルがあることを確認したら、次のコマンドを実行して/tmp/sess_*
ファイルを削除します。
Sudo rm -rf /tmp/sess_*
そして、一時的なセッションファイルは吹き飛ばされます。
しかし、別のブルートフォース(ただし比較的安全)で対処するには、/tmp
ディレクトリ自体を削除し、/tmp
ディレクトリを再作成してサーバーを再起動します。
/tmp
ディレクトリは、基本的にはキャッシュされた素材のコーディング保持ペンであるため、そこにあるべき有効なものはありません。したがって、私の最善のアドバイスは、次のコマンドを実行して/tmp
ディレクトリを削除して再構築することです。
rm -rf /tmp && mkdir /tmp/ && chown root:root /tmp && chmod 1777 /tmp
これで、1つのライナーは基本的に&&
で接続されたシェルコマンドのリストであり、最初に/tmp
を削除し、/tmp
を再作成し、/tmp
の所有権をroot:root
に戻し、次に/tmp
ディレクトリに適切な権限を設定します。その方法で実行する方が安全だと思われる場合は、必要に応じて各コマンドを1つずつ実行できます。
Sudo rm -rf /tmp
Sudo mkdir /tmp
Sudo chown root:root /tmp
Sudo chmod 1777 /tmp
それが完了したら、サーバーを再起動することをお勧めします。物事は再び穏やかに片付ける必要があります。
時々損傷したファイルシステムはそれのような効果をすることができます-例えばディレクトリ/ tmpが損傷したとき。または-多くのファイルがある場合。
「迅速な」修正:
mv /tmp /tmp.xxx
mkdir /tmp
chmod a+rwxt /tmp
問題が解決しない場合は、システムとfsckルートファイルシステムを再起動してください。よろしければ、/ tmp.xxxディレクトリを削除してください。
別の可能性は-/ tmpが「その他の」パーティションまたはtmpfs(Linux vserversで見られる)の場合ですが、dfでは表示されません(dfが/ etc/mtabファイルからパーティションのリストを取得するため、正しくない場合があります)。次のコマンドを使用して、tmpのディスク容量を直接確認してください。
df /tmp
df -i /tmp
通常はセッションに役立つ他のオプション-他のセッションメカニズムを使用します。非常に永続的である必要のない多くの一時セッションがある場合、セッションの保存にmemcacheを使用することをお勧めします。設定は非常に簡単です。php-memcache、memcachedをインストールし、php.confに設定する必要があります。
session.save_handler = memcache
session.save_path="tcp://server:port?persistent=1&weight=1&timeout=1&retry_interval=15"
次に、セッションは定義されたサイズまでmemcacheに保存されます。それ以上-最も古いものが自動的に削除されます。
私にとっては、fs.inotify.max_user_watchesを変更することでうまくいきました。
root@grostruc:/# service ssh restart
Error: No space left on device
root@grostruc:/# sysctl fs.inotify.max_user_watches
fs.inotify.max_user_watches = 65536
root@grostruc:/# sysctl fs.inotify.max_user_watches=262144
fs.inotify.max_user_watches = 262144
root@grostruc:/# service ssh restart
/etc/sysctl.confの変更された値を修正