輕鬆部署 Laravel 應用 | 《08. 手動部署 - 部署應用程式碼》

Wi1dcard發表於2019-03-09

:clap: 本系列持續更新中,歡迎關注:https://github.com/wi1dcard/laravel-deploy...

由於課程上下文關聯比較緊密,在開始前請先閱讀 本文

你的支援是我寫作的動力;關注我的客官們,請在右上角點個贊,將會讓文章在首頁展示,幫助更多人。

感謝 :clap: !

在上一節,我們終於安裝好了基本執行環境,是時候將程式碼部署到伺服器上了。

使用 Git 拉取專案(HTTPS 協議)

目前幾乎所有的 Laravel 開發者都會使用 Git 作為版本控制系統,而常見的 Git 倉庫託管平臺 GitHub、GitLab、Gitea,以及國內的 Gitee、Coding 等,幾乎都支援兩種常見的傳輸協議 —— SSH 和 HTTPS。由於使用 SSH 協議通常需額外配置,本節我們先嚐試 HTTPS 協議。

首先,我們需要得到 Git 倉庫的地址。以 GitHub 為例,在瀏覽器內開啟倉庫頁面,點選綠色的 Clone or download 按鈕,選擇彈出框內的 Use HTTPS

確保連結為 HTTPS 協議,點選複製:

記住此連結,稍後需要使用。接下來請登入到伺服器,執行:

$ cd /var/www/

cd 命令用於切換當前工作目錄,/var/www 是 Nginx 預設的站點存放目錄。

隨後便可以將倉庫克隆到本地了:

$ git clone https://github.com/wi1dcard/hello-deployment.git deployment

提示:若倉庫包含大量提交歷史,以上命令可能耗時較久;你可以嘗試使用 --depth 選項來優化,詳情請搜尋 Git 淺克隆 等關鍵字。

請將命令中的 URL 替換為剛剛從 GitHub 或其它倉庫託管平臺內複製的連結。末尾的 deployment 參數列示將此倉庫克隆至當前工作目錄下的 deployment 子目錄內。

稍等將會出現以下輸出:

Cloning into 'hello-deployment'...
remote: Enumerating objects: 130, done.
remote: Counting objects: 100% (130/130), done.
remote: Compressing objects: 100% (95/95), done.
remote: Total 130 (delta 50), reused 105 (delta 32), pack-reused 0
Receiving objects: 100% (130/130), 2.73 MiB | 850.00 KiB/s, done.
Resolving deltas: 100% (50/50), done.
Checking connectivity... done.

如果你的專案是「私有」的,那麼可能需要輸入使用者名稱和密碼:

Cloning into 'hello-deployment'...
Username for 'https://github.com': <輸入你的使用者名稱>
Password for 'https://wi1dcard@github.com': <請輸入你的密碼>

提示:還記得之前提到的嗎?密碼輸入是不可見的。

使用 Composer 安裝依賴

首先,請切換至 deployment 目錄內:

$ cd deployment

接著執行:

$ composer install

稍等片刻,你可能會看到這樣的警告:

Failed to download foo/bar from dist: The zip extension and unzip command are both missing, skipping.
Now trying to download from source

意為 PHP Zip 擴充套件和 unzip 命令均找不到,此時 Composer 會嘗試從依賴的 Git 倉庫內直接克隆原始碼,這是不推薦的;因此我們使用 Ctrl + C(macOS 為 Cmd + C)中止正在執行的命令。

針對該警告資訊,可以想到兩種解決思路:

  • 使用之前小節提到的 apt-cache search 搜尋 php zip 關鍵字,查詢 Zip 擴充套件並安裝。
  • 安裝 unzip 命令。

第一種方法本節不再贅述,我們來嘗試第二種方法。首先,嘗試手動執行 unzip,確認它的確未安裝:

$ unzip
The program 'unzip' is currently not installed. You can install it by typing:
apt install unzip

看樣子在當前系統中確實找不到 unzip。不過,貼心的 APT 幫我們找到了包含 unzip 的軟體包,並直接提供了安裝命令:

$ apt install unzip

稍等片刻便安裝好了。此時再次執行:

$ unzip
UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.
...

完美。

實際上,不僅是 Composer,其它多數命令都支援使用 Ctrl + C 中止執行;如果 Ctrl + C 無效,你也可以試試 Ctrl + D;另外,結合 APT 的提示和 apt-cache search,可以幫助我們很快地解決絕大多數命令缺失的錯誤,而無需遵從百度來的手動而又複雜的原始碼編譯步驟。

我們回到主題,再次執行 composer install

Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Package operations: 72 installs, 0 updates, 0 removals
  - Installing dragonmantank/cron-expression (v2.2.0): Downloading (100%)
  - Installing erusev/parsedown (1.7.1): Downloading (100%)
  - Installing symfony/var-dumper (v4.2.3): Downloading (connecting...)

恭喜,等待安裝完畢即可。

配置環境變數

依賴安裝完成後,我們還需要將 .env.example 檔案複製為 .env 檔案,並生成 APP_KEY 金鑰:

$ cd /var/www/deployment
$ php -r "file_exists('.env') || copy('.env.example', '.env');"
$ php artisan key:generate --ansi

提示:實際上,以上兩條命令都是從部署應用的 composer.json - scripts 小節內摘抄出來的,這也解釋了為何使用 laravel new 建立專案後 .env 檔案就已經存在。有興趣可深入瞭解 Composer Scripts

配置檔案所有者

最後,別忘記修改檔案所有者:

$ chown -R www-data:www-data .

由於目前所在的工作目錄為 /var/www/deployment,所以可用表示當前工作目錄的 . 代替之前的 /var/www/deployment,它們是等效的。

至此,本小節目標完成。你可以通過 ll 命令來列出當前目錄:

$ ll
total 440
drwxr-xr-x 13 www-data www-data   4096 Mar  9 01:26 ./
drwxr-xr-x  5 root     root       4096 Mar  9 00:49 ../
drwxr-xr-x  6 www-data www-data   4096 Mar  9 00:45 app/
-rw-r--r--  1 www-data www-data   1686 Mar  9 00:45 artisan
...
本作品採用《CC 協議》,轉載必須註明作者和本文連結

Former WinForm and PHP Engineer. Now focus on #DevSecOps and global networking.

相關文章