Tutorial Lengkap: Mengatasi PHP Tidak Bisa Menulis di VPS Nginx (PHP 8.3)
Masalah PHP tidak bisa menulis file atau folder (Permission Denied) sering terjadi setelah memindahkan aplikasi dari cPanel ke VPS dengan Nginx. Di cPanel, hampir semua konfigurasi permission sudah otomatis, sedangkan di VPS perlu diatur manual.
Pada tutorial ini, kita akan membahas langkah FINAL dan TERBUKTI agar:
·
PHP bisa menulis di semua folder
·
Tidak ada lagi error Permission denied
·
Stabil untuk production
·
Aman tanpa perlu chmod 777
Tutorial ini diuji pada:
·
OS: Ubuntu 24.04 LTS
·
Web Server: Nginx
·
PHP: PHP-FPM 8.3
1. Penyebab Umum PHP Tidak Bisa Menulis di VPS
Beberapa penyebab paling sering:
1. Ownership
file salah (file dimiliki root,
PHP berjalan sebagai www-data)
2. Permission
folder tidak mengizinkan write
3. PHP-FPM
berjalan lebih dari satu versi (misalnya 8.3 dan 8.4 bersamaan)
4. Konfigurasi
open_basedir atau disable_functions
2. Pastikan Nginx dan PHP-FPM Menggunakan User yang Sama
Cek user Nginx:
ps aux | grep nginx
Cek PHP-FPM:
ps aux | grep php-fpm
Pastikan worker process menggunakan www-data.
3. Gunakan Hanya PHP-FPM 8.3
Jika ada versi lain (misalnya 8.4), matikan total:
systemctl stop php8.4-fpm
systemctl disable php8.4-fpm
Pastikan hanya PHP-FPM 8.3 yang aktif:
ps aux | grep php-fpm
4. Pastikan Nginx Mengarah ke Socket PHP 8.3
Periksa konfigurasi Nginx:
grep -R "fastcgi_pass" /etc/nginx
Harus mengarah ke:
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
Reload Nginx:
systemctl reload nginx
5. Set Ownership Global (Langkah Paling Penting)
Jadikan seluruh file web dimiliki oleh www-data:
chown -R www-data:www-data /var/www
Langkah ini menghilangkan konflik root vs PHP.
6. Aktifkan ACL agar PHP Bisa Menulis di Semua Kondisi
Install ACL:
apt update
apt install acl -y
Terapkan ACL ke seluruh web:
setfacl -R -m u:www-data:rwx /var/www
setfacl -R -d -m u:www-data:rwx /var/www
Dengan ACL:
·
File lama bisa ditulis
·
File baru otomatis writable
·
Cache, upload, JSON, dan log aman
7. Atur Permission Standar (Aman untuk Production)
find /var/www -type d -exec chmod 755 {} \;
find /var/www -type f -exec chmod 644 {} \;
ACL tetap berlaku meskipun permission standar digunakan.
8. Set UMASK dan Bebaskan PHP
Edit konfigurasi PHP:
nano /etc/php/8.3/fpm/php.ini
Pastikan pengaturan berikut:
umask = 0002
open_basedir =
disable_functions =
Restart PHP-FPM:
systemctl restart php8.3-fpm
9. Testing: Validasi PHP Bisa Menulis di Semua Folder
Buat file test:
nano /var/www/html/test_all.php
Isi dengan kode berikut:
<?php
echo "PHP VERSION: " . PHP_VERSION . "<br><br>";
$paths = [
'test_root.txt',
'uploads/test_upload.txt',
'cache_home/test_cache.json',
'dashboard/test_log.log'
];
foreach ($paths as $p) {
echo $p . ' => ';
echo file_put_contents($p, 'OK') ? 'OK<br>' : 'FAIL<br>';
}
Akses melalui browser:
https://domainanda/test_all.php
Jika semua tampil OK, maka konfigurasi sudah berhasil.
10. Tips Penting Agar Tidak Error Lagi
·
❌ Jangan upload file menggunakan user root
·
✔ Jika terpaksa, jalankan ulang:
·chown -R www-data:www-data /var/www
·
Jangan menginstall PHP-FPM versi lain tanpa
mengunci Nginx
Kesimpulan
Dengan konfigurasi di atas:
·
PHP-FPM 8.3 berjalan stabil
·
Nginx terhubung ke socket yang benar
·
PHP bisa menulis di semua folder
·
Aman untuk cache, upload, editor, dan log
·
Cocok untuk aplikasi hasil migrasi dari cPanel
Semoga tutorial ini membantu dan bisa menjadi referensi bagi Anda yang mengalami masalah serupa setelah pindah ke VPS Nginx.
Selamat mencoba 🚀
