成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

deployer 實(shí)戰(zhàn)經(jīng)驗(yàn)分享

cangck_X / 2777人閱讀

摘要:開發(fā)完項(xiàng)目,免不了要部署上線。進(jìn)行部署的過程中,項(xiàng)目仍然能夠正常訪問。能十分方便地進(jìn)行回滾。線上測試與生產(chǎn)使用的是青云的云主機(jī),系統(tǒng)?;蛘呦朕k法設(shè)置實(shí)現(xiàn)免密碼登錄。

開發(fā)完項(xiàng)目,免不了要部署上線。純手動操作,登錄、拉代碼、改配置、清緩存、各種服務(wù)重啟等等一條龍下來,人生寶貴的幾分鐘就過去了。而且手動操作十分容易出錯,遺漏部分步驟都有可能產(chǎn)生一些邪門問題。所以我很早就開始尋求一種能輕松部署 Laravel 項(xiàng)目的辦法。

laravel 的官方文檔里介紹了 Envoy,之前用過,能滿足大部分場景,但仍然有一些限制。直到后來看到了 deployer,大有相見恨晚之感!

deployer 的優(yōu)勢

真正解放雙手,一條命令完成部署。

進(jìn)行部署的過程中,項(xiàng)目仍然能夠正常訪問。部署成功完成后才切到新的版本。

能十分方便地進(jìn)行回滾。

豐富任務(wù)鉤子和預(yù)置任務(wù)可靈活的組合完成各種任務(wù),比如執(zhí)行前端依賴的安裝、構(gòu)建等。

其它騷姿勢等你發(fā)掘……

使用 deployer 的前提條件

本地機(jī)器(也就是你執(zhí)行 dep 命令時所在的機(jī)器)能夠 SSH 連接到目標(biāo)機(jī)器(代碼要部署到的機(jī)器,不管是在線的云主機(jī)還是局域網(wǎng)中的虛擬機(jī))

有登錄目標(biāo)機(jī)器并調(diào)整一些設(shè)置的權(quán)限,或者能讓負(fù)責(zé)人協(xié)助調(diào)整。(使用過程中可能遇到問題需要調(diào)整一些設(shè)置,后面會提)

目標(biāo)主機(jī)有拉取項(xiàng)目倉庫的權(quán)限。(這個應(yīng)該都有吧,不然玩?zhèn)€毛?)

足夠大膽、足夠細(xì)心、足夠有耐性……

deployer 的使用

首先說明下個人實(shí)際使用場景。

本人使用 win10 系統(tǒng),使用 Homestead 作為 PHP 項(xiàng)目的開發(fā)環(huán)境(vagrant v2.1.1, homestead v7.4.1, virtualbox v5.2.8, homestead 的 virtual box 版本為 v5.2)。

本地開發(fā)能完成絕大部分開發(fā)和測試任務(wù),但在部署到生產(chǎn)機(jī)之前仍然需要先部署到開發(fā)機(jī)上進(jìn)行測試。線上測試與生產(chǎn)使用的是青云的云主機(jī),Ubuntu16 系統(tǒng)。

以下的操作都是在 homestead 虛擬機(jī)里進(jìn)行操作!

安裝

cd /path/to/your/project

composer require deployer/deployer --dev
個人習(xí)慣于將其作為項(xiàng)目依賴安裝,當(dāng)然也可以根據(jù)需要或個人喜好全局安裝。

初始化 deployer 配置文件

vendor/bin/dep init

因?yàn)槲矣玫氖?laravel 輸入項(xiàng)目類型 1 后回車,然后會出現(xiàn)一個讓設(shè)置 git 倉庫的,默認(rèn)是對應(yīng)項(xiàng)目的 git 遠(yuǎn)端倉庫,不需要修改的話確認(rèn)就可以了。

完成上面的初始化后,項(xiàng)目要目錄下會出現(xiàn)一個 deploy.php 文件,deployer 的配置就靠它了。初始的配置如下,里面顯示了一些基本的配置。

set("deploy_path", "~/{{application}}");    
    
// Tasks
// 這算是個自定義任務(wù)示例
task("build", function () {
    run("cd {{release_path}} && build");
});

// [Optional] if deploy fails automatically unlock.
// 如果部署失敗,自動解除部署鎖定狀態(tài),以免影響下次執(zhí)行
after("deploy:failed", "deploy:unlock");

