LNMP - Laravel - Envoy 自动部署

1.应用场景

将系统应用[自动]部署到线上服务器.

2.学习/操作

环境:

阿里云服务器

操作系统: centOS 7.5 

LNMP[Nginx 1.16 + Mysql 8.0 + Php 7.2]

root权限

ssh 远程登录服务器

Navicat连接MySQL服务器[默认Mysql远程登录用户已添加]

Git 仓库管理代码

Github代码托 

Laravel 提供的 Envoy 工具实现代码自动化发布。

 

注:在开始之前,我们假设你已经购买了相应的服务器并且拥有 root 权限进行远程登录和操作。如果只是本着学习目的,新用户可以通过阿里云或腾讯云的云服务器免费试用功能进行测试。

 为了演示应用从开发到上线的完整生命周期,跟随着学院君将刚刚开发好的博客应用上线.

 流程记录如下:

 

1. 设置 ssh 免密码登录远程服务器

1.1  生成私钥公钥文件

如果你的本地主机不包含 ~/.ssh/id_rsa 文件,可以通过运行如下命令生成:

ssh-keygen -t rsa

 

每次执行上述命令后产生的私钥文件都不同,如果 ~/.ssh/id_rsa 文件已经存在,会提示是否覆盖,选择 n 不覆盖,如果该文件不存在则会生成该文件(提示需要输入的地方都可以留空)。

 

运行该命令会生成 ~/.ssh/id_rsa 和 ~/.ssh/id_rsa.pub 两个文件,分别存储私钥和公钥.

 

通过 scp 命令将公钥文件拷贝到远程服务器的 .ssh 目录[使用ls -a查看]下(如果服务器上没有该目录,先创建这个目录):

scp ~/.ssh/id_rsa.pub root@your-server-ip:~/.ssh

记得将命令中的 your-server-ip 换成你的服务器公网 IP. 

 

 

1.2 将公钥添加到授权KEY

登录到远程服务器,运行如下命令将公钥文件内容追加到 ~/.ssh/authorized_keys 文件:

cp id_rsa.pub authorized_keys

接下来,我们在本地主机测试通过 ssh 登录远程服务器:

LNMP - Laravel - Envoy 自动部署_第1张图片

可以使用服务器公网IP或者域名, 这里域名购买且已备案.

如此便可无需输入密码即可登录远程服务器了,很方便.

 

过程截图:

LNMP - Laravel - Envoy 自动部署_第2张图片

LNMP - Laravel - Envoy 自动部署_第3张图片

LNMP - Laravel - Envoy 自动部署_第4张图片

 

2. 在服务器安装 LNMP 环境

LNMP[centOS 7.5 + Nginx 1.16 + Mysql 8.0 + Php 7.2]

https://blog.csdn.net/william_n/article/details/103745147

 

3. composer安装

为了管理 PHP 依赖,还需要安装 Composer:

wget https://getcomposer.org/download/1.9.2/composer.phar 或者https://getcomposer.org/composer.phar  //默认为最新版本
mv composer.phar /usr/local/bin/composer
chmod u+x /usr/local/bin/composer

通过 composer -V 查看是否安装成功:

注:最好为 Composer 配置一个中国镜像。网上资源很多,自行搜索实现。// [推荐阿里镜像]

 

过程截图:

LNMP - Laravel - Envoy 自动部署_第5张图片

LNMP - Laravel - Envoy 自动部署_第6张图片

 

全局配置(推荐)

  • 所有项目都会使用该镜像地址:

    composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/   //截图如下:LNMP - Laravel - Envoy 自动部署_第7张图片

  • 取消配置:

    composer config -g --unset repos.packagist

项目配置

  • 仅修改当前工程配置,仅当前工程可使用该镜像地址:

    composer config repo.packagist composer https://mirrors.aliyun.com/composer/

  • 取消配置:

    composer config --unset repos.packagist

调试

  • composer 命令增加 -vvv 可输出详细的信息,命令如下:

    composer -vvv 

更多操作见: https://blog.csdn.net/william_n/article/details/94445926

4. 安装 NPM

对应的,我们还需要安装 NPM 对前端资源进行管理

 

安装npm  //推荐使用nvm进行node月npm的安装管理,这里暂且不用

//nvm安装: https://github.com/nvm-sh/nvm#installation-and-update

LNMP - Laravel - Envoy 自动部署_第8张图片

 

LNMP - Laravel - Envoy 自动部署_第9张图片

LNMP - Laravel - Envoy 自动部署_第10张图片

可以看到, node与npm 版本较低.

最新稳定版本: node 12.14.0[包含npm 6.13.4]

最新npm版本: 

 LNMP - Laravel - Envoy 自动部署_第11张图片

 

 

安装该工具也会顺便安装 Node.js [由上可知],默认的 NPM 版本比较低,我们可以通过这个命令对其进行升级:

npm install -g npm  

出现报错如下:

LNMP - Laravel - Envoy 自动部署_第12张图片

解决办法: TBD

 

备注:

https://npm.taobao.org/mirrors/npm/?spm=a2c6h.13651104.0.0.492f4915eePYMX  //阿里镜像

 

升级后: //具体操作TBD

5. 安装 Git

我们通过 Git 仓库对代码进行管理,所以还需要安装 Git 客户端工具:

yum install -y git

 

备注:

版本依然很低, 建议升级 具体参见: https://blog.csdn.net/william_n/article/details/80288051

至此,环境和工具都已经准备妥当, 开始项目的代码部署.

 

下面我们将博客代码上传到 Github,通过 Git 仓库来管理代码。

 

6. 将项目代码上传到 Github

参考:

Git 仓库有很多种,可以是 Github 上的公共仓库,也可以是基于 Gitlab 自己搭建的私有仓库,我们以 Github 为例,将代码上传到 Github,以公共 Git 仓库的方式对博客项目代码进行管理。

 

首先在 Github 上创建一个新的仓库,比如我将其命名为 lablog57.test,类型选择为 public,创建完成后,就有了一个地址为

https://github.com/ningxiaofa/blog57.test.git 的远程 Git 仓库。

 

然后在本地项目根目录下通过运行如下命令将项目与上面新建的远程 Github 仓库关联起来:

rm -rf .git  // 如果原来有 .git 目录将其删除
git init
git remote add origin https://github.com/ningxiaofa/blog57.test.git   //这里用的是https方式

 

接下来就可以提交项目代码到远程 Github 仓库了:

git add .  
git commit -m '博客项目代码'   
git pull --allow-unrelated-histories
git push --set-upstream origin master
 
这样,就会将项目代码都提交到对应的 Github 仓库。

 

更多见: https://blog.csdn.net/william_n/article/details/103281525  //将本地代码仓库与远程仓库关联

 

备注: 

公共仓库与私有仓库可以相互转换,操作见上 '将本地代码仓库与远程仓库关联' , 这里已经转换为私有仓库

git推拉代码的方式有两种: http 与 ssh [[email protected]:ningxiaofa/blog57.test.git ]

前者不用额外配置, 后者操作如下:

生成秘钥[服务器,这里即阿里云ECS] 

ssh-keygen -t rsa

提示一直回车就行,将生成的秘钥添加到项目托管的git库网站[github/gitlab/Coding]上即可

LNMP - Laravel - Envoy 自动部署_第13张图片

2. git 克隆仓库代码

LNMP - Laravel - Envoy 自动部署_第14张图片

 由上可知, 拉取成功.

7. 在服务器首次部署项目

7.1 初始化项目资源

代码既然已经上传到 Git 仓库,接下来,我们就可以在服务器拉取最新代码了。我们准备将 /www 目录作为 Web 应用根目录,在该目录下通过 Git 命令从 Github 克隆项目:

git clone https://github.com/ningxiaofa/blog57.test.git

 

进入博客项目根目录,运行如下命令初始化后端依赖和前端依赖,并且编译前端资源:

cd blog57.test
composer install
npm install
npm run prod

 

7.2 更新目录权限

由于 Nginx 默认用户名和用户组都是nginx[见上面LNMP搭建的连接],所以我们将 blog57.test 整个项目目录的所属用户和用户组也设置为 nginx

cd /www
chown -R nginx:nginx blog57.test

 

这样一来,就一劳永逸的解决了 Laravel 项目目录权限的问题。

另外,在 public 目录下创建一个指向 storage/app/public 目录的软链 storage

php artisan storage:link

 

7.3 创建线上数据库

通过 mysql -u root -p  后输入密码, 登录到数据库

更多操作见: https://blog.csdn.net/william_n/article/details/103745147

 

登录服务器后, 创建数据库

