首页主机资讯Linux服务器上Laravel如何实现自动化运维

Linux服务器上Laravel如何实现自动化运维

时间2026-01-20 09:28:03发布访客分类主机资讯浏览965
导读:Linux服务器上 Laravel 自动化运维落地方案 一 自动化部署流水线 基础准备 服务器具备:Linux、Nginx/Apache、PHP-FPM、Git、Composer、数据库(如 MySQL/PostgreSQL)。 配...

Linux服务器上 Laravel 自动化运维落地方案


一 自动化部署流水线

  • 基础准备

    • 服务器具备:LinuxNginx/ApachePHP-FPMGitComposer数据库(如 MySQL/PostgreSQL)。
    • 配置 SSH 免密登录:本地生成密钥并将公钥加入服务器的 ~/.ssh/authorized_keys,便于无交互拉取代码与执行远程命令。
    • Web 服务指向 Laravel 的 public 目录,Nginx 典型配置包含:root 指向 /path/to/laravel/public;location 使用 try_files $uri $uri/ /index.php?$query_string;PHP 处理使用 fastcgi_pass(如 unix:/var/run/php/php8.1-fpm.sock127.0.0.1:9000)。
  • 零停机部署脚本示例(支持回滚)

    • 目录约定:/var/www/laravel/current(软链)、/var/www/laravel/releases/{ timestamp} 、/var/www/laravel/shared/storage
    • 核心流程:拉取代码 → 安装依赖 → 创建/更新软链 → 发布 .env 与 storage → 权限修复 → 迁移与优化 → 重启 FPM(避免重启 Nginx)

    deploy.sh

    #!/usr/bin/env bash
    set -e
    
    APP_DIR="/var/www/laravel"
    REPO_URL="git@github.com:org/repo.git"
    BRANCH="${
    1:-main}
    "
    TIME=$(date +%Y%m%d%H%M%S)
    RELEASE="$APP_DIR/releases/$TIME"
    CURRENT="$APP_DIR/current"
    SHARED="$APP_DIR/shared"
    ARTISAN="$RELEASE/artisan"
    
    # 1) 拉取代码
    git clone --depth 1 --branch "$BRANCH" "$REPO_URL" "$RELEASE"
    
    # 2) 安装依赖
    cd "$RELEASE"
    composer install --no-interaction --prefer-dist --optimize-autoloader
    
    # 3) 共享文件与目录
    mkdir -p "$SHARED/storage/app/public" "$SHARED/storage/framework/cache" \
             "$SHARED/storage/framework/sessions" "$SHARED/storage/framework/views" "$SHARED/log"
    rm -rf "$RELEASE/storage"
    ln -nfs "$SHARED/storage" "$RELEASE/storage"
    ln -nfs "$SHARED/.env" "$RELEASE/.env"
    
    # 4) 权限(按实际用户/组调整)
    chown -R www-data:www-data "$RELEASE"
    find "$RELEASE" -type f -exec chmod 644 {
    }
         \;
    
    find "$RELEASE" -type d -exec chmod 755 {
    }
         \;
        
    chmod -R 775 "$RELEASE/storage" "$RELEASE/bootstrap/cache"
    
    # 5) 切换版本
    ln -nfs "$RELEASE" "$CURRENT"
    
    # 6) 数据库与缓存
    php "$ARTISAN" migrate --force
    php "$ARTISAN" config:cache
    php "$ARTISAN" route:cache
    php "$ARTISAN" view:cache
    php "$ARTISAN" storage:link
    
    # 7) 重启 PHP-FPM(避免重启 Nginx)
    systemctl reload php-fpm || systemctl restart php-fpm
    
    echo "Deployed $TIME ->
         $CURRENT"
    
    • 回滚示例:ln -nfs “$APP_DIR/releases/< 上一版本时间戳> ” “$CURRENT” & & systemctl reload php-fpm。
  • CI/CD 与 Webhook

    • GitHub Actions 示例(推送到 main 分支触发):
      name: Deploy
      on:
        push:
          branches: [ main ]
      jobs:
        deploy:
          runs-on: ubuntu-latest
          steps:
            - uses: actions/checkout@v4
            - name: Setup PHP
              uses: shivammathur/setup-php@v2
              with:
                php-version: '8.1'
            - name: Install deps
              run: composer install --no-interaction --prefer-dist --optimize-autoloader
            - name: Deploy via SSH
              uses: appleboy/ssh-action@v1
              with:
                host: ${
      {
       secrets.HOST }
      }
      
                username: ${
      {
       secrets.USER }
      }
      
                key: ${
      {
       secrets.SSH_KEY }
      }
          
                script: |
                  cd /var/www/laravel &
          &
       bash deploy.sh ${
      {
       github.ref_name }
      }
          
      
    • 轻量替代:在仓库配置 Webhook,服务器用极简服务(如 webhook)接收 push 事件并调用 deploy.sh。
  • 平台化运维

    • 使用 Laravel Forge 管理服务器与站点,支持一键创建服务器、基于 SSH/Git 的部署、监控与备份,适合团队少运维负担、快速交付。

