轻松部署 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.
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《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 万
私信
所有博文
社区赞助商