create database blog57.test default charset utf8 collate utf8_general_ci;

LNMP - Laravel - Envoy 自动部署_第15张图片

Navicat连接数据库参见: https://blog.csdn.net/william_n/article/details/80288057

 

7.4 更新线上 .env 配置

接下来,回到 laravel-blog-code 博客项目根目录,创建线上 .env 环境配置文件,初始化应用配置:

cp .env.example .env
php artisan key:generate

 

然后修改应用其它配置信息如下:

APP_NAME=宁小法的博客
APP_ENV=production
APP_DEBUG=false
APP_URL=http://ningxiaofa.top

 

注:请将 APP_NAME 和 APP_URL 配置为你自己的应用名称和 URL。

 

修改数据库配置信息和邮箱配置信息

,env中修改 参考:

LNMP - Laravel - Envoy 自动部署_第16张图片

LNMP - Laravel - Envoy 自动部署_第17张图片

参考:

https://blog.csdn.net/william_n/article/details/103368258

7.5 运行数据库迁移和填充命令初始化数据

准备好数据库和环境配置后,就可以运行迁移命令创建数据表了:

php artisan migrate  //如有报错, 见最下方3问题/补充

LNMP - Laravel - Envoy 自动部署_第18张图片

 

然后运行填充命令初始化应用测试数据:

php artisan db:seed

LNMP - Laravel - Envoy 自动部署_第19张图片

如此便已准备好数据库和测试数据。

接下来我们配置 Nginx 指向这个 Web 应用

 

7.6 配置 Nginx 指向博客应用

Nginx 相关配置位于 /etc/nginx 目录下,我们进入 conf.d 目录创建一个新的应用配置文件:

blog57.test.conf

 

server {
    listen 80;
    server_name ningxiaofa.top;
    root  /www/blog57.test/public;
    location / {
        index index.php index.html;
        # 伪静态配置-start
        if (!-e $request_filename) {
                rewrite  ^(.*)$  /index.php?s=$1  last;
                break;
        }
        # 伪静态配置-end
    }
    #index index.php index.html;
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }

    error_log /var/log/nginx/blog57_error.log;
    access_log /var/log/nginx/blog57_access.log;
}

截图如下:

LNMP - Laravel - Envoy 自动部署_第20张图片

保存退出

测试配置是否okay: nginx -t

 

启动 Nginx、PHP-FPM  //PHP-FPM一般只有php.ini配置文件有变化,才需要重启.

至此,我们已经完成了第一次部署项目上线的所有初始化配置,最后,我们来启动 Nginx 和 PHP-FPM(已经启动的话需要重启):

service nginx start 或者 nginx

service php-fpm.service start

如果 MySQL 没有启动的话,也要启动/重启:

service mysqld start/restart

 

备注:

如果重启nginx提示不能重启或者启动不了, 因为错误退出, 请先把nginx进程杀死,重新操作.

7.7 访问线上博客应用

方式一: 

通过域名访问 :

ningxiaofa.top

 

要求: 购有域名, 最好已备案

 

方式二:

虚拟主机方式

如果你没有购买过域名,或者域名还没有备案,可以通过在本地配置虚拟域名的方式访问,即在 /etc/hosts 中配置域名与线上服务器的映射:

47.96.103.191 ningxiaofa.top

 

将47.96.103.191 替换成你自己的远程服务器公网 IP 即可。

这样,就可以在本地浏览器中访问 ningxiaofa.top , 涉及到DNS相关知识, 有兴趣可另行查找资料

 

7.8 访问站点

7.8.1 浏览器中输入: ningxiaofa.top 回车

LNMP - Laravel - Envoy 自动部署_第21张图片

 

7.8.1 此时,还没有上传背景图片,我们可以登录到服务器通过 Tinker 手动创建后台用户

创建后台用户参考:

LNMP - Laravel - Envoy 自动部署_第22张图片

 

然后上传对应的背景图片 //参考: https://xueyuanjun.com/post/9737,如果上传过程中报错:

参考最下方3问题/补充

 

7.9 通过 DNS 域名解析访问 //参考下, 这里未实践, 因为

如果你有一个已经备案的域名,还可以通过在域名服务商那里通过域名解析的方式将域名指向服务器公网 IP,这样,所有人都可以通过指定的域名访问你的应用了,还是以阿里云为例,你可以通过在控制台域名列表选择解析进入域名解析页面,点击「新增解析」按钮,在弹出框填写表单

 

