Laravel Queue Worker di Ubuntu dengan Supervisor

Pada artikel sebelumnya kita sudah membahas cara menggunakan Laravel Queue dengan Redis untuk menjalankan background job.

Saat development, menjalankan queue worker cukup dengan:

php artisan queue:work

Masalahnya, command tersebut akan berhenti ketika terminal ditutup atau proses worker mengalami crash.

Untuk aplikasi production, kita membutuhkan cara agar queue worker dapat tetap berjalan secara otomatis dan kembali dijalankan jika terjadi masalah.

Salah satu solusi yang umum digunakan di Ubuntu adalah Supervisor.

Apa Itu Supervisor?

Supervisor adalah process control system yang dapat digunakan untuk memantau dan mengelola proses yang berjalan di server.

Dalam kasus Laravel Queue, Supervisor dapat digunakan untuk:

  • Menjalankan queue worker secara otomatis
  • Menjaga worker tetap berjalan
  • Menjalankan kembali worker ketika berhenti
  • Menjalankan beberapa worker sekaligus
  • Mengelola proses background di server

Arsitekturnya menjadi:

Laravel
   ↓
Redis
   ↓
Queue Worker
   ↑
Supervisor

Supervisor bertugas memastikan proses php artisan queue:work tetap berjalan.

Persiapan

Contoh pada artikel ini menggunakan:

  • Ubuntu
  • Laravel
  • PHP
  • Redis
  • Composer
  • Supervisor

Pastikan aplikasi Laravel dan Redis sudah berjalan dengan baik.

Untuk memastikan Redis aktif:

redis-cli ping

Jika berhasil, hasilnya:

PONG

Jika Anda belum menginstall Redis, lihat artikel:

Cara Install Redis di Ubuntu untuk Laravel

Sedangkan untuk memahami konfigurasi queue dengan Redis, lihat:

Laravel Queue dengan Redis: Panduan Background Job untuk Pemula

Install Supervisor di Ubuntu

Install Supervisor menggunakan apt:

sudo apt update

Kemudian:

sudo apt install supervisor

Setelah proses instalasi selesai, pastikan service Supervisor berjalan:

sudo systemctl status supervisor

Jika belum aktif, jalankan:

sudo systemctl enable --now supervisor

Dengan enable, Supervisor akan otomatis dijalankan ketika server melakukan boot.

Membuat Konfigurasi Queue Worker

Konfigurasi Supervisor biasanya disimpan di:

/etc/supervisor/conf.d/

Buat file konfigurasi baru:

sudo nano /etc/supervisor/conf.d/laravel-worker.conf

Kemudian isi:

[program:laravel-worker]

process_name=%(program_name)s_%(process_num)02d

command=php /var/www/example.com/artisan queue:work redis --sleep=3 --tries=3 --timeout=90

autostart=true
autorestart=true

stopasgroup=true
killasgroup=true

numprocs=1

redirect_stderr=true

stdout_logfile=/var/www/example.com/storage/logs/worker.log

stopwaitsecs=3600

Sesuaikan:

/var/www/example.com

dengan lokasi project Laravel Anda.

Misalnya project berada di:

/var/www/sites/example.com

maka command menjadi:

command=php /var/www/sites/example.com/artisan queue:work redis --sleep=3 --tries=3 --timeout=90

Begitu juga dengan lokasi log:

stdout_logfile=/var/www/sites/example.com/storage/logs/worker.log

Menentukan User

Queue worker sebaiknya dijalankan menggunakan user yang memiliki permission sesuai terhadap aplikasi Laravel.

Misalnya aplikasi dijalankan menggunakan user www-data, konfigurasi dapat menggunakan:

user=www-data

Contohnya:

[program:laravel-worker]

process_name=%(program_name)s_%(process_num)02d

command=php /var/www/example.com/artisan queue:work redis --sleep=3 --tries=3 --timeout=90

user=www-data

autostart=true
autorestart=true

stopasgroup=true
killasgroup=true

numprocs=1

redirect_stderr=true

stdout_logfile=/var/www/example.com/storage/logs/worker.log

stopwaitsecs=3600

Pastikan user tersebut memiliki permission yang sesuai terhadap project Laravel, terutama directory storage.

