轻松部署 Laravel 应用 | 《08. 手动部署 - 部署应用代码》

:clap: 本系列持续更新中,欢迎关注:https://github.com/wi1dcard/laravel-deploy...

由于课程上下文关联比较紧密,在开始前请先阅读 本文

你的支持是我写作的动力;关注我的客官们,请在右上角点个赞,将会让文章在首页展示,帮助更多人。

感谢 :clap: !

在上一节,我们终于安装好了基本运行环境,是时候将代码部署到服务器上了。

使用 Git 拉取项目(HTTPS 协议)

目前几乎所有的 Laravel 开发者都会使用 Git 作为版本控制系统,而常见的 Git 仓库托管平台 GitHub、GitLab、Gitea,以及国内的 Gitee、Coding 等,几乎都支持两种常见的传输协议 —— SSH 和 HTTPS。由于使用 SSH 协议通常需额外配置,本节我们先尝试 HTTPS 协议。

首先,我们需要得到 Git 仓库的地址。以 GitHub 为例,在浏览器内打开仓库页面,点击绿色的 Clone or download 按钮,选择弹出框内的 Use HTTPS

确保链接为 HTTPS 协议,点击复制:

记住此链接,稍后需要使用。接下来请登录到服务器,执行:

$ cd /var/www/

cd 命令用于切换当前工作目录,/var/www 是 Nginx 默认的站点存放目录。

随后便可以将仓库克隆到本地了:

$ git clone https://github.com/wi1dcard/hello-deployment.git deployment

提示:若仓库包含大量提交历史,以上命令可能耗时较久;你可以尝试使用 --depth 选项来优化,详情请搜索 Git 浅克隆 等关键字。

请将命令中的 URL 替换为刚刚从 GitHub 或其它仓库托管平台内复制的链接。末尾的 deployment 参数表示将此仓库克隆至当前工作目录下的 deployment 子目录内。

稍等将会出现以下输出:

Cloning into 'hello-deployment'...
remote: Enumerating objects: 130, done.
remote: Counting objects: 100% (130/130), done.
remote: Compressing objects: 100% (95/95), done.
remote: Total 130 (delta 50), reused 105 (delta 32), pack-reused 0
Receiving objects: 100% (130/130), 2.73 MiB | 850.00 KiB/s, done.
Resolving deltas: 100% (50/50), done.
Checking connectivity... done.

如果你的项目是「私有」的,那么可能需要输入用户名和密码:

Cloning into 'hello-deployment'...
Username for 'https://github.com': <输入你的用户名>
Password for 'https://wi1dcard@github.com': <请输入你的密码>

提示:还记得之前提到的吗?密码输入是不可见的。

使用 Composer 安装依赖

首先,请切换至 deployment 目录内:

$ cd deployment

接着执行:

$ composer install

稍等片刻,你可能会看到这样的警告:

Failed to download foo/bar from dist: The zip extension and unzip command are both missing, skipping.
Now trying to download from source

意为 PHP Zip 扩展和 unzip 命令均找不到,此时 Composer 会尝试从依赖的 Git 仓库内直接克隆源码,这是不推荐的;因此我们使用 Ctrl + C(macOS 为 Cmd + C)中止正在运行的命令。

针对该警告信息,可以想到两种解决思路:

  • 使用之前小节提到的 apt-cache search 搜索 php zip 关键字,查找 Zip 扩展并安装。
  • 安装 unzip 命令。

第一种方法本节不再赘述,我们来尝试第二种方法。首先,尝试手动执行 unzip,确认它的确未安装:

$ unzip
The program 'unzip' is currently not installed. You can install it by typing:
apt install unzip

看样子在当前系统中确实找不到 unzip。不过,贴心的 APT 帮我们找到了包含 unzip 的软件包,并直接提供了安装命令:

$ apt install unzip

稍等片刻便安装好了。此时再次执行:

$ unzip
UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.
...

完美。

实际上,不仅是 Composer,其它多数命令都支持使用 Ctrl + C 中止运行;如果 Ctrl + C 无效,你也可以试试 Ctrl + D;另外,结合 APT 的提示和 apt-cache search,可以帮助我们很快地解决绝大多数命令缺失的错误,而无需遵从百度来的手动而又复杂的源码编译步骤。

我们回到主题,再次运行 composer install

Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Package operations: 72 installs, 0 updates, 0 removals
  - Installing dragonmantank/cron-expression (v2.2.0): Downloading (100%)
  - Installing erusev/parsedown (1.7.1): Downloading (100%)
  - Installing symfony/var-dumper (v4.2.3): Downloading (connecting...)

恭喜,等待安装完毕即可。

配置环境变量

依赖安装完成后,我们还需要将 .env.example 文件复制为 .env 文件,并生成 APP_KEY 密钥:

$ cd /var/www/deployment
$ php -r "file_exists('.env') || copy('.env.example', '.env');"
$ php artisan key:generate --ansi

提示:实际上,以上两条命令都是从部署应用的 composer.json - scripts 小节内摘抄出来的,这也解释了为何使用 laravel new 创建项目后 .env 文件就已经存在。有兴趣可深入了解 Composer Scripts

配置文件所有者

最后,别忘记修改文件所有者:

$ chown -R www-data:www-data .

由于目前所在的工作目录为 /var/www/deployment,所以可用表示当前工作目录的 . 代替之前的 /var/www/deployment,它们是等效的。

至此,本小节目标完成。你可以通过 ll 命令来列出当前目录:

$ ll
total 440
drwxr-xr-x 13 www-data www-data   4096 Mar  9 01:26 ./
drwxr-xr-x  5 root     root       4096 Mar  9 00:49 ../
drwxr-xr-x  6 www-data www-data   4096 Mar  9 00:45 app/
-rw-r--r--  1 www-data www-data   1686 Mar  9 00:45 artisan
...
本作品采用《CC 协议》,转载必须注明作者和本文链接
Former WinForm and PHP engineer. Now prefer Golang and Rust, and mainly working on DevSecOps and Kubernetes.
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 6

请问例如passport那些,要install的,到服务器部署完后要重新手动install一下吗

4年前 评论

@alexxd composer install 的作用就是安装依赖。

4年前 评论
海的幽灵 1年前

@Wi1dcard 安装依赖那个我知道,但是因为有一些插件是需要手动install一下的,例如 php artisan passport:install php artisan admin:install 这些命令。

4年前 评论

@alexxd 你可以看一下一些 Composer 包的 composer.json 里面有定义一些 Scripts,其中 postInstall 等脚本是会在安装之后自动运行,所以我们无需手动操作。而如果没有定义,那么我们就需要手动执行各个扩展包要求的 Install 命令,不过通常情况下这些都是一次性的工作,它们所进行的操作要么是数据库、要么是没有进入版本管理的文件,所以不必担心。

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
67
粉丝
590
喜欢
1235
收藏
1133
排名:13
访问:32.4 万
私信
所有博文
社区赞助商