// Migrate database before symlink new release.
// 執(zhí)行數(shù)據(jù)庫遷移,建議刪掉,遷移雖好,但畢竟高風(fēng)險,只推薦用于開發(fā)環(huán)境。
before("deploy:symlink", "database:migrate");

修改配置

默認(rèn)的配置肯定是不行的,目標(biāo)主機(jī)啥的還不知道呢。下面直接貼上自己用到的配置,并加入了少量說明。

stage("production")
    ->user("root")
    ->port(22)
    ->set("branch", "master") // 最新的主分支部署到生產(chǎn)機(jī)
    ->set("deploy_path", "/data/wwwroot/xxx")
    ->identityFile("/home/vagrant/.ssh/id_rsa")
    ->forwardAgent(true)
    ->multiplexing(true)
    ->set("http_user", "www") // 這個與 nginx 里的配置一致
    ->addSshOption("UserKnownHostsFile", "/dev/null")
    ->addSshOption("StrictHostKeyChecking", "no");

// 測試用的主機(jī)
host("172.16.3.2")
    ->stage("debug")
    ->user("root")
    ->port(22)
    ->set("branch", "develop") // 一般是把 develop 分支弄到測試機(jī)測試,沒問題再合并
    ->set("deploy_path", "/data/wwwroot/xxx")
    ->identityFile("/home/vagrant/.ssh/id_rsa")
    ->forwardAgent(true)
    ->multiplexing(true)
    ->set("http_user", "www")
    ->addSshOption("UserKnownHostsFile", "/dev/null")
    ->addSshOption("StrictHostKeyChecking", "no");

// 自定義任務(wù):重置 opcache 緩存
task("opcache_reset", function () {
    run("{{bin/php}} -r "opcache_reset();"");
});

// 自定義任務(wù):重啟 php-fpm 服務(wù)
task("php-fpm:restart", function () {
    run("systemctl restart php-fpm.service");
});

// 自定義任務(wù):supervisor reload
task("supervisor:reload", function () {
    run("sudo supervisorctl reload");
});

// 自定義任務(wù):部署成功了用 bearychat 發(fā)消息給大佬和自己
task("send_message", function () {
    run("{{bin/php}} {{release_path}}/artisan deployed");
});

// 自定義任務(wù):緩存路由,recipe/laravel.php 默認(rèn)的流程里沒有這個,所以加上,息看需要
after("artisan:config:cache", "artisan:route:cache");

// 執(zhí)行自定義任務(wù),注意時間點(diǎn)是 current 已經(jīng)成功鏈向新部署的目錄之后
after("deploy:symlink", "php-fpm:restart");
after("deploy:symlink", "supervisor:reload");

// 部署成功后重置 opcache 緩存
after("deploy:symlink", "opcache_reset");

// 部署成功后調(diào)用 laravel 命令行發(fā)送通知
after("success", "send_message");

// [Optional] if deploy fails automatically unlock.
after("deploy:failed", "deploy:unlock");

代碼修改完成后運(yùn)行部署

修改完成后記得先提交并將代碼推送到遠(yuǎn)端倉庫。然后執(zhí)行如下命令進(jìn)行部署:

vendor/bin/dep deploy debug // 部署到測試機(jī)

vendor/bin/dep deploy production // 部署到生產(chǎn)機(jī)

過程中如果提示要輸入密碼,則輸入登錄目標(biāo)主機(jī)的密碼?;蛘呦朕k法設(shè)置 SSH key 實(shí)現(xiàn)免密碼登錄。

首次部署后設(shè)置 .env,并配置 nginx 站點(diǎn)

默認(rèn)情況下,首次部署后,.env 文件是不會自動創(chuàng)建的,需要自己創(chuàng)建并修改,同時 nginx 站點(diǎn)配置也需要自己動手。對于 .env 文件,存放于目標(biāo)主機(jī)的 /path/to/project/shared/ 目錄下。

修改 .env 后記得重新緩存配置 php artisan config:cache

另外需要注意的是配置 nginx 站點(diǎn)時,網(wǎng)站根目錄應(yīng)該為 /path/to/project/current/public。如果使用 supervisor 之類的,相關(guān)的目錄在配置時也要注意了。

部署后目錄的結(jié)構(gòu)及相關(guān)說明

在部署的目標(biāo)目錄下執(zhí)行 ls -la,可以看到如下結(jié)果:

說明:

