温馨提示×

Debian中Laravel性能如何调优

小樊
49
2025-09-19 15:37:05
栏目: 智能运维

1. 系统级基础优化

  • 增加文件描述符限制:Laravel队列和并发请求需要大量文件描述符,通过ulimit -n 65535临时设置,或编辑/etc/security/limits.conf永久生效(添加* soft nofile 65535; * hard nofile 65535)。
  • 调整内核参数:编辑/etc/sysctl.conf,添加net.core.somaxconn = 65535(最大连接队列长度)、net.ipv4.tcp_max_syn_backlog = 65535(SYN队列长度)、net.ipv4.tcp_tw_reuse = 1(复用TIME-WAIT连接),运行sysctl -p使配置生效。

2. PHP与扩展优化

  • 启用并配置OPcache:OPcache缓存PHP字节码,减少脚本编译时间。编辑php.ini(如/etc/php/8.2/fpm/php.ini),设置:
    opcache.enable=1
    opcache.memory_consumption=128
    opcache.interned_strings_buffer=8
    opcache.max_accelerated_files=4000
    opcache.revalidate_freq=60
    opcache.enable_cli=1  # 允许CLI使用
    
  • 优化PHP-FPM配置:编辑/etc/php/8.2/fpm/pool.d/www.conf,调整进程管理为dynamic(动态调整进程数),设置:
    pm = dynamic
    pm.max_children = 50  # 最大子进程数(根据服务器内存调整,每进程约消耗100MB内存)
    pm.start_servers = 5  # 启动时的进程数
    pm.min_spare_servers = 5  # 最小空闲进程数
    pm.max_spare_servers = 35  # 最大空闲进程数
    request_terminate_timeout = 30  # 请求超时时间(秒)
    
    运行systemctl restart php8.2-fpm生效。

3. Laravel框架配置优化

  • 开启生产模式缓存:在.env中设置APP_ENV=productionAPP_DEBUG=false,禁用调试模式。运行以下Artisan命令缓存配置、路由和视图,减少每次请求的解析开销:
    php artisan config:cache
    php artisan route:cache
    php artisan view:cache
    

    注意:开发环境不要启用缓存,否则修改配置后不会立即生效。

  • 选择高性能缓存驱动:推荐使用Redis(支持丰富数据结构和持久化),编辑.env设置:
    CACHE_DRIVER=redis
    SESSION_DRIVER=redis
    QUEUE_CONNECTION=redis
    
    安装Redis扩展:composer require predis/predis(或phpredis扩展)。

4. 数据库性能优化

  • 添加索引优化查询:为常用查询字段(如users.emailorders.user_id)添加索引,使用Schema::table方法或在迁移文件中定义:
    Schema::table('users', function (Blueprint $table) {
        $table->index(['email', 'created_at']);  # 复合索引
    });
    
  • 避免N+1查询问题:使用Eloquent的with方法预加载关联数据,例如:
    $users = User::with('posts')->get();  // 一次性获取用户及关联的文章
    
    使用DB::listen监听慢查询(如超过100ms),通过Laravel Telescope或日志分析优化:
    DB::listen(function ($query) {
        Log::info($query->sql, $query->bindings, $query->time);
    });
    
  • 分页处理大数据:对大量数据使用paginate()方法,避免一次性加载所有数据:
    $articles = Article::paginate(20);  // 每页20条
    

5. 队列系统优化(处理耗时任务)

  • 选择高性能队列驱动:推荐Redis(支持队列持久化和高并发),编辑.env设置:
    QUEUE_CONNECTION=redis
    
  • 使用Supervisor管理队列进程:Supervisor确保队列进程崩溃后自动重启。安装Supervisor:sudo apt-get install supervisor,创建配置文件/etc/supervisor/conf.d/laravel-worker.conf
    [program:laravel-worker]
    process_name=%(program_name)s_%(process_num)02d
    command=php /var/www/laravel/artisan queue:work --sleep=3 --tries=3 --daemon
    autostart=true
    autorestart=true
    user=www-data
    numprocs=4  # 进程数(根据CPU核心数调整,如4核可设4)
    redirect_stderr=true
    stdout_logfile=/var/www/laravel/storage/logs/worker.log
    
    运行以下命令启动Supervisor:
    sudo supervisorctl reread
    sudo supervisorctl update
    sudo supervisorctl start laravel-worker:*
    
  • 优化任务处理:为任务设置合理的tries(重试次数,如3次)和timeout(超时时间,如30秒),避免长时间占用队列进程。对于高优先级任务,使用onQueue方法设置优先级:
    dispatch((new SendWelcomeEmail())->onQueue('high'));
    

6. 前端与静态资源优化

  • 合并与压缩资源:使用Laravel Mix将CSS、JavaScript文件合并并压缩,减少HTTP请求。编辑webpack.mix.js
    mix.js('resources/js/app.js', 'public/js')
       .sass('resources/sass/app.scss', 'public/css')
       .version();  // 版本控制,避免缓存问题
    
    运行npm run prod生成优化后的文件。
  • 启用Gzip压缩:在Nginx配置中添加gzip on;,压缩静态资源(如CSS、JS、HTML),减少传输大小:
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    
  • HTTP缓存:为静态资源设置expires头,让浏览器缓存文件,减少重复请求:
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 365d;
        add_header Cache-Control "public";
    }
    

7. 监控与持续优化

  • 使用监控工具:通过Laravel Telescope监控应用性能(如查询时间、队列任务、请求响应时间),或使用New Relic、Datadog等第三方工具监控服务器资源(CPU、内存、磁盘IO)。
  • 日志管理:配置Laravel日志级别(如error级别),避免记录过多调试信息,定期清理日志文件(如使用logrotate),防止日志过大占用磁盘空间。

0