Izin sebuah berkas hanyalah pemeriksaan terakhir. Beberapa hal lain bisa menolak penulisannya sementara berkas itu sendiri tampak benar sempurna, dan itulah yang membuat perkara ini begitu membingungkan.

1. Sebuah direktori di atasnya

namei -l /var/www/site/storage/logs/app.log

Setiap direktori di jalur itu perlu izin jalankan agar Anda bisa mencapai berkasnya. namei mencetak seluruh rantainya berikut izinnya, dan baris yang bersalah biasanya kentara.

2. Yang bermasalah prosesnya, bukan Anda

ps aux | grep php-fpm | head -3            # which user is it running as
sudo -u www-data test -w /var/www/site/storage && echo writable || echo NOT

Cangkang Anda adalah Anda; server webnya adalah www-data. Menguji sebagai pengguna yang tepat adalah beda antara perbaikan lima menit dan satu sore penuh.

3. SELinux, di RHEL, Alma, dan Rocky

ls -Z /var/www/site/storage
sudo ausearch -m avc -ts recent | tail
sudo chcon -R -t httpd_sys_rw_content_t /var/www/site/storage
sudo setsebool -P httpd_can_network_connect on
Penolakan SELinux sama sekali tidak muncul di catatan aplikasi. Kalau izinnya sudah benar dan penulisannya tetap gagal di salah satu distribusi itu, sebabnya hampir selalu ini.

4. Tak bisa diubah, atau terkait sebagai baca-saja

lsattr /var/www/site/config.php     # ----i--------- means immutable
sudo chattr -i /var/www/site/config.php
mount | grep " / "                  # ro means read-only, often after a disk error
Sistem berkas yang dikaitkan ulang sebagai baca-saja berarti kernel sedang melindungi cakram yang sedang rusak. Periksa dmesg -T | tail sebelum melakukan apa pun - itu masalah perangkat keras, bukan masalah izin.

Lalu setel dengan benar

Bukan 777. Alat yang benar adalah kepemilikan dan bit grup - lihat kepemilikan, umask, dan jebakan grup.