| projectname
    |--- @current -> releases/
    |--- .dep
        |--- releases 一個文本文件,里面存著各次部署的時間、次數(shù)序號(或者說版本號)信息
    |--- releases // 目錄下根據(jù)配置保存近幾次部署,更早的則會被自動清理
        |--- 1
        |--- 2
        |--- .
        |--- .
        |--- 
            |--- 目錄中是項(xiàng)目的實(shí)際代碼
            |--- 包括 .git, vendor, .env, storage ...
            |---  .env, storage 實(shí)際通過 symlink 鏈接到 shared 目錄下對應(yīng)的文件上
    |--- shared
        |--- storage // 即 laravel 項(xiàng)目的 storage 文件夾
        |--- .env // 即 laravel 項(xiàng)目的 .env

每次部署更新,會在 releases 下新建文件夾如 num,拉取對應(yīng)的最新代碼,安裝 composer 依賴完成一些其它自定義任務(wù),并將 storage, .env 鏈接到 shared 文件夾下的那兩個上去,然后項(xiàng)目根目錄下的 current 通過 syslink 鏈接到這個新文件夾 num 上,這算是其動作的基本原理,網(wǎng)站在部署過程中能繼續(xù)訪問也得益于此。

.env 和 storage 下的一些未加入代碼庫中的內(nèi)部,部署時不會自動更新,因此有些情況下需要手動處理。

其它日常使用技巧

正常情況下,部署過程中 deployer 會自動完成緩存配置、清理已編譯的緩存等任務(wù)。理論上我們不需要自己再動手,但需要時也可以手動執(zhí)行

// 緩存路由
vendorindep artisan:route:cache production

// 緩存配置
vendorindep artisan:config:cache production

// 清視圖緩存
vendorindep artisan:view:clear production

// 執(zhí)行自定義任務(wù),如前面提到的重新載入 supervisor
vendorindep supervisor:reload production

// ssh 連接到主機(jī),hostname 也可以不輸入,然后從選項(xiàng)里選
vendorindep ssh 

// 列出其它一些可用的命令
vendorindep list
可能遇到的問題
在 deploy 命令后加上 -vvv 選項(xiàng)可以輸出詳細(xì)錯誤信息,方便調(diào)試。

由于部分 php 函數(shù)被禁用而報錯

目標(biāo)主機(jī) php.ini 里的 disabled_functions 項(xiàng)里配置了一些被禁用的函數(shù),如果 deployer 用到了這些函數(shù)就可能報錯,修改 php.ini 解除相關(guān)函數(shù)的禁用狀態(tài)就可以了。

php 執(zhí)行文件位置引起的錯誤

目標(biāo)主要通過 apt-get 命令或 oneinstack 一類的一鍵包安裝的 PHP,可執(zhí)行文件通常在 /usr/local/php/bin/php,而 deployer 內(nèi)使用 /usr/bin/env: php 形式調(diào)用,相當(dāng)于 /usr/local/bin/php。這就可能出錯,一般是報 command -v "php" failed。解決辦法很簡單,只要加個軟鏈接就可以了。

ln -s /usr/local/php/bin/php /usr/local/bin/php

目錄主機(jī)不在線或者網(wǎng)絡(luò)連接問題

解決辦法當(dāng)然是打開目錄主機(jī)并檢查網(wǎng)絡(luò)情況

關(guān)于緩存清理

deployer 的 laravel 默認(rèn)部署流程中,會執(zhí)行 php artisan cache:clear 命令,如果你的項(xiàng)目里使用了 redis 驅(qū)動的隊(duì)列或者一些強(qiáng)依賴于緩存的業(yè)務(wù)邏輯(如緩存文章閱讀數(shù)定期再入庫),則需要進(jìn)行一些騷操作了。

比如,你可以在 config/database.phpredis 項(xiàng)中為隊(duì)列鏈接指定其它的 database。

或者修改 deploy.php 配置默認(rèn)的緩存清理任務(wù),跳過緩存清理動作。(通常并不建議這么做,因?yàn)轫?xiàng)目的緩存,應(yīng)該是可清理的,如果部分業(yè)務(wù)確實(shí)十分依賴于緩存,則應(yīng)該考慮一些緩存持久化的實(shí)現(xiàn)了)

// 覆蓋 recipe/laravel 里默認(rèn)的 artisan:cache:clear 任務(wù),部署時不清緩存
task("artisan:cache:clear", function () {
    return true;
});

原文地址

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/30751.html

