利用Git搭建自动部署的Laravel环境 - 钟晨宇的博客 - CSDN博客

时间:2022-11-17 14:54:11

目标:服务器上搭建Laravel环境,本地使用IDE进行开发,使用Homestead做本地调试环境,代码提交后自动部署到服务器Root目录下。 
下面是整个流程的示意图: 
利用Git搭建自动部署的Laravel环境 - 钟晨宇的博客 - CSDN博客

1. 准备工作,搭建LNMP环境

搭建一个Linux服务器,安装好nginx、MySQLPHP

因为要用到Laravel 5.4,对安装的php有以下要求

PHP >= 5.6.4 
OpenSSL PHP Extension 
PDO PHP Extension 
Mbstring PHP Extension 
Tokenizer PHP Extension 
XML PHP Extension

我们用的是一个CentOS的服务器,安装信息如下:

[root@server ~]# nginx -v
nginx version: nginx/1.10.3 [root@server ~]# mysql --version
mysql Ver 14.14 Distrib 5.6.35, for linux-glibc2.5 (x86_64) using EditLine wrapper [root@server ~]# php -v
PHP 7.1.2 (cli) (built: Feb 21 2017 10:40:18) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.1.2, Copyright (c) 1999-2017, by Zend Technologies
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

编辑 nginx.config 配置好服务器root目录等信息,后面项目的路径会放到 /data/wwwroot/default/test/jokes 下面,而 Laravel 项目的 index.php 文件是在 public 文件夹下面,所以把root配成 /data/wwwroot/default/test/jokes/public 。主要的配置如下:

  server {
listen 80;
server_name _;
access_log /data/wwwlogs/access_nginx.log combined;
root /data/wwwroot/default/test/jokes/public;
index index.html index.htm index.php; location ~ [^/]\.php(/|$) {
#fastcgi_pass remote_php_ip:9000;
fastcgi_pass unix:/dev/shm/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

2. 安装 Laravel

服务器准备好后,下面就可以在服务器上安装 Laravel 了,我们通过 PHP 的包管理工具 Composer 来进行安装 Laravel,首先要安装 Composer 。

由于某种你懂的原因,在国内可能无法连上 Composer的服务器。那么有两种选择: 连接VPN或者使用国内镜像。

我尝试了连接VPN,发现操作很繁琐,配置PPTP、路由、DNS 服务器等等,可能是线路质量的原因,最后效果还是不理想,安装Composer速度还是不行,而且我本地 SSH 服务器速度也不给力,最终还是选择用国内镜像。

这里介绍一个目前还很好用的国内镜像网站:http://www.phpcomposer.com/ 。Composer 和 Laravel 的安装都可以使用这个镜像。

(1) 安装 Composer

php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

执行第一条命令下载下来的 composer-setup.php 脚本将简单地检测 php.ini 中的参数设置,如果某些参数未正确设置则会给出警告;然后下载最新版本的 composer.phar 文件到当前目录。

上述 3 条命令的作用依次是: 
下载安装脚本 - composer-setup.php - 到当前目录。 
执行安装过程。 
删除安装脚本。

将 Composer 安装到系统环境变量 PATH 所包含的路径下面,然后就能够在命令行窗口中直接执行 composer 命令了。

sudo mv composer.phar /usr/local/bin/composer
  • 1
  • 1

(2) 配置镜像地址 
修改 composer 的全局配置文件

composer config -g repo.packagist composer https://packagist.phpcomposer.com
  • 1
  • 1

执行之后会发现 Composer 全局的/root/.config/composer/config.json 
文件下增加了如下内容:

{
"config": {},
"repositories": {
"packagist": {
"type": "composer",
"url": "https://packagist.phpcomposer.com"
}
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

(3) 安装 Laravel 
通过 Composer 安装 Laravel:

composer global require "laravel/installer"
  • 1
  • 1

将 Laravel 所在的路径添加 path,编辑文件:

vi /etc/profile
  • 1
  • 1

把 /root/.config/composer/vendor/bin 加到路径:

export PATH=/usr/local/nginx/sbin:/usr/local/php/bin:/usr/local/mysql/bin:/root/.config/composer/vendor/bin:/usr/local/git/bin:$PATH
  • 1
  • 1

执行 source /etc/profile 使配置生效

接下来就可以使用 laravel 命令来创建项目了, 使用命令laravel new LaravelProject ,就自动在当前目录下创建一个 LaravelProject 项目,Composer会自动下载安装相应的依赖库。

不过我们不在服务器上直接创建项目,而是在本地开发环境上创建,这是考虑到Git部署方便,后面将详细说明。

3. 在服务器上配置Git自动部署

(1) 创建git远程仓库

我们用一个独立的路径来做远程仓库,而不是直接用 Nginx 的 root 路径来做仓库。

首先创建一个专门的git用户:

# useradd gituser
# passwd gituser
  • 1
  • 2
  • 1
  • 2

另外也可以拷贝一个公钥到服务器上,后续在本地进行git操作时不需要输入密码,跟GitHub一样,需要的可以自行搜索,这里不详细介绍了。

然后在仓库的路径下,创建一个git裸仓库:

# git init --bare jokes.git
  • 1
  • 1

jokes.git是项目路径文件夹,加了 –bare参数后创建的就是裸仓库,裸仓库包含的文件相当于非裸仓库 .git 文件夹下的文件,裸仓库没有work tree,因而不能执行 git add 等一些命令,这就限制了在服务器上的git编辑行为。

为什么用裸仓库呢?这是为了避免用非裸仓库带来的一些问题,如果是非裸仓库,服务器上有一个work tree,本地客户端 push origin master 后会产生冲突,而裸仓库就没有这个问题。但是在裸仓库里是看不到我们的项目文件的,最多通过 git log命令查看commit记录,不过我们只把仓库作一个纯粹的存储作用,也不影响。

初始化之后,把仓库改成gituser所有:

# chown -R gituser:gituser jokes.git
  • 1
  • 1

git 默认是禁止push的,所有要设置允许push:

# vi config
  • 1
  • 1

修改或添加如下内容:

[receive]
denyCurrentBranch = ignore
  • 1
  • 2
  • 1
  • 2

(2) 编辑自动部署脚本 
自动部署用到git hooks,在git路径下有个hooks文件夹,里面有一些示例。我们把post-update.sample重命名为post-update,并进行编辑:

# mv post-update.sample post-update
# vi post-update
  • 1
  • 2
  • 1
  • 2
#!/bin/sh
#
# An example hook script to prepare a packed repository for use over
# dumb transports.
#
# To enable this hook, rename this file to "post-update". #exec git update-server-info unset GIT_DIR NowPath=`pwd` DeployPath="/data/wwwroot/default/test/jokes" cd $DeployPath
git pull origin master
composer install cd $NowPath echo 'deploy success'
exit 0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

这样每当push master分支到服务器时,都会自动切换到DeployPath,也就是Nginx root路径,执行 git pull origin master 从仓库拉去最新master分支,并执行composer install ,如果项目composer有变更则安装,没有变更则不会安装。

(3) 部署路径初始化 
先把空的仓库克隆到路径下:

# git clone jokes /data/git/jokes.git
  • 1
  • 1

对于要部署的路径,要把所有者该为gituser:

# chown -R gituser:gituser jokes
  • 1
  • 1

服务器的配置就级别完成了

4. 本地创建Laravel项目

(1) 安装Homestead 
本地用的 Windows 系统,打算用 PhpStrom 进行开发,开发过程还需要在本地进行调试。PhpStorm 编辑代码自然是比较方便,但是要在 Windows 下搭建 Laravel 运行环境显然比较坑,好在 Laravel 已经给我们提供了解决方案, 使用 Homestead 。

Homestead 是集成了 Laravel 运行所需一些的 Ubuntu 系统,使用时要先安装虚拟机软件(如VitrulBox)和 Vagrant,具体安装过程参考 Laravel 中文文档: 
http://d.laravel-china.org/docs/5.4/homestead

Homestead还提供了主机和虚拟机文件的共享映射,在任何一个系统修改都可以自动同步到另一个系统,因此我们可以在Windows上进行编辑,在Homestead上作为服务器来运行,并且在Windows的浏览器或者Postman等测试工具上也可以直接访问Homestead服务器的网址。

(2) 初始化项目

执行vagrant up 启动Homestead,进入到共享文件夹下的项目路径,执行laravel new jokes 创建jokes项目:

vagrant@homestead:~/Code$ laravel new jokes
Crafting application...
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Package operations: 59 installs, 0 updates, 0 removals
- Installing doctrine/inflector (v1.1.0): Loading from cache
- Installing erusev/parsedown (1.6.2): Downloading (100%)
- Installing jakub-onderka/php-console-color (0.1): Downloading (0%)
Downloading (100%)
- Installing symfony/polyfill-mbstring (v1.3.0): Loading from cache
- Installing symfony/var-dumper (v3.2.7): Downloading (100%)
- Installing psr/log (1.0.2): Loading from cache
- Installing symfony/debug (v3.2.7): Downloading (100%)
- Installing symfony/console (v3.2.7): Downloading (100%)
- Installing nikic/php-parser (v3.0.5): Downloading (100%)
...
laravel/framework suggests installing symfony/dom-crawler (Required to use most of the crawler integrat ion testing tools (~3.2).)
laravel/framework suggests installing symfony/psr-http-message-bridge (Required to psr7 bridging featur es (0.2.*).)
sebastian/global-state suggests installing ext-uopz (*)
phpunit/php-code-coverage suggests installing ext-xdebug (^2.5.1)
phpunit/phpunit suggests installing ext-xdebug (*)
phpunit/phpunit suggests installing phpunit/php-invoker (~1.1)
Generating optimized autoload files
> php -r "file_exists('.env') || copy('.env.example', '.env');"
> Illuminate\Foundation\ComposerScripts::postInstall
> php artisan optimize
Generating optimized class loader
The compiled services file has been removed.
> php artisan key:generate
Application key [base64:hsfP0smMv8yRhGYxJkBUi6JjBqUQFZ7jZgP0Rmuz9lI=] set successfully.
Application ready! Build something amazing.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

这时候本地的项目就创建好了,访问Homestead里配置的地址,可以看到一个Laravel的欢迎界面: 
利用Git搭建自动部署的Laravel环境 - 钟晨宇的博客 - CSDN博客

5. 推送git仓库

进入共享文件夹,执行git clone gituser@server_ip:/data/git/jokes.git 将远程的空仓库克隆下来。

执行git add -A 将创建的项目添加到git。

执行git commit -m "init" 提交变更。

执行git push origin master 推送到远程仓库

此时在登录到服务器,进入到仓库路径,可以看到这个裸仓库下依然没有任何jokes项目相关的文件,但是通过git log可以看到提交的commit:

[root@server jokes.git]# ls
branches config description HEAD hooks info logs objects refs [root@server jokes.git]# git log commit d593a9dafeebc332a5149b0f7718cc78ec43f959
Author: user<zhongchenyu***@***.com>
Date: Fri Apr 28 00:07:47 2017 +0800 init
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

再进到Nginx root路径,发现项目文件已经被部署过来了:

[root@server jokes]# ls
aapp composer.json database public server.php vendor
artisan composer.lock package.json resources storage webpack.mix.js
bootstrap config phpunit.xml routes tests yarn.lock
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

这个时候服务器的网址还是不能访问的,本地环境创建完项目后马上就能访问,那是因为Homestead已经把很多事情搞定了。在服务器上还要自己完成下面几个步骤。 
(1) 给项目的storage 和 bootstrap/cache路径添加写权限 
(2) 在项目路径下执行composer install 
(3) 创建环境信息文件,将 .env.example 重命名为 .env 
(4) 执行php artisan key:generate 生成app key

这个时候再访问服务器地址,好的,页面出来了: 
利用Git搭建自动部署的Laravel环境 - 钟晨宇的博客 - CSDN博客

6. 开始开发

我们试着增加一条路由,返回Hello World。 
编辑Routes/web.php , 增加下面代码:

Route::get('foo', function () {
return 'Hello World';
});
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

然后git add, git commit, git push 推送到服务器。

访问服务器新的路由地址,成功: 
利用Git搭建自动部署的Laravel环境 - 钟晨宇的博客 - CSDN博客