在共享主机上部署 Laravel(无需 SSH)
Source: Dev.to

为什么在共享主机上部署 Laravel 与众不同
1. 项目文件结构
一个典型的 Laravel 项目结构如下:
project/
├── app/
├── bootstrap/
├── config/
├── public/
├── storage/
├── vendor/
└── artisan
然而,共享主机通常只暴露一个公共目录:
├── public_html/
2. 没有 SSH,无法使用命令
如果 没有 SSH 访问权限,你将无法:
- 安装 Composer 依赖
- 构建资源(
npm run …) - 运行迁移
- 清理或优化缓存
如何解决此情况 – 步骤指南
步骤 1:在本地准备您的应用程序
将 Laravel 项目克隆为一个生产就绪的副本,以免影响开发环境:
├── laravel_app/
├── laravel_app_prod/
在 laravel_app_prod 中,为生产环境准备应用程序:
# 清理缓存
php artisan config:clear
php artisan cache:clear
php artisan route:clear
php artisan view:clear
# 安装生产依赖并进行优化
composer install --no-dev --optimize-autoloader
# 构建前端资源
npm run build
步骤 2 – 重新组织项目文件结构
为匹配共享主机的目录结构,只将 public/ 文件夹的内容移动到新的 public_html/ 文件夹中:
public_html/
handleRequest(Illuminate\Http\Request::capture());
重要提示: 路径错误会导致 500 错误。
步骤 4 – 使用 cPanel 设置数据库
- 在 cPanel 中打开 MySQL Database Wizard。
- 创建一个数据库。
- 创建数据库用户并授予 ALL PRIVILEGES(全部权限)。
随后在 laravel_app_prod 中更新 .env 文件:
APP_NAME=MyApp
APP_ENV=production
APP_DEBUG=false # 非常重要(安全)
APP_URL=https://your-app-domain
DB_DATABASE=database_name
DB_USERNAME=database_user
DB_PASSWORD=database_password
⚠️ 切勿在生产环境中启用
APP_DEBUG=true。
步骤 5 – 临时部署路由(令牌保护)
由于没有 SSH,您可以通过 受保护的网页路由 暂时执行 Artisan 命令。部署完成后请立即删除此路由。
-
在
.env中添加一个密钥令牌:DEPLOY_TOKEN=verySecretRandomToken123 -
在
routes/web.php中添加路由:use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Route; Route::get('/deploy/{token}', function ($token) { abort_unless($token === env('DEPLOY_TOKEN'), 403); // 1. 运行迁移并清理缓存 Artisan::call('migrate', ['--force' => true]); Artisan::call('optimize:clear'); // 2. 修复 storage 链接(自定义修复) // 我们使用 $_SERVER['DOCUMENT_ROOT'] 指向 'public_html' 文件夹 $targetFolder = storage_path('app/public'); $linkFolder = $_SERVER['DOCUMENT_ROOT'] . '/storage'; if (!file_exists($linkFolder)) { symlink($targetFolder, $linkFolder); $storageStatus = 'Storage link created successfully.'; } else { $storageStatus = 'Storage link already exists.'; } return "Deployment completed.\nMigrations run.\nCache cleared.\n" . $storageStatus; });
步骤 6 – 将文件上传到服务器
使用 cPanel 文件管理器:
- 将
laravel_app_prod/压缩成 zip。 - 将
public/的内容压缩成 zip。 - 上传两个压缩包:
- 在 public_html 之外 解压
laravel_app_prod。 - 在 public_html 内部 解压公共文件。
- 在 public_html 之外 解压
为什么要把 laravel_app_prod 放在 public_html 之外?
这样可以将核心应用代码置于不被网页直接访问的目录,从而提供重要的安全层。
步骤 7 — 设置关键权限
Laravel 需要对几个文件夹拥有写入权限。如果权限设置不当,日志将无法写入,会话也无法保存。
- 在 cPanel 文件管理器 中,进入
laravel_app_prod/storage。 - 右键 → 更改权限。
- 将权限设为 775(用户:读/写/执行,组:读/写/执行,其他:读/执行)。
- 对
laravel_app_prod/bootstrap/cache重复相同操作。
⚠️ 注意: 切勿将这些文件夹设置为
777。在共享主机上这会构成严重的安全风险。
步骤 8 — 运行迁移并移除部署路由
在浏览器中打开以下 URL(将 your-domain.com 替换为您的实际域名):
https://your-domain.com/deploy/verySecretRandomToken123
如果一切正常,您将看到:
Deployment completed successfully
立即执行以下操作:
- ❗ 删除部署路由。
- ❗ 从
.env中移除DEPLOY_TOKEN。
这些步骤对安全至关重要。
常见问题
500 内部服务器错误
index.php中的文件路径不正确。- PHP 版本错误(使用 cPanel MultiPHP Manager)。
- 文件夹权限不正确(
storage775,bootstrap/cache775)。
403 未授权
DEPLOY_TOKEN与路由令牌不匹配。
最后思考
共享主机并非 Laravel 的理想选择,但它仍然常用于:
- 客户项目
- MVP(最小可行产品)
- 预算受限的部署
通过适当的准备和安全的工作流程,Laravel 应用可以在 不使用 SSH 访问 的情况下可靠运行。
💡 小贴士 – 更安全的数据库替代方案
如果你对通过网页路由运行迁移感到不安(这存在安全风险),可以使用 导出/导入 方法:
- 在 本地 机器上运行迁移。
- 将本地数据库导出为
.sql文件。 - 在服务器的 cPanel → phpMyAdmin 中,直接导入该
.sql文件。
这可以避免在生产路由中执行逻辑代码。
🔗 保持联系
关注我,获取更多 Laravel 教程、开发技巧、部署工作流以及真实的生产解决方案:
- LinkedIn:
- Medium: (并加入我的邮件列表:)
觉得本文有帮助吗?
🙏 通过点赞 👏、订阅 🔔、以及在社交网络分享来支持我们。