相關(guān)文章

  • CI Weekly #6 | 再談 Docker / CI / CD 實(shí)踐經(jīng)驗(yàn)

    摘要:阿里云效平臺基于理念的私有平臺實(shí)踐本文將系統(tǒng)的從個方面,分享互娛運(yùn)維團(tuán)隊(duì)對于運(yùn)維平臺實(shí)踐經(jīng)驗(yàn)及未來展望,希望對大家有一些參考意義。 CI Weekly 圍繞『 軟件工程效率提升』 進(jìn)行一系列技術(shù)內(nèi)容分享,包括國內(nèi)外持續(xù)集成、持續(xù)交付,持續(xù)部署、自動化測試、 DevOps 等實(shí)踐教程、工具與資源,以及一些工程師文化相關(guān)的程序員 Tips 。同步于 flow.ci Blog、微信公眾號、官...

    justCoding 評論0 收藏0
  • Docker部署基于Nodejs的Web應(yīng)用-實(shí)戰(zhàn)

    摘要:采用虛擬化的技術(shù)來虛擬化出應(yīng)用程序的運(yùn)行環(huán)境。安裝成功后,可以通過查看版本號盡量使用最新的穩(wěn)定版本。是鏡像名,是鏡像的版本號,到此你已經(jīng)成功構(gòu)建了一個新的鏡像,你可以通過,查看你的鏡像。部署時將此文件到生產(chǎn)環(huán)境服務(wù)器上。 Docker docker是一個開源的應(yīng)用容器引擎,可以為我們提供安全、可移植、可重復(fù)的自動化部署的方式。docker采用虛擬化的技術(shù)來虛擬化出應(yīng)用程序的運(yùn)行環(huán)境。此...

    marek 評論0 收藏0
  • Docker部署基于Nodejs的Web應(yīng)用-實(shí)戰(zhàn)

    摘要:采用虛擬化的技術(shù)來虛擬化出應(yīng)用程序的運(yùn)行環(huán)境。安裝成功后,可以通過查看版本號盡量使用最新的穩(wěn)定版本。是鏡像名,是鏡像的版本號,到此你已經(jīng)成功構(gòu)建了一個新的鏡像,你可以通過,查看你的鏡像。部署時將此文件到生產(chǎn)環(huán)境服務(wù)器上。 Docker docker是一個開源的應(yīng)用容器引擎,可以為我們提供安全、可移植、可重復(fù)的自動化部署的方式。docker采用虛擬化的技術(shù)來虛擬化出應(yīng)用程序的運(yùn)行環(huán)境。此...

    mikasa 評論0 收藏0
  • SegmentFault D-Day 上海站回顧:新熱技術(shù)與項(xiàng)目實(shí)戰(zhàn)

    摘要:上海站今天順利進(jìn)行了,沙龍的四位重量級的嘉賓都和大家分享了深度有趣的是技術(shù)內(nèi)容和別具一格的圓桌討論,從深入實(shí)踐,到的產(chǎn)品化實(shí)戰(zhàn)經(jīng)驗(yàn),再到最近新熱的和,是一場真正的技術(shù)實(shí)戰(zhàn)經(jīng)驗(yàn)分享。上海站嘉賓分享文檔及圓桌討論 SegmentFault D-Day 2015 上海站 今天順利進(jìn)行了,沙龍的四位重量級的嘉賓都和大家分享了深度有趣的是技術(shù)內(nèi)容和別具一格的圓桌討論,從 API 深入實(shí)踐,到 N...

    fireflow 評論0 收藏0
  • fir.im weekly - 「 持續(xù)集成 」實(shí)踐教程合集

    摘要:來這里看看的工程師如何進(jìn)行持續(xù)集成與持續(xù)部署。主要介紹了豆瓣移動持續(xù)集成和測試相關(guān)實(shí)踐,用工具化自動化社會化測試來解決遇到的問題,將打包發(fā)布環(huán)節(jié)自動化。這期的持續(xù)集成實(shí)踐分享就到這里。 我們??吹皆S多團(tuán)隊(duì)和開發(fā)者分享他們的持續(xù)集成實(shí)踐經(jīng)驗(yàn),本期 fir.im Weekly 收集了 iOS,Android,PHP ,NodeJS 等項(xiàng)目搭建持續(xù)集成的實(shí)踐,以及一些國內(nèi)外公司的內(nèi)部持續(xù)集成...

    A Loity 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<