zoukankan      html  css  js  c++  java
  • 利用Git搭建自动部署的Laravel环境

    目标:服务器上搭建Laravel环境,本地使用IDE进行开发,使用Homestead做本地调试环境,代码提交后自动部署到服务器Root目录下。 
    下面是整个流程的示意图: 
    这里写图片描述

    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');"
    > IlluminateFoundationComposerScripts::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 推送到服务器。

    访问服务器新的路由地址,成功: 
    这里写图片描述

  • 相关阅读:
    Intellij IDEA Java web 项目搭建
    Spring的AOP原理
    为何有DAO与Service层?为何先搞Dao接口在搞DaoImpl实现?直接用不行吗?
    DAO层,Service层,Controller层、View层协同工作机制
    浅谈service、DAO层引入(转)
    java书籍推荐转
    Java点滴-List<Integer> list; 中尖括号的意思
    Composer更新慢的终极解决方案-转
    laravel门面DB返回数组配置
    laravel构建联合查询
  • 原文地址:https://www.cnblogs.com/wzjwffg/p/9882749.html
Copyright © 2011-2022 走看看