Memuat Konfigurasi Supervisor

Setelah konfigurasi selesai, jalankan:

sudo supervisorctl reread

Jika konfigurasi terdeteksi, biasanya akan muncul:

laravel-worker: available

Kemudian:

sudo supervisorctl update

Supervisor akan membuat dan menjalankan program berdasarkan konfigurasi tersebut.

Menjalankan Queue Worker

Untuk memastikan worker berjalan:

sudo supervisorctl status

Contohnya:

laravel-worker:laravel-worker_00   RUNNING   pid 12345, uptime 0:00:10

Status RUNNING menunjukkan bahwa queue worker sedang berjalan.

Kita juga dapat menjalankannya secara manual:

sudo supervisorctl start laravel-worker:*

Untuk menghentikan:

sudo supervisorctl stop laravel-worker:*

Menggunakan Beberapa Worker

Salah satu keuntungan Supervisor adalah kita dapat menjalankan beberapa worker secara bersamaan.

Misalnya:

numprocs=3

Supervisor kemudian akan menjalankan:

laravel-worker_00
laravel-worker_01
laravel-worker_02

Ketiga worker tersebut dapat mengambil job dari Redis secara bersamaan.

Ini berguna ketika aplikasi memiliki banyak pekerjaan yang harus diproses.

Namun, jangan langsung menggunakan banyak worker tanpa memperhatikan kapasitas server. Jumlah worker harus disesuaikan dengan CPU, memory, dan karakteristik pekerjaan yang dijalankan.

Memantau Queue Worker

Untuk melihat status worker:

sudo supervisorctl status

Untuk melihat log worker:

tail -f /var/www/example.com/storage/logs/worker.log

Jika aplikasi menggunakan Laravel log, error aplikasi juga dapat diperiksa melalui:

storage/logs/laravel.log

Dengan melihat log, kita dapat mengetahui apakah job berhasil diproses atau mengalami error.

Setelah Mengubah Kode Laravel

Queue worker merupakan proses yang berjalan terus-menerus.

Artinya, ketika Anda melakukan perubahan pada kode Job, worker yang sedang berjalan belum tentu langsung menggunakan kode terbaru.

Karena itu, setelah melakukan deployment, worker sebaiknya di-restart dengan:

php artisan queue:restart

Command tersebut meminta worker Laravel untuk menyelesaikan job yang sedang dikerjakan kemudian berhenti.

Supervisor akan melihat bahwa proses worker berhenti dan menjalankannya kembali.

Alurnya:

Deploy kode baru
      ↓
php artisan queue:restart
      ↓
Worker selesai
      ↓
Worker berhenti
      ↓
Supervisor mendeteksi
      ↓
Worker dijalankan kembali

Ini merupakan salah satu alasan Supervisor sangat berguna untuk production.

Troubleshooting

Jika worker tidak berjalan, periksa status Supervisor:

sudo supervisorctl status

Kemudian periksa log:

tail -f /var/www/example.com/storage/logs/worker.log

Periksa juga apakah Laravel dapat menjalankan queue worker secara manual:

cd /var/www/example.com

php artisan queue:work redis

Jika command tersebut menghasilkan error, kemungkinan masalahnya bukan pada Supervisor, tetapi pada konfigurasi Laravel, PHP, Redis, permission, atau dependency aplikasi.

Anda juga dapat memastikan Redis masih berjalan:

redis-cli ping

Hasil yang diharapkan:

PONG

Kesimpulan

Menjalankan:

php artisan queue:work

cukup untuk development, tetapi production membutuhkan process manager agar worker tetap berjalan.

Dengan Supervisor, arsitektur Laravel Queue menjadi:

                Laravel
                   │
                   ↓
                 Redis
                   │
                   ↓
             Queue Worker
                   ↑
                   │
              Supervisor

Supervisor memastikan queue worker otomatis dijalankan dan dapat dimulai kembali ketika proses berhenti.

Untuk aplikasi Laravel yang menggunakan Redis sebagai queue driver, kombinasi Redis + Queue Worker + Supervisor merupakan setup yang sederhana dan cukup umum untuk menjalankan background job di server Ubuntu.