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 🚀