zzxworld

使用虚拟主机部署 Laravel 项目的体验

几个月前,手头有一个小项目准备上线。出于省钱和省事两方面的考虑,我购买了一台虚拟主机。目前来看,这是一个相当「鸡肋」的选择。至于原因,请参阅这篇在虚拟主机上折腾 Laravel 的总结。

首先给不熟悉虚拟主机的朋友做个简单的介绍。这应该说是一种十分古老的服务器托管产品。对我来说,可以追溯到十多年前刚开始学习网站制作技术的时候。那时完成的项目要部署到线上,除了昂贵的物理服务器,就只剩下这一种选择。

和云服务器相比,虚拟主机不提供可登录的系统帐号,所以也无法自由的安装各种软件和服务。一切都是固定好了的,比如开发语言你只能选择 PHP 或者是 ASP,PHP 的版本和扩展可能也是固定的,包括可使用的存储空间。稍微高级一点的套餐,会提供 MySQL 之类的独立数据库。当然,数据可存储大小也是固定的。

在以上前提下,使用虚拟主机部署一个完整项目的流程基本就一件事:上传代码。所以虚拟主机通常只提供一个 FTP 帐号和密码。这意味着各种「现代化」的部署流程完全无法应用到这样一件「上古」产品之上。

不过也不是完全没有好处。比如我上面提到的「省钱」和「省事」。

省事这方面就不提了,从上面的介绍就能看出,虚拟主机没有太多可折腾的余地。至于省钱,拿我购买的这台虚拟主机举例。独享 1G 内存,外加 5M 峰值带宽的配置一年的价格为 294 元。选择同服务商下 1G 内存, 仅 1M 带宽的云服务器,价格就要 775 元左右。如果带宽加到 5M,价格直逼 2000。

我准备部署在这个虚拟主机上的项目原本是基于 WordPress,云服务器能提供的一些优点和虚拟主机比起来并无太大价值,所以当时选择购买这样一台虚拟主机看起来合情合理。但后面随着项目的深入,发现用 WordPress 有点不太合适了,需要用 Laravel 框架来开发更多自定义功能。这时候就感觉到虚拟主机的不便之处了。

首当其冲的就是代码上传。之前用 WordPress 的时候,因为不牵涉自己写代码,所以用 FTP 工具上传一次代码就能搞定。但用 Laravel 框架开发就不一样了,随时在添加和完善功能,也需要随时上传代码。这个频率大到让我使用界面端 FTP 软件操作感到繁琐的地步。不过好在使用的是 FTP,为了降低代码发布的操作频率,我写了个 Shell 脚本。

由于 Laravel 框架的特殊性,这个脚本没有想象中的轻松。

比如为了避免把本地开发环境下的一些临时或缓存文件无意中传到线上,使用了 git archive 命令来导出需要发布的代码。这时就需要注意一些没被跟踪但需要上传的文件,要加入到上传队列中。比如 .env

.env 是 Laravel 框架下区分环境配置的重要文件。开发环境和线上环境完全不同,所以本地需要保留一份供上传使用的原本。

另外出于性能考虑,线上的 Laravel 环境最好通过 artisan config:cacheartisan route:cacheartisan view:cache 命令把配置,路由和视图都缓存一下。但虚拟主机不支持系统帐号登录,所以这些命令也无法在线上执行,只能在本地先执行好,然后再发布到线上。这步操作需要注意的地方有两点:

  1. 本地执行以上命令前先把项目用的 .env 文件切换为线上配置。
  2. artisan config:cache 命令执行完成后,需要把缓存内容中的本地路径替换为线上的。

至于通过 Composer 安装的第三方依赖,同样也是需要把 vendor 目录上传到线上。如果引用了本地的 Laravel 扩展包,还需要记得把 vendor 目录中的软链接替换为实际的代码目录。

注意了以上事项,基本就能在虚拟主机上正常运行 Laravel 项目了。看起来好像也没什么,可也折腾了我半天时间。

总的来说,在使用 CMS 这类现成代码项目的前提下,虚拟主机会是一个省钱省事的选择。但如果是有着频繁的开发和复杂的打包流程项目,就不太建议选择。我这次是本着买了不用也是浪费的原因折腾了一番,以后还是宁愿多花点钱上云服务器。