目標:服務器上搭建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 推送到服務器。
訪問服務器新的路由地址,成功: 