LNMP - Laravel - Envoy 自动部署_第23张图片

主机记录处填写你的域名前缀,比如 wwwblog 等,如果不想有前缀,可以填写 @,就像Laravel学院那样。填写完成后,点击确定,等待几分钟,就可以解析成功了

 

在本地 /etc/hosts 文件中删除之前绑定的虚拟域名:

47.96.103.191 ningxiaofa.top

 

再次访问 http://blog.laravelacademy.org/blog,依然是 OK 的,说明我们的域名解析已经生效了,接下来,就可以把网址分享给你的小伙伴,让他们来访问你的博客了。

这样,我们就完成了应用从首次部署上线到支持公开访问的完整流程。

7.10 后续代码迭代更新上线

一般来说,项目都是需要迭代开发上线的.

这里,我们使用 Git 管理代码的优势就体现出来,以后每次修改代码,测试完成合并到指定上线分支(比如 master 分支)后,就可以直接到服务器上通过 git pull 拉取最新代码了,如果最新代码有问题,也可以快速回滚到上一个稳定版本,将事故影响降到最低。

关于 Git 开发工作流是另外一个话题,这里就不展开了,针对个人博客这种小项目,也不需要搞那么复杂。

 

7.10.1 基于 Envoy + Git 实现自动化部署

Laravel 还提供了一个远程执行服务器命令的扩展包 Envoy,我们可以借助这个扩展包结合 Git 工具实现简单的自动化部署代码到服务器。

 

实现步骤:

1. 本地[不是服务器]全局安装 Envoy 扩展包

composer global require laravel/envoy

LNMP - Laravel - Envoy 自动部署_第24张图片

LNMP - Laravel - Envoy 自动部署_第25张图片

2. 创建脚本

到本地项目根目录下创建一个 Envoy.blade.php 文件,并编写自动化部署脚本如下: 并截图如下:

@servers(['web' => '[email protected]'])

@task('deploy', ['on' => ['web'], 'confirm' => true])

cd /www/blog57.test/

git pull

@endtask

LNMP - Laravel - Envoy 自动部署_第26张图片

 

备注:

我们将需要部署的服务器配置到 @servers 指令中(支持多台机器部署,将对应IP换成你自己的服务器IP),然后在 @task 指令中,通过第一个参数指定命令名称,第二个参数指定部署机器和配置(比如多台机器并行发布,部署前是否确认),具体的操作步骤位于 @task 和 @endtask 之间。

 

当然,这里你还可以进一步进行优化,比如如果需要安装 PHP 扩展包需要运行 composer update 命令,如果更新了前端资源需要运行 npm 相关命令,有数据库迁移还需要运行 php artisan migrate 等。学院君这里只是给你一个方向,具体细节可以自己去优化,更多 Envoy 使用细节可以参考官方文档。

 

3. 本地修改提交代码, 并且执行自动化部署[其实只是省略一个步骤, 不用登陆服务器拉取代码]

git add .

git commit -m 'test'

git push

 

envoy run deploy  //本人主机不能在git bash中执行, 否则不成功

 

这样,我们就完成了一个简单的自动化部署代码到线上的解决方案,对于小型项目来说,还是很方便的,无需登录服务器即可快速完成代码上线,尤其是你有多台服务器的话,更有必要这么做。

 

注:需要将 Envoy.blade.php 文件添加到 .gitignore 文件,避免泄露敏感信息。

 

 

过程截图如下:

LNMP - Laravel - Envoy 自动部署_第27张图片

 

Over

...

 

后续整理

...

3.问题/补充

1. 执行php artisan migrate mysql 8.0 出现报错 Authentication plugin 'caching_sha2_password' cannot be loaded 

LNMP - Laravel - Envoy 自动部署_第28张图片

 

原因: mysql8使用的是caching_sha2_password加密规则,最简单的方法是修改远程连接用户的加密规则

解决办法: 

You can change the encryption of the user's password by altering the user with below Alter command:

ALTER USER 'username'@'ip_address' IDENTIFIED WITH mysql_native_password BY 'password';

or

First change the authentication plugin in my.cnf file for Linux / my.ini file in Windows:

[mysqld]

default_authentication_plugin=mysql_native_password

但是在git bash中执行都没成功.

 

于是在Navicat中执行, 成功.

然后执行php artisan migrate命令成功.

