利用Git搭建自动部署的Laravel环境 - 钟晨宇的博客 - CSDN博客
目标:服务器上搭建Laravel环境,本地使用IDE进行开发,使用Homestead做本地调试环境,代码提交后自动部署到服务器Root目录下。
下面是整个流程的示意图:
1. 准备工作,搭建LNMP环境
搭建一个Linux服务器,安装好nginx、MySQL、PHP
因为要用到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的欢迎界面:
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
这个时候再访问服务器地址,好的,页面出来了:
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 推送到服务器。
访问服务器新的路由地址,成功: