Saat artikel ini ditulis, jam menunjukkan 01:49 wib, yang berarti saya begadang berjam-jam untuk memperbaiki galat (error) pada CMS Ghost (untuk selanjutnya ditulis Ghost saja). Buat yang belum tahu apa itu Ghost: Ghost berfungsi mirip WordPress. Bedanya, Ghost tidak memakai PHP, melainkan memakai Node.js.
Permasalahannya begini: Bila IPv6 dimatikan, Ghost berfungsi normal. Tapi bila IPv6 diaktifkan, maka peramban (web browser) memunculkan pesan kesalahan: Error 502 (Bad Gateway).
Sistem yang sedang berjalan:
- Ubuntu 20.04.6 LTS;
- RAM 2.7G;
- MariaDB 10.3.38;
- Nginx 1.22.1;
- Node.js 18.16.0;
- Ghost 5.44.0.
Karena saya memakai Nginx, maka saya menduga ada setting yang salah pada konfigurasi “blok server Nginx” sehingga Nginx tidak bisa berkomunikasi dengan Ghost. Dugaan saya, mungkin pada baris: proxy_pass http://127.0.0.1:2368; (Penyebab galat Bad Gateway paling sering ada di proxy_pass).
Singkat cerita, setelah diselidiki beberapa waktu ternyata bukan itu penyebabnya.
Saya tengok Ghost’s error log di folder content/logs. Kurang lebih seperti ini:
connect ECONNREFUSED ::1:3306
Ternyata Ghost terhenti karena gagal melakukan koneksi ke database! Log tersebut menjelaskan bahwa Ghost gagal melakukan koneksi ke database menggunakan username ‘username’@’::1′ pada port 3306. Angka ‘::1″ menunjukkan Ghost mencoba melakukan koneksi ke database memakai IPv6 yang tentu saja gagal karena saya menyiapkan akun ‘username’@’127.0.0.1’ (IPv4).
Oke. Saya membuat akun ‘username’@’::1′. Tapi Ghost hanya berjalan sebentar kemudian terhenti lagi dengan alasan yang sama: Gagal melakukan koneksi ke database.
Pindah dari TCP/IP ke Unix Socket
Akhirnya saya punya ide. Bagaimana bila Ghost melakukan koneksi memakai Unix Socket. Maka langkah-langkah yang saya lakukan adalah sebagai berikut.
Pastikan bahwa Unix socket ke database telah tersedia dan siap dipakai. Saya cek di folder /run/mysqld atau /var/run/mysqld. Ada file bernama /run/mysqld/mysqld.sock. Berarti bisa terhubung melalui Unix Socket.
Langkah berikutnya adalah mengedit file config.production.json
Ubah menjadi seperti ini:
"database": { "client": "mysql", "connection": { "socketPath": "/run/mysqld/mysqld.sock", "host": "", "user": "ghost", "password": "r4h4s14", "database": "ghost" }, "debug": false },
Setelah itu Ghost direstart dengan perintah: ghost restart. Atau kalau mau lebih meyakinkan lagi, servernya di-reboot.
Saya coba ketik: https://www.mawan.id (ini adalah blog saya yang memakai Ghost).
Alhamdulillah. Bisa. Malah dapat bonus tambahan yaitu koneksi ke database yang lebih cepat dan lebih stabil.
Kesimpulan:
Ghost macet (berjalan sebentar kemudian berhenti) karena gagal melakukan koneksi ke database memakai IPv6. Untuk memperbaikinya, paksa Ghost agar memakai Unix Socket, bukan TCP/IP. Solusi lain: Non-aktif-kan IPv6.
Semoga artikel ini berguna.