亚洲精品成人_精品成人一区_999视频在线播放_免费黄色在线_亚洲成人久久久_久久www免费视频

雙機熱備

1. 介紹

文章主要介紹,EasySwoole 使用雙機熱備思路實現代碼不中斷部署。

2. 學習案例

    1. 先部署 9501 服務
    1. 單起一個進程,定時輪詢 Git 分支是否有新版本發布
    1. 如有新版本發布,clone 一份
    1. composer update 更新庫
    1. 啟動 9502 服務
    1. 更改 nginx 配置為 9502 并重啟

只要有新版本發布,就輪詢上面那幾個步驟

整個過程的簡單架構圖

image.png

3. 需要提前了解的知識點

  1. Nginx 負載均衡和反向代理
  2. EasySwoole 自定義進程
  3. Nginx reload 和 restart 的區別
  4. 雙機熱備

4. Nginx 配置

nginx.conf 配置文件示例

當有新版本發布的時候 EasySwoole 自定義進程會將 nginx.conf 的端口改為最新服務的端口

worker_processes  1;

events {
    worker_connections  1024;
}

http {

    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    sendfile        on;

    keepalive_timeout  65;

    ### 輪詢配置(這里是重點)
    upstream  easyswoole_release_upstream {
        server 127.0.0.1:9501;
        server 127.0.0.1:9502;
    }

    include servers/*;
}

es-release.conf 站點配置文件

該配置文件在 servers 目錄下。(此示例是以 Mac 本地環境作為運行環境)

server {
    listen 80;
    server_name easyswoole.release.com;

    location / {
        root html;
        index index.html index.htm;
        proxy_pass http://easyswoole_release_upstream; ### 這里是重點
    }
    access_log /usr/local/etc/nginx/logs/es.access.log main;
    error_log /usr/local/etc/nginx/logs/es.error.log error;
}

5. EasySwoole 代碼實現

代碼只提供實現思路,并且這種腳本,最好單獨去做,比如用 shell 腳本,防止服務宕機導致無法正常部署代碼

創建自定義進程類文件

<?php
/**
 * This file is part of EasySwoole.
 *
 * @link http://www.b3f21.cn
 * @document http://www.b3f21.cn
 * @contact http://www.b3f21.cn/Preface/contact.html
 * @license https://github.com/easy-swoole/easyswoole/blob/3.x/LICENSE
 */

namespace App\Release;

use EasySwoole\Component\Process\AbstractProcess;
use Swoole\Coroutine;

class Release extends AbstractProcess
{
    public function dolog($msg, $filename = '/Users/xxx/sites/release_log.log')
    {
        if ($msg) {
            error_log($msg . PHP_EOL, 3, $filename);
        }
    }

    protected function run($arg)
    {
        go(function () {
            while (true) {
                $shellLog = ' 2>> /Users/xxx/sites/release_log.log';
                $this->dolog(date('Y-m-d H:i:s') . '開始檢測代碼是否更新 ===> START <=== ');
                // 檢查 Git 是否有新代碼發布
                $diffExec = 'cd ' . EASYSWOOLE_ROOT . '; git fetch; git diff --stat master origin/master;';
                $this->dolog($diffExec);
                $pullResult = exec($diffExec);

                $this->dolog('git fetch res: => ' . json_encode($pullResult));

                if ($pullResult !== '') {
                    $this->dolog('有新版本發布' . json_encode($pullResult));
                    // 新版本項目的目錄
                    $newVersionPath = '/Users/xxx/sites/release-' . time();

                    // 開始 clone, 初始化代碼
                    ### 這里需要換成自己的 EasySwoole 項目的 github 地址
                    $cloneExec = "git clone https://github.com/huizhang-Easyswoole/release.git {$newVersionPath} {$shellLog};cd {$newVersionPath} {$shellLog};composer update {$shellLog}; {$shellLog}";
                    $this->dolog($cloneExec);

                    $res = exec($cloneExec, $output, $returnVar);
                    $this->dolog('git clone res: => ' . json_encode($res, JSON_UNESCAPED_UNICODE));
                    $this->dolog('新版本代碼 clone end');

                    // 判斷當前是哪個端口正在服務
                    $lsofExec = "lsof -i:9501 {$shellLog}";
                    $this->dolog($lsofExec);
                    $lsofResult = exec($lsofExec);
                    $newPort = 9501;
                    $oldPort = 9502;
                    if ($lsofResult !== '') {
                        $newPort = 9502;
                        $oldPort = 9501;
                    }

                    // 將另一個閑置的端口,替換到新版本中
                    $this->dolog('開始替換端口' . $newPort);
                    $devConfig = file_get_contents($newVersionPath . '/dev.php');
                    $devConfig = str_replace($oldPort, $newPort, $devConfig);
                    file_put_contents($newVersionPath . '/dev.php', $devConfig);

                    // 啟動新服務(這一刻新舊服務是同時存在的)
                    $this->dolog('新服務啟動');
                    $startExec = "cd {$newVersionPath}; php easyswoole.php server start -d {$shellLog}";
                    $this->dolog($startExec);
                    exec($startExec);

                    // 替換 Nginx 配置
                    $this->dolog('開始替換 nginx 端口');
                    ### 這里需要換成自己服務器環境 nginx 配置文件所在的目錄
                    $ngConfigPath = '/usr/local/etc/nginx/nginx.conf';
                    $ngConfig = file_get_contents($ngConfigPath);
                    $ngConfig = str_replace($oldPort, $newPort, $ngConfig);
                    file_put_contents($ngConfigPath, $ngConfig);

                    // 重啟 Nginx 服務
                    $this->dolog('重啟 nginx ');
                    $reloadNgExec = "nginx -s reload {$shellLog}";
                    $this->dolog($reloadNgExec);
                    exec($reloadNgExec);

                    // 停掉舊服務
                    $this->dolog('舊服務停掉');
                    $stopExec = "cd " . EASYSWOOLE_ROOT . "; php easyswoole.php server stop {$shellLog}";
                    $this->dolog($stopExec);
                    exec($stopExec);

                    // 每 30 秒同步一次代碼
                    Coroutine::sleep(30);
                } else {
                    Coroutine::sleep(10);
                    $this->dolog('無新版本更新');
                }
            }
        });
    }
}

注冊自定義進程

在框架的 EasySwooleEvent 事件(即項目根目錄的 EasySwoolEvent.php)中注冊自定義進程,示例代碼如下:

<?php
/**
 * This file is part of EasySwoole.
 *
 * @link http://www.b3f21.cn
 * @document http://www.b3f21.cn
 * @contact http://www.b3f21.cn/Preface/contact.html
 * @license https://github.com/easy-swoole/easyswoole/blob/3.x/LICENSE
 */

namespace EasySwoole\EasySwoole;

use App\Release\Release;
use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\EasySwoole\Swoole\EventRegister;

class EasySwooleEvent implements Event
{
    public static function initialize()
    {
        date_default_timezone_set('Asia/Shanghai');
    }

    public static function mainServerCreate(EventRegister $register)
    {
        ###### 注冊 雙機熱備服務 自定義進程 ######
        $processConfig = new \EasySwoole\Component\Process\Config([
            'processName' => 'Es-release', // 設置 自定義進程名稱
            'processGroup' => 'Es-release', // 設置 自定義進程組名稱
        ]);
        \EasySwoole\Component\Process\Manager::getInstance()->addProcess(new Release($processConfig));
    }
}

6. 測試

綁定 host

127.0.0.1 easyswoole.release.com

訪問 easyswoole.release.com

image.png

查看 Nginx 配置的端口

?  nginx cat nginx.conf | grep 950
           server    127.0.0.1:9501;

發布新版本

重新 clone 一份代碼,更改內容提交。

查看Nginx配置的端口

?  nginx cat nginx.conf | grep 950
           server    127.0.0.1:9502;
亚洲精品成人_精品成人一区_999视频在线播放_免费黄色在线_亚洲成人久久久_久久www免费视频
  • <kbd id="eqi2k"><code id="eqi2k"></code></kbd><cite id="eqi2k"><tbody id="eqi2k"></tbody></cite>
    亚洲电影免费| 国内精品嫩模av私拍在线观看| 狠色狠色综合久久| 久久久精品动漫| 国产欧美大片| 97超碰人人看人人| 国产精品美女诱惑| 欧美一区2区三区4区公司二百| 偷拍视频一区二区| 这里只有精品66| 在线观看亚洲视频啊啊啊啊| 欧美午夜精品| 亚洲 日韩 国产第一区| 欧美另类亚洲| 国产激情一区二区三区在线观看 | 51国偷自产一区二区三区| 国产精品久久久久久久久久久久冷 | 精品一区二区三区国产| 热re99久久精品国99热蜜月| 在线免费观看欧美| 欧美日韩精品久久| 4444kk亚洲人成电影在线| 精品在线不卡| 中文一区在线| 亚洲一区二区不卡视频| 日本福利一区二区三区| 麻豆亚洲精品| 亚洲一区不卡| 99成人免费视频| 亚洲日本欧美在线| 国产欧美一级| 亚欧洲精品在线视频免费观看| 国产视频久久| 高清国产在线一区| 精品一区久久久| 亚洲精品黄色| 日本电影一区二区三区| 51午夜精品| 99视频在线精品国自产拍免费观看| 久久99精品久久久久子伦| 99视频精品免费观看| 亚洲一区在线直播| 精品国产第一页| 性欧美精品一区二区三区在线播放| 国产精品亚洲欧美| 午夜精品视频| 欧美日韩一区二区三区在线视频 | 亚洲精品国产一区| 国产精品久久久一区二区三区| 亚洲无玛一区| 欧美福利视频| 亚洲一区二区四区| 欧美二区在线看| 国产区二精品视| 伊人久久大香线蕉综合75| 噜噜噜91成人网| 国内一区二区三区在线视频| 欧美二区在线看| 亚洲特色特黄| 欧美日韩国产综合在线| 91青青草免费观看| 国产一区二区三区久久久久久久久| 无遮挡亚洲一区| 久久亚洲综合网| 色狠狠久久av五月综合| 国产三区精品| 国产精品久久久久av福利动漫| 免费试看一区| 午夜老司机精品| 免费国产在线精品一区二区三区| 久久综合久久久| 一区二区三区在线观看www| 久久久久久99| 蜜桃狠狠色伊人亚洲综合网站| 成人片在线免费看| 999国内精品视频在线| 免费在线亚洲欧美| 亚洲一区欧美二区| 久久综合狠狠综合久久综青草| 久久国产成人| 国产v亚洲v天堂无码| 高清国语自产拍免费一区二区三区| 99在线观看视频网站| 国产精品久久久久免费| 久久精品国产99精品国产亚洲性色| 国产精品一区视频网站| 久久免费视频1| 天天好比中文综合网| 亚洲国产欧美日韩| 国内精品久久久久久久97牛牛 | 亚洲色图自拍| 99蜜桃在线观看免费视频网站| 国产日韩久久| 神马欧美一区二区| 国产字幕视频一区二区| 国产欧美另类| 高清免费日韩| 亚洲一区bb| 国产一区二区三区久久久久久久久| 91av一区二区三区| 日韩区国产区| 亚洲激情一区| 精品91免费| 女人天堂亚洲aⅴ在线观看| 久久综合九九| 一区二区三区四区视频在线观看 | 国产在线一区二| 亚洲精品乱码视频| 国产精品亚洲综合久久| 国产亚洲精品美女久久久m| 日韩福利在线| 国产日韩一区| 色之综合天天综合色天天棕色| 欧美久久综合| 国产一区二区三区无遮挡| 欧美一区二区三区另类| 久久久久国产精品午夜一区| 免费在线成人av| 在线视频免费在线观看一区二区| 动漫3d精品一区二区三区 | 精品国产一区二区三区四区vr | 国产亚洲欧美另类一区二区三区| 亚洲一卡二卡| 不卡视频一区二区| 国产精品大片| 国产一级二级三级精品| 亚洲欧洲精品一区| 动漫3d精品一区二区三区 | 国产女人水真多18毛片18精品| 午夜天堂精品久久久久| 国产高清一区二区三区| 国产精品黄色| 欧洲在线视频一区| 久久久噜噜噜久久狠狠50岁| 欧美激情视频一区二区三区免费| 久久亚洲高清| 亚洲区国产区| 欧美日韩国产综合视频在线| 国产传媒欧美日韩| 亚洲欧美视频一区二区三区| 中文字幕一区二区三区乱码 | 四虎永久国产精品| 成人av免费在线看| 国产婷婷精品| 国模大胆一区二区三区| 亚洲国产精品一区在线观看不卡| www.成人av| 欧美主播一区二区三区美女 久久精品人 | 奇米精品在线| 国产精品日韩高清| 国产欧美日韩亚洲| 在线精品一区二区| 欧美另类综合| 中文字幕一区二区三区有限公司 | 蜜桃传媒视频麻豆一区| 久久精品人人| 亚洲一区尤物| 亚洲狼人精品一区二区三区| 欧美 日韩 国产精品免费观看| 日产精品高清视频免费| 蜜桃日韩视频| 久久99精品久久久久久久久久| 97夜夜澡人人双人人人喊| 国产精品一区二区你懂得| 亚洲国产一区二区精品专区| 欧美日韩一区二区国产| 欧美/亚洲一区| 欧美日韩高清免费| 欧美日韩精品免费观看| 正在播放国产精品| 中文字幕日韩精品一区二区| 亚洲精品不卡| 欧美日韩国产综合视频在线| 欧美日本一区二区视频在线观看| 欧美日韩国产高清视频| 黄色一区二区三区四区| 亚洲精品九九| 亚洲欧美日韩一区在线观看| 另类图片国产| 国产欧美在线一区二区| 国内视频一区| 青青草成人激情在线| 日本一区二区三区视频免费看| 日韩精品另类天天更新| 亚洲视频电影| 欧美片第1页综合| 在线成人www免费观看视频| 亚洲深爱激情| av观看久久| 日韩精品国内| 尤物网精品视频| 999视频在线免费观看| 国产一区二区三区四区hd| 日韩一区二区电影在线观看| 一本久久a久久精品vr综合| 午夜精品亚洲| 鲁大师成人一区二区三区| 国产伦精品一区二区三区四区免费 | 一区精品久久| 91国产丝袜在线放|