二 定时任务与队列的自动化

  • 任务调度(Laravel Scheduler)

    • 在服务器添加单一 Cron 入口(每分钟触发调度器,由 Laravel 判断执行哪些任务):
      * * * * * cd /var/www/laravel/current &
          &
           php artisan schedule:run >
          >
           /dev/null 2>
          &
      1
      
    • app/Console/Kernel.php 定义计划任务:
      protected function schedule(Schedule $schedule)
      {
          
          $schedule->
          command('emails:send --force')->
          daily();
          
          $schedule->
          job(new Heartbeat)->
          everyFiveMinutes();
          
          $schedule->
          exec('node /home/forge/script.js')->
          daily();
      
      }
          
      
    • 可按需设置时区、工作日、特定时间窗等约束,便于精细化运行窗口。
  • 队列工作进程(异步任务)

    • 配置 Supervisor 守护队列进程(示例):
      [program:laravel-worker]
      process_name=%(program_name)s_%(process_num)02d
      command=php /var/www/laravel/current/artisan queue:work --queue=default --tries=3 --sleep=3
      autostart=true
      autorestart=true
      user=www-data
      numprocs=2
      redirect_stderr=true
      stdout_logfile=/var/www/laravel/worker.log
      
    • 发布/回滚后,建议重启队列以加载新代码:supervisorctl restart laravel-worker:*。

三 安全与可观测性要点

  • 安全加固
    • 使用 非 root 部署用户(如 www-data),通过 sudo 精细化授权;.env 与 storage 放在 共享目录,代码目录不可写;严格限制 .envstorage 的访问权限;对外仅暴露 public 目录;定期更新系统、PHP、Composer 与依赖包,修补漏洞。
  • 日志与监控
    • 统一收集 Nginx access/errorPHP-FPM 慢日志Laravel 应用日志队列日志;为关键业务设置 监控与告警(如队列积压、异常率、磁盘/内存阈值);定期审计部署记录与回滚历史,确保可追溯。

四 一键清单与常见坑

  • 一键清单
    • 准备服务器与 SSH 免密、配置 Nginx → public、安装 PHP-FPM/Composer/Git
    • 建立部署用户与目录结构(releases/current/shared),准备 deploy.sh回滚 流程。
    • 配置 GitHub Actions/GitLab CIWebhook 触发部署;在服务器添加 Scheduler CronSupervisor 守护队列。
    • 接入 日志与监控/告警,制定备份与回滚预案。
  • 常见坑与规避
    • 直接修改 current 目录导致回滚困难 → 使用 时间戳 releases + 软链 管理版本。
    • 忘记执行 storage:link 或 .env 未共享 → 部署脚本中显式处理共享资源。
    • 权限错误导致写入失败 → 统一 www-data 与目录权限策略。
    • 生产环境误开启 APP_DEBUG=true → 部署脚本或 CI 中强制为 false
    • 队列堆积或进程异常 → 使用 Supervisor 自动拉起并设置合理并发与重试。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Linux服务器上Laravel如何实现自动化运维
本文地址: https://pptw.com/jishu/786958.html
Laravel在Linux中如何实现API接口优化 Linux环境下Laravel如何实现缓存策略

游客 回复需填写必要信息