LNMP - Laravel - Envoy 自动部署_第29张图片

 

2. 访问站点[http://ningxiaofa.top]出现'404 Not Found', 截图如下:

LNMP - Laravel - Envoy 自动部署_第30张图片

原因: 未配置伪静态,导致找不到资源

解决办法:在虚拟主机配置中添加如下:

LNMP - Laravel - Envoy 自动部署_第31张图片

# 伪静态配置-start
  if (!-e $request_filename) {
     rewrite  ^(.*)$  /index.php?s=$1  last;
     break;
  }
# 伪静态配置-end

 

重新访问, 正常访问. 截图如下:

LNMP - Laravel - Envoy 自动部署_第32张图片

 

3. 上传文件[http://ningxiaofa.top/admin/upload/file]出现 '413 Request Entity Too Large' 报错.

LNMP - Laravel - Envoy 自动部署_第33张图片

原因: php限制文件上传大小默认为2M

解决办法:

需要修改 PHP 上传文件最大尺寸限制,在服务器上打开/etc/php.ini   // 有时可能为 /etc/php/7.2/fpm/php.ini,

找到[如何快速查找, 请参考: https://blog.csdn.net/william_n/article/details/103799988] upload_max_filesize = 2M 这一行,将其值调整为 8M:

upload_max_filesize = 8M

保存退出,重启 PHP-FPM:

service php7.2-fpm reload //Ubuntu

service php-fpm.service restart  //centOS

此外,还要在 /etc/nginx/nginx.conf 新增配置,在 http {} 配置中新增如下这行配置:

client_max_body_size 10m;  // 这里的配置值稍大于或等于 PHP 中的配置

修改完成后保存退出,然后重启 Nginx [ systemctl restart nginx ]

重新上传文件: http://ningxiaofa.top/admin/upload?folder=/uploads

 

4. 在git bash中 执行 composer global require laravel/envoy 报错 提示'bash: composer: command not found'

解决办法: 换在cmd中执行.

 

5. 执行自动部署命令出现系列错误

在cmd中执行, 如下:

git add .

git commit -m 'test'

git push

5.1 执行envoy run deploy 出现没有找该命令.

原因: composer全局配置目录没有加入环境变量中.

LNMP - Laravel - Envoy 自动部署_第34张图片

解决办法:

将C:\Users\geili\AppData\Roaming\Composer\vendor\bin加入环境变量中即可. 使环境变量生效的办法, 不再详述.

 

重新执行 envoy run depoy

备注: 都要重新开窗口[不论是cmd还是git bash]

LNMP - Laravel - Envoy 自动部署_第35张图片

LNMP - Laravel - Envoy 自动部署_第36张图片
 

5.2 在git bash中执行 envoy run deploy, 没有响应.

LNMP - Laravel - Envoy 自动部署_第37张图片

 

改成在cmd中执行, 响应正常

LNMP - Laravel - Envoy 自动部署_第38张图片

 

重新测试一遍:

LNMP - Laravel - Envoy 自动部署_第39张图片

由上可知, 已经okay, 同时也暴露出composer安装有些问题, 待解决 TBD

 

 

后续补充

...

4.参考

https://xueyuanjun.com/post/9749  //基于 Laravel 5.7 开发博客应用系列(十) —— 将博客应用自动部署到线上服务器完整流程详解

https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html  //putty下载

https://www.npmjs.com/  //npm官网

https://docs.npmjs.com/downloading-and-installing-node-js-and-npm  //安装文档

https://developer.aliyun.com/mirror/NPM?spm=a2c6h.13651102.0.0.53322f70vDg9VE  //npm阿里镜像

https://npm.taobao.org/mirrors/npm/?spm=a2c6h.13651104.0.0.492f4915aw8JoF  //阿里npm镜像版本库 

https://stackoverflow.com/questions/49194719/authentication-plugin-caching-sha2-password-cannot-be-loaded?r=SearchResults //Authentication plugin 'caching_sha2_password' cannot be loadedAuthentication plugin 'caching_sha2_password' cannot be loaded报错即解决办法

https://xueyuanjun.com/post/19552.html //远程操作解决方案:Laravel Envoy

https://laravel.com/docs/6.x/envoy  //Envoy文档

后续补充

...

你可能感兴趣的:(部署维护-DEPLOYMENT,AND,MAINTENANC,LINUX)