Skip to content

Menjalankan Laravel Queue sebagai Service Background dengan systemd

Dalam pengembangan aplikasi Laravel, menjalankan queue worker secara manual menggunakan perintah php artisan queue:work di terminal tidaklah cukup untuk lingkungan produksi (production). Jika terminal ditutup atau server restart, proses queue akan mati.

Cara paling stabil dan standar di Linux untuk memastikan antrean (queue) tetap berjalan adalah dengan menggunakan systemd.

Mengapa Menggunakan systemd?

  • Auto-Restart: Jika proses queue error atau crash, systemd akan otomatis menjalankannya kembali.
  • Mulai Otomatis: Queue akan otomatis berjalan saat server melakukan booting.
  • Manajemen Mudah: Anda bisa memantau status, menghentikan, atau memulai ulang layanan dengan satu perintah singkat.

Langkah-langkah Konfigurasi

1. Membuat File Service

Buka terminal server Anda dan buat file konfigurasi baru di direktori systemd:

bash
sudo nano /etc/systemd/system/laravel-worker.service

2. Menyusun Konfigurasi

Tempelkan konfigurasi berikut ke dalam file tersebut. Sesuaikan bagian yang ditebalkan dengan kondisi server Anda:

ini
[Unit]
Description=Laravel Queue Worker - My Application
After=network.target mysql.service redis.service

[Service]
# Sesuaikan User & Group (biasanya www-data atau username Anda)
User=www-data
Group=www-data
Restart=always
RestartSec=5

# Sesuaikan dengan lokasi folder project Laravel Anda
WorkingDirectory=/var/www/my-project

# Sesuaikan path PHP dan path artisan
ExecStart=/usr/bin/php /var/www/my-project/artisan queue:work --backoff=3 --tries=3 --timeout=90

[Install]
WantedBy=multi-user.target

Catatan: Jika Anda menggunakan Laravel Horizon, ganti perintah queue:work pada ExecStart menjadi horizon.

3. Mendaftarkan dan Menjalankan Service

Setelah file disimpan, lakukan langkah-langkah berikut untuk mengaktifkannya:

  1. Muat ulang daemon agar systemd mengenali file baru:
bash
sudo systemctl daemon-reload
  1. Aktifkan service agar berjalan otomatis saat server nyala:
bash
sudo systemctl enable laravel-worker.service
  1. Jalankan service sekarang juga:
bash
sudo systemctl start laravel-worker.service

Perintah Manajemen yang Penting

Gunakan perintah di bawah ini untuk mengelola queue worker Anda:

PerintahFungsi
sudo systemctl status laravel-workerMengecek apakah worker sedang berjalan/error.
sudo systemctl restart laravel-workerMemuat ulang worker (Wajib setelah Anda update code).
sudo systemctl stop laravel-workerMenghentikan semua proses antrean.
journalctl -u laravel-worker -fMelihat log aktivitas worker secara real-time.

Tips Tambahan: Update Kode

Perlu diingat bahwa queue:work adalah proses yang berjalan secara long-lived (menyimpan data di memori). Setiap kali Anda melakukan perubahan pada kode program (misalnya setelah git pull), Anda harus menjalankan perintah:

bash
sudo systemctl restart laravel-worker

Atau jika menggunakan perintah Laravel:

bash
php artisan queue:restart

Dengan konfigurasi ini, sistem antrean aplikasi Laravel Anda akan jauh lebih tangguh dan dapat diandalkan di server produksi.

Untuk menonaktifkan dan menghapus layanan (service) di systemd secara permanen, Anda perlu mengikuti urutan langkah yang benar agar tidak ada sisa proses yang tertinggal atau konfigurasi yang "gentayangan".

Berikut adalah langkah-langkahnya:

1. Hentikan Layanan yang Sedang Berjalan

Langkah pertama adalah memastikan proses layanan tersebut benar-benar mati.

bash
sudo systemctl stop nama-service.service

2. Nonaktifkan Autostart (Disable)

Ini akan menghapus symbolic link yang membuat layanan berjalan otomatis saat server booting.

bash
sudo systemctl disable nama-service.service

3. Hapus File Unit Service

Anda harus menghapus file konfigurasi asli yang biasanya terletak di salah satu direktori berikut:

  • /etc/systemd/system/ (Paling umum untuk layanan kustom)
  • /lib/systemd/system/ (Biasanya untuk paket aplikasi resmi)

Gunakan perintah rm untuk menghapusnya:

bash
sudo rm /etc/systemd/system/nama-service.service

4. Reload Daemon Systemd

Setelah file dihapus, sistem masih menyimpan konfigurasi lama di memori. Anda harus memaksa systemd untuk memindai ulang struktur direktorinya.

bash
sudo systemctl daemon-reload

5. Bersihkan Sisa Konfigurasi (Opsional)

Jika layanan tersebut memiliki dependensi yang gagal dibersihkan, jalankan perintah ini:

bash
sudo systemctl reset-failed

Cara Verifikasi

Untuk memastikan layanan tersebut sudah benar-benar hilang dari sistem, jalankan:

bash
systemctl list-unit-files | grep nama-service

Jika tidak ada output yang muncul, berarti layanan telah berhasil dihapus sepenuhnya.

Ringkasan Perintah dalam Satu Baris

Jika Anda yakin dengan nama layanannya, Anda bisa menggabungkannya:

bash
sudo systemctl stop nama-service && sudo systemctl disable nama-service && sudo rm /etc/systemd/system/nama-service.service && sudo systemctl daemon-reload && sudo systemctl reset-failed

Hati-hati: Menghapus file di /etc/systemd/system/ tidak dapat dibatalkan (undo). Pastikan Anda memiliki cadangan jika layanan tersebut penting.