Ubuntu 上提升 Laravel 性能的实操清单
一 基础环境优化
- 启用并正确配置 PHP-FPM:安装对应版本(如 sudo apt install php-fpm),在 /etc/php/{version}/fpm/pool.d/www.conf 中设置运行用户为 www-data,按需调整进程模型与数量(见下文),修改后执行 sudo systemctl restart php{version}-fpm。
- 配置 Nginx 代理 PHP:在站点配置中确保 location ~ .php$ 使用 fastcgi_pass unix:/run/php/php{version}-fpm.sock;,并设置 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;,测试配置 sudo nginx -t 后重载 sudo systemctl reload nginx。
- 启用 OPcache(生产环境强烈建议):在 php.ini 中开启 opcache.enable=1,设置 opcache.memory_consumption=256,生产环境关闭时间戳检查 opcache.validate_timestamps=0,重启 PHP-FPM 生效。
- 应用环境:将 .env 的 APP_ENV=production、APP_DEBUG=false,避免调试开销。
二 PHP-FPM 与进程调优
- 进程模型选择:
- static:适合稳定高并发,设置 pm = static,将 pm.max_children 设为约 CPU 核心数 × 4(需结合内存与实测微调)。
- dynamic:适合流量波动,设置 pm.start_servers / pm.min_spare_servers / pm.max_spare_servers 以平滑应对峰值。
- 稳定性设置:将 pm.max_requests 设为 500~1000,定期回收进程,缓解潜在内存泄漏影响。
- 重载生效:每次修改 pool.d/www.conf 后执行 sudo systemctl restart php{version}-fpm。
三 Laravel 应用层优化
- 配置与路由缓存:执行 php artisan config:cache、php artisan route:cache、php artisan view:cache,减少文件 I/O 与解析开销。
- Composer 优化:执行 composer dump-autoload --optimize,优化类映射加载。
- 缓存驱动:将 CACHE_DRIVER=redis、SESSION_DRIVER=redis,提升缓存读写性能。
- 队列异步:将耗时任务(邮件、导入等)放入队列,配置 QUEUE_CONNECTION=redis 并启动 php artisan queue:work --daemon。
- 查询优化:避免 N+1,使用 with() 预加载;大数据列表使用 分页;必要时使用 缓存查询结果。
- 前端与传输:运行 npm run production 压缩资源;启用 HTTP/2 与 Gzip;静态资源使用 CDN。
- 进阶方案:对长生命周期进程与极低冷启动需求,可考虑 Laravel Octane 进一步提升吞吐。
四 数据库与 Redis 优化
- 安装与连接 Redis:在 Ubuntu 上执行 sudo apt install redis-server 并启动;在 .env 设置 REDIS_HOST=127.0.0.1、REDIS_PORT=6379。
- 作为缓存与会话后端:在 .env 设置 CACHE_DRIVER=redis、SESSION_DRIVER=redis,Laravel 配置 config/cache.php 与 config/session.php 使用 redis 驱动。
- 缓存使用模式:用 Cache::remember(‘key’, 60, fn() => …) 缓存查询结果;在 Blade 中用 @cache(‘key’) … @endcache 缓存片段;页面级缓存可按需采用。
- 队列驱动:将 config/queue.php 的 default 设为 redis,分发任务 SendEmail::dispatch($user),通过 queue:work 异步处理。
五 网络与系统层面优化
- 高并发网络参数(谨慎调整并观察):在 /etc/sysctl.conf 中增加
- net.ipv4.tcp_tw_reuse=1、net.ipv4.tcp_fin_timeout=30、net.ipv4.tcp_keepalive_time=1200
- net.ipv4.ip_local_port_range=10240 60999、net.ipv4.tcp_max_syn_backlog=8192、net.ipv4.tcp_max_tw_buckets=5000
执行 sudo sysctl -p 生效。
- 文件句柄限制:在 /etc/security/limits.conf 增加
- * soft nofile 655360、* hard nofile 655360
重新登录或重启后生效。
- 监控与定位:开发环境可临时使用 Laravel Debugbar 或 Blackfire 定位慢查询与热点路径;生产环境避免暴露调试工具。