利用Git搭建自動部署的Laravel環境 - 鍾晨宇的博客 - CSDN博客


目標:服務器上搭建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');"
> 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 推送到服務器。

訪問服務器新的路由地址,成功: 
這里寫圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM