You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置AWS CodePipeline系列服务部署Laravel 8并解决权限报错

问题根本原因

Laravel运行artisan命令时会自动将当前服务器的绝对路径写入bootstrap/cache目录下的缓存文件中,你在CodeBuild环境构建时的工作路径为/codebuild/output/xxx/src,生成的缓存就会写死这个路径,部署到EB后实际运行路径为/var/app/current,Laravel读取旧的缓存路径自然找不到对应目录。

可行解决方案

方案1:构建阶段清理缓存,部署到EB后重新生成(最推荐)

这个方案适配性最强,后续修改路径也不需要调整构建配置:

  1. 修改CodeBuild的buildspec.yml,在build阶段所有artisan命令执行完成后,新增一行清理缓存的命令:
build:
  commands:
    # 保留你原有的所有命令
    - php artisan cache:clear
    # 新增:删除所有生成的路径/配置缓存文件
    - rm -rf bootstrap/cache/*

同时删掉install阶段的chown -R www-data:www-data $CODEBUILD_SRC_DIR/storage和chmod -R 755 $CODEBUILD_SRC_DIR/storage两行,CodeBuild阶段修改权限无效,EB部署后会重置文件归属。

  1. 在你的Laravel项目根目录新增EB部署钩子:
    • 新建目录结构.platform/hooks/postdeploy/
    • 在该目录下新建01_laravel_init.sh文件,内容如下:
#!/bin/bash
# 进入EB上的应用实际运行目录
cd /var/app/current
# 重新生成适配EB路径的缓存
php artisan config:cache
php artisan route:cache
php artisan view:cache
# 修正权限,EB PHP平台的运行用户为webapp
chown -R webapp:webapp storage bootstrap/cache
chmod -R 755 storage bootstrap/cache
  • 给这个脚本加可执行权限:chmod +x .platform/hooks/postdeploy/01_laravel_init.sh,之后提交到代码库即可。

方案2:强制指定Laravel根路径

直接在代码层固定根路径,不需要调整构建和部署流程:

  1. 在你的.env.staging文件中新增配置:
APP_BASE_PATH=/var/app/current
  1. 修改bootstrap/app.php文件,在返回$app实例前新增一行代码:
$app->useBasePath(env('APP_BASE_PATH', __DIR__.'/../'));

之后Laravel会强制使用配置的根路径,不会读取构建时生成的路径缓存。

方案3:CodeBuild使用和EB一致的构建路径

直接在构建阶段切换到EB的路径下执行所有操作,缓存生成的路径和运行路径一致:
修改buildspec.yml的install阶段最开头新增两行命令:

install:
  commands:
    # 新增:将代码移动到和EB一致的路径下,切换工作目录
    - mv $CODEBUILD_SRC_DIR /var/app/current
    - cd /var/app/current
    # 保留你原有的所有install阶段命令

额外注意事项

  • 建议将php artisan migrate和php artisan db:seed放到EB的predeploy钩子中执行,避免CodeBuild网络无法连接RDS导致构建失败。
  • 生产环境不要开启调试模式,避免敏感信息泄露。

内容的提问来源于stack exchange,提问作者RDD Brian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 08:45:03