必须创建 public 目录并重定向 assets,新建 scf_bootstrap 文件(含可执行权限),将 storage_path 相关路径全部指向 /tmp,否则会 404 或 permission denied。

你想把本地开发好的 Laravel 项目,不改代码、不调环境、不踩权限坑,直接推到云端跑起来?Serverless 平台的 Web Function 模板能跳过服务器运维,但必须满足启动约束和路径限制,否则函数会冷启动失败或 502 报错。
确认本地项目结构合规
打开终端,进入你的 Laravel 项目根目录,执行:
ls -la | grep -E "^(scf_bootstrap|public|bootstrap|app|config)"
确保能看到 【public】 目录(Web 入口)、【bootstrap/app.php】(应用实例入口)和 【config/】(配置中心)。如果缺失 public 目录,说明你用的是 Laravel 12+ 的新结构——它默认把 public 移到了根下,但 Serverless 模板仍依赖传统路径,此时必须手动创建 public 目录,并把 index.php 和 assets 重定向过去。
这一步不做,后续部署时请求根本进不了 Laravel 路由层,所有 URL 都返回 404。
注入 Serverless 启动引导文件
在项目根目录新建文件:
touch scf_bootstrap
用 vim 或 VS Code 打开它,写入以下内容:
#!/bin/bash
export APP_ENV=production
export APP_DEBUG=false
export SERVERLESS=1
php artisan serve --host 0.0.0.0 --port $PORT --no-interaction &
wait
【必须给 scf_bootstrap 加上可执行权限】:chmod +x scf_bootstrap。没这步,函数运行时会报 “Permission denied” 并退出。
注意:$PORT 是 Serverless 平台自动注入的环境变量,不能硬编码为 9000;--no-interaction 确保 artisan 不卡在交互式提示上;& 后加 wait 是让 Bash 进程挂住,防止主进程退出导致函数被回收。
重定向写入路径至 /tmp
编辑 config/filesystems.php,在 'local' 磁盘配置里修改 root 值:
'local' => [
'driver' => 'local',
'root' => '/tmp/storage/app',
],
再检查 storage_path() 是否被硬编码在任何地方——比如日志路径、缓存路径、session 文件路径。Laravel 默认写入 storage/ 目录,但 Serverless 环境中只有 /tmp 可写,其他路径一写就 Permission denied。
重点改三处:
① config/logging.php 中 'path' => '/tmp/storage/logs/laravel.log'
② config/cache.php 中 'store' => 'file' 对应的 'path' => '/tmp/storage/framework/cache/data'
③ config/session.php 中 'files' => '/tmp/storage/framework/sessions'
漏改任意一处,artisan 命令会卡死,或访问时抛出 “file_put_contents(): failed to open stream: Permission denied”。
打包并上传部署
方法一:控制台模板一键部署
1. 登录 Serverless 控制台 → 函数服务 → 新建 → 模板创建
2. 搜索 WebFunc → 选择 Laravel 框架模板 → 下一步
3. 在代码来源中选择“上传 ZIP 包”,将整个项目压缩(不含 .git、.env、node_modules)→ 完成
方法二:CLI 快速推送(推荐)
安装 scf cli 工具后,执行:
scf deploy --region ap-guangzhou --namespace default --name laravel-prod --code ./ --runtime php8.2
上传成功后,进入触发管理页,复制生成的 URL,浏览器直接打开——看到 Laravel 的欢迎页即表示部署完成。











