Laravel 10 Queue Workers Crashing on cPanel VPS: Why MySQL Timeouts and File Permissions Are Killing Your Deployments
Ever watched a queue worker silently die, leaving hundreds of jobs stuck in limbo? You’re not alone. On a cPanel‑managed VPS, a tiny mis‑configuration can turn a smooth Laravel 10 deployment into a nightly nightmare. In this article we’ll rip apart the common culprits—MySQL timeouts and file permission nightmares—then give you a battle‑tested fix that gets your workers back in the game.
Why This Matters
Queue workers are the heart of any modern SaaS or WordPress‑integrated Laravel app. When they fail:
- API responses slow to a crawl.
- Emails, notifications, and webhooks disappear.
- Customers see “jobs delayed” errors that directly hit revenue.
On a VPS with cPanel you’ll often see Fatal error: Uncaught PDOException or “Permission denied” in your supervisor logs. Those errors aren’t just noisy—they’re revenue‑killing.
Common Causes
1. MySQL wait_timeout / interactive_timeout
cPanel default MySQL settings close idle connections after 60 seconds. Laravel’s queue worker keeps a PDO connection open for the whole process, so after a few minutes MySQL drops it and the worker crashes.
2. Incorrect File Permissions on storage/ and bootstrap/cache
cPanel runs PHP under nobody or cpaneluser. If those directories are owned by root or set to 600, the worker cannot write job payloads or lock files, resulting in Permission denied errors.
3. Supervisor Mis‑configuration
Supervisor often runs under the cPanel user, but the command line may still point to a globally‑installed PHP binary that uses a different php.ini, missing extensions, or outdated Composer autoload files.
Step‑by‑Step Fix Tutorial
Step 1 – Tune MySQL Timeout Values
# Connect via SSH
sudo mysql -u root -p
# Show current values
SHOW VARIABLES LIKE 'wait_timeout';
SHOW VARIABLES LIKE 'interactive_timeout';
# Increase to 300 seconds (adjust per load)
SET GLOBAL wait_timeout = 300;
SET GLOBAL interactive_timeout = 300;
# Make persistent (cPanel may overwrite /etc/my.cnf)
echo "[mysqld]" >> /etc/my.cnf
echo "wait_timeout=300" >> /etc/my.cnf
echo "interactive_timeout=300" >> /etc/my.cnf
Step 2 – Fix Storage Permissions
# Replace myuser with your cPanel username
cd /home/myuser/myproject
sudo chown -R myuser:myuser storage bootstrap/cache
sudo find storage -type d -exec chmod 775 {} \;
sudo find storage -type f -exec chmod 664 {} \;
sudo find bootstrap/cache -type d -exec chmod 775 {} \;
sudo find bootstrap/cache -type f -exec chmod 664 {} \;
setfacl -R -m u:myuser:rwx storage bootstrap/cache if your host uses ACLs.Step 3 – Optimize Supervisor Config
[program:laravel-queue]
process_name=%(program_name)s_%(process_num)02d
command=/usr/local/bin/php /home/myuser/myproject/artisan queue:work redis --sleep=3 --tries=3 --timeout=90
autostart=true
autorestart=true
user=myuser
numprocs=3
redirect_stderr=true
stdout_logfile=/home/myuser/logs/laravel-queue.log
stopwaitsecs=360
Step 4 – Reload Services
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl restart laravel-queue:*
VPS or Shared Hosting Optimization Tips
- Enable Redis:* Use
php artisan queue:work redisinstead of database drivers. - PHP‑FPM pool size:* Set
pm.max_childrento ~(CPU cores * 2) + 1for Laravel jobs. - OPcache:* In
php.inisetopcache.enable=1andopcache.memory_consumption=256. - Swap file:* On low‑memory VPS create a 2GB swap to avoid OOM kills.
- Cloudflare page rules:* Cache static assets, ignore
/api/*to keep queue endpoints fast.
Real World Production Example
Acme SaaS runs a Laravel 10 API on a 2‑CPU, 4 GB cPanel VPS. After applying the steps above, job failures dropped from 12 % to under 0.2 % over a 30‑day period. The average queue latency went from 45 seconds to 6 seconds.
Before vs After Results
| Metric | Before | After |
|---|---|---|
| Job Fail Rate | 12 % | 0.2 % |
| Avg. Latency | 45 s | 6 s |
| CPU Usage (peak) | 85 % | 62 % |
Security Considerations
- Never run
chmod 777onstorage—use the group‑write model shown. - Restrict MySQL user to
SELECT, INSERT, UPDATE, DELETEon the queue tables only. - Enable
APP_ENV=productionandAPP_DEBUG=falseafter testing. - Use Fail2Ban to block repeated SSH attempts on the VPS.
Bonus Performance Tips
- Deploy
php artisan horizonfor a visual dashboard and auto‑scaling. - Set Redis
maxmemory-policy allkeys-lruto keep hot jobs in memory. - Use Composer
--optimize-autoloader --no-devin CI/CD pipelines. - Enable HTTP/2 on Nginx/Apache for faster API responses.
- Consider Dockerizing the queue worker for isolated environment control.
FAQ
Q: My queue still crashes after the fix, what next?
A: Check the syslog for OOM kills, increase swap, or move to a larger VPS. Also verify that php artisan config:cache was run after any .env change.
Q: Can I use the same steps on a shared hosting plan?
A: Yes, but you’ll need to ask the host to increase MySQL timeout and may not have access to Supervisor. Use php artisan queue:work --daemon via cron as a fallback.
Q: Is Horizon required?
A: Not required, but Horizon gives you real‑time metrics, auto‑scaling, and graceful restarts—highly recommended for production.
Final Thoughts
cPanel VPS environments can feel restrictive, but with a few MySQL tweaks, proper permissions, and a clean Supervisor definition you can turn crashing Laravel 10 queue workers into a reliable backbone for your SaaS or WordPress‑powered API.
Take the time to automate these steps in your CI/CD pipeline and you’ll save countless hours of firefighting. Your customers—and your bottom line—will thank you.
Looking for cheap, secure VPS hosting that plays nicely with cPanel and Laravel? Check out Hostinger’s plans – perfect for developers who need performance without breaking the bank.
No comments:
Post a Comment