在共享主机上部署 Laravel(无需 SSH)

发布: (2026年2月7日 GMT+8 20:04)
7 分钟阅读
原文: Dev.to

Source: Dev.to

部署 Laravel 于共享主机(无需 SSH)封面图

为什么在共享主机上部署 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 设置数据库

  1. 在 cPanel 中打开 MySQL Database Wizard
  2. 创建一个数据库。
  3. 创建数据库用户并授予 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 命令。部署完成后请立即删除此路由

  1. .env 中添加一个密钥令牌:

    DEPLOY_TOKEN=verySecretRandomToken123
  2. 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 文件管理器

  1. laravel_app_prod/ 压缩成 zip。
  2. public/ 的内容压缩成 zip。
  3. 上传两个压缩包:
    • public_html 之外 解压 laravel_app_prod
    • public_html 内部 解压公共文件。

为什么要把 laravel_app_prod 放在 public_html 之外?
这样可以将核心应用代码置于不被网页直接访问的目录,从而提供重要的安全层。

步骤 7 — 设置关键权限

Laravel 需要对几个文件夹拥有写入权限。如果权限设置不当,日志将无法写入,会话也无法保存。

  1. cPanel 文件管理器 中,进入 laravel_app_prod/storage
  2. 右键 → 更改权限
  3. 将权限设为 775(用户:读/写/执行,组:读/写/执行,其他:读/执行)。
  4. 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)。
  • 文件夹权限不正确(storage 775,bootstrap/cache 775)。

403 未授权

  • DEPLOY_TOKEN 与路由令牌不匹配。

最后思考

共享主机并非 Laravel 的理想选择,但它仍然常用于:

  • 客户项目
  • MVP(最小可行产品)
  • 预算受限的部署

通过适当的准备和安全的工作流程,Laravel 应用可以在 不使用 SSH 访问 的情况下可靠运行。

💡 小贴士 – 更安全的数据库替代方案

如果你对通过网页路由运行迁移感到不安(这存在安全风险),可以使用 导出/导入 方法

  1. 本地 机器上运行迁移。
  2. 将本地数据库导出为 .sql 文件。
  3. 在服务器的 cPanel → phpMyAdmin 中,直接导入该 .sql 文件。

这可以避免在生产路由中执行逻辑代码。

🔗 保持联系

关注我,获取更多 Laravel 教程、开发技巧、部署工作流以及真实的生产解决方案:

  • LinkedIn:
  • Medium: (并加入我的邮件列表:)

觉得本文有帮助吗?

🙏 通过点赞 👏、订阅 🔔、以及在社交网络分享来支持我们。

0 浏览
Back to Blog

相关文章

阅读更多 »