Laravel Queue Workers Crashing on Ubuntu 22.04 VPS: 7 Dev‑Approved Fixes to Stop 500 Errors Before They Drain Your Server
You’ve been pulling an all‑night deployment, watching the php artisan queue:work processes spin up, and then—boom—your site throws a 500 error and the logs fill with “Worker died” messages. It feels like the VPS is silently siphoning your time and cash. This guide cuts through the noise, giving you seven battle‑tested fixes that keep Laravel queue workers alive, slash 500 errors, and let you focus on shipping features instead of firefighting.
Why This Matters
Queue workers are the backbone of any modern Laravel app: email dispatch, notifications, image processing, API throttling… When they crash, users see broken pages, revenue drops, and the php-fpm pool quickly runs out of workers, turning a single bug into a full‑blown outage. On a 2 vCPU Ubuntu 22.04 VPS, a mis‑configured supervisor or exhausted RAM can bring the whole stack down in minutes.
Common Causes on Ubuntu 22.04
- Insufficient
pm.max_childrenin PHP‑FPM causing “failed to fork” errors. - Supervisor’s
stopwaitsecstoo low for long‑running jobs. - Missing or outdated
redisextension leading to queue driver timeouts. - Memory‑leak in a custom job that exhausts 2 GB RAM.
- Incorrect file permissions on
storage/frameworkcausing serialization failures. - Ubuntu 22.04’s default
systemdlimits (e.g.,LimitNOFILE) throttling processes. - Composer autoloader cache corruption after a partial deploy.
Step‑By‑Step Fix Tutorial
1. Tune PHP‑FPM for Queue Load
Why: Queue workers run as separate PHP processes. If pm.max_children is too low, new jobs wait indefinitely and eventually hit a 500.
# /etc/php/8.2/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 12 ; adjust based on 2 vCPU (≈6‑8 per core)
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 6
request_terminate_timeout = 300
After editing, restart PHP‑FPM:
sudo systemctl restart php8.2-fpm
2. Harden Supervisor Config
Set a realistic stopwaitsecs and enable auto‑restart.
# /etc/supervisor/conf.d/laravel-queue.conf
[program:laravel-queue]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/artisan queue:work redis --sleep=3 --tries=3 --timeout=120
autostart=true
autorestart=true
stopwaitsecs=180
numprocs=4
user=www-data
redirect_stderr=true
stdout_logfile=/var/www/html/storage/logs/queue-worker.log
Reload Supervisor:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-queue:*
3. Install & Enable the Redis PHP Extension
Missing php-redis will cause the queue driver to fallback to sync, breaking async processing.
sudo apt-get update
sudo apt-get install -y php-redis
sudo phpenmod redis
sudo systemctl restart php8.2-fpm
4. Increase Systemd Limits
Ubuntu’s default LimitNOFILE (1024) can choke high‑traffic queues.
# /etc/systemd/system/php-fpm.service.d/override.conf
[Service]
LimitNOFILE=65535
Reload systemd and restart PHP‑FPM:
sudo systemctl daemon-reload
sudo systemctl restart php8.2-fpm
5. Optimize Composer Autoloader for Production
composer install --optimize-autoloader --no-dev
php artisan config:cache
php artisan route:cache
php artisan view:cache
6. Fine‑Tune Nginx for Long‑Running Requests
# /etc/nginx/sites-available/laravel.conf
server {
listen 80;
server_name example.com;
root /var/www/html/public;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 8 64k;
}
# Cache static assets
location ~* \.(js|css|png|jpg|jpeg|svg|gif)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
Test and reload Nginx:
sudo nginx -t
sudo systemctl reload nginx
7. Add a Health‑Check Cron to Restart Stale Workers
# /etc/cron.d/queue-health
*/5 * * * * www-data /usr/bin/php /var/www/html/artisan queue:restart >> /dev/null 2>&1
VPS or Shared Hosting Optimization Tips
- Swap Management: Add a 1 GB swap on VPS to cushion occasional memory spikes.
- OPCache Settings:
opcache.memory_consumption=256,opcache.max_accelerated_files=10000. - Disable Xdebug in Production: It adds 30 MB per request.
- Use Cloudflare “Always Online”: Serves a cached HTML copy while workers reboot.
- On shared hosts: Leverage
php artisan queue:work --daemonunder the host’s cron if Supervisor isn’t available.
Real World Production Example
Acme Corp runs a SaaS platform on a 2 vCPU Ubuntu 22.04 VPS behind Cloudflare. After applying the seven fixes, their queue crash rate dropped from 8 times/hour to zero for 30 days straight. The response_time metric in New Relic went from 1.8 s to 0.4 s for API endpoints that fire background jobs.
Before vs. After Results
| Metric | Before | After |
|---|---|---|
| Avg. Queue Latency | 12 seconds | 2 seconds |
| 500 Errors / Day | 7 | 0 |
| Memory Usage (Peak) | 2.7 GB | 1.4 GB |
Security Considerations
Never run queue workers as
root. Use a dedicated system user with only the necessary file permissions. Keep your.envout of the web root and restrict R/W access tostoragefolders.
Bonus Performance Tips
- Enable
Redis::setOption(Redis::OPT_READ_TIMEOUT, -1)for long‑running jobs. - Group small jobs into a single “batch” to reduce context switching.
- Use
php artisan horizonfor visual monitoring and auto‑scaling on larger fleets. - Compress JSON payloads with
gzcompressbefore queuing them. - Set
QUEUE_CONNECTION=redisandREDIS_CLIENT=phpredisfor maximum throughput.
FAQ
Q: My VPS still restarts after the fixes. What else can I check?
A: Look at /var/log/kern.log for OOM kills. If the kernel is killing processes, increase swap or upgrade RAM.
Q: Can I run queue workers on a shared hosting plan?
A: Yes, but you’ll need to rely on cron * * * * * php /path/to/artisan queue:work --once and accept lower concurrency.
Q: Do I really need Supervisor on Ubuntu 22.04?
A: It’s the most reliable way to keep processes alive across reboots and to auto‑restart crashed workers. Alternatives like systemd units work too, but Supervisor gives per‑process control.
Final Thoughts
Queue workers crashing on Ubuntu 22.04 isn’t a mystery—it’s a combination of default limits, missing extensions, and a lack of production‑grade tuning. By applying the seven fixes above you’ll transform a flaky dev environment into a rock‑solid production pipeline, protect your revenue, and free up countless hours for actual development.
Looking for a low‑cost, high‑performance VPS that ships with the latest PHP 8.2, Redis, and a one‑click Laravel installer? Cheap secure hosting can get you up and running in minutes.
No comments:
Post a Comment