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

雙機(jī)熱備

1. 介紹

文章主要介紹,EasySwoole 使用雙機(jī)熱備思路實(shí)現(xiàn)代碼不中斷部署。

2. 學(xué)習(xí)案例

    1. 先部署 9501 服務(wù)
    1. 單起一個(gè)進(jìn)程,定時(shí)輪詢 Git 分支是否有新版本發(fā)布
    1. 如有新版本發(fā)布,clone 一份
    1. composer update 更新庫
    1. 啟動(dòng) 9502 服務(wù)
    1. 更改 nginx 配置為 9502 并重啟

只要有新版本發(fā)布,就輪詢上面那幾個(gè)步驟

整個(gè)過程的簡(jiǎn)單架構(gòu)圖

image.png

3. 需要提前了解的知識(shí)點(diǎn)

  1. Nginx 負(fù)載均衡和反向代理
  2. EasySwoole 自定義進(jìn)程
  3. Nginx reload 和 restart 的區(qū)別
  4. 雙機(jī)熱備

4. Nginx 配置

nginx.conf 配置文件示例

當(dāng)有新版本發(fā)布的時(shí)候 EasySwoole 自定義進(jìn)程會(huì)將 nginx.conf 的端口改為最新服務(wù)的端口

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;

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

    include servers/*;
}

es-release.conf 站點(diǎn)配置文件

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

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

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

5. EasySwoole 代碼實(shí)現(xiàn)

代碼只提供實(shí)現(xiàn)思路,并且這種腳本,最好單獨(dú)去做,比如用 shell 腳本,防止服務(wù)宕機(jī)導(dǎo)致無法正常部署代碼

創(chuàng)建自定義進(jìn)程類文件

<?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') . '開始檢測(cè)代碼是否更新 ===> START <=== ');
                // 檢查 Git 是否有新代碼發(fā)布
                $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('有新版本發(fā)布' . json_encode($pullResult));
                    // 新版本項(xiàng)目的目錄
                    $newVersionPath = '/Users/xxx/sites/release-' . time();

                    // 開始 clone, 初始化代碼
                    ### 這里需要換成自己的 EasySwoole 項(xiàng)目的 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');

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

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

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

                    // 替換 Nginx 配置
                    $this->dolog('開始替換 nginx 端口');
                    ### 這里需要換成自己服務(wù)器環(huán)境 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 服務(wù)
                    $this->dolog('重啟 nginx ');
                    $reloadNgExec = "nginx -s reload {$shellLog}";
                    $this->dolog($reloadNgExec);
                    exec($reloadNgExec);

                    // 停掉舊服務(wù)
                    $this->dolog('舊服務(wù)停掉');
                    $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('無新版本更新');
                }
            }
        });
    }
}

注冊(cè)自定義進(jìn)程

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

<?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)
    {
        ###### 注冊(cè) 雙機(jī)熱備服務(wù) 自定義進(jìn)程 ######
        $processConfig = new \EasySwoole\Component\Process\Config([
            'processName' => 'Es-release', // 設(shè)置 自定義進(jìn)程名稱
            'processGroup' => 'Es-release', // 設(shè)置 自定義進(jìn)程組名稱
        ]);
        \EasySwoole\Component\Process\Manager::getInstance()->addProcess(new Release($processConfig));
    }
}

6. 測(cè)試

綁定 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;

發(fā)布新版本

重新 clone 一份代碼,更改內(nèi)容提交。

查看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>
    在线亚洲美日韩| 成人激情直播| 国产精品嫩草99av在线| 女同性一区二区三区人了人一| 秋霞在线观看一区二区三区| 日本在线高清视频一区| 亚洲春色在线视频| 日本视频精品一区| 午夜精品一区二区在线观看| 一本一生久久a久久精品综合蜜| 欧美一区二区三区四区夜夜大片 | 午夜久久福利| 黄色一区三区| 99精品欧美一区二区三区| 国产精品亚洲不卡a| 99视频国产精品免费观看| 久久99国产精品99久久| 日韩成人av电影在线| 女同性一区二区三区人了人一| 日韩欧美精品一区二区三区经典| 欧美xxx在线观看| 性感少妇一区| 日本一区视频在线观看| 黄色亚洲在线| 国产精品播放| 在线观看日本一区| 亚洲一区观看| 欧美一二三区| 99这里有精品| 久久久久欧美| 伊人久久大香线蕉av超碰演员| 午夜一区二区三视频在线观看| 成人黄动漫网站免费| 影音先锋亚洲视频| 99亚洲一区二区| 国产日韩精品久久| 欧美日韩最好看的视频| 亚洲激情一区| 日韩国产精品一区二区三区| 国产毛片一区| 日韩精品久久久免费观看| 在线视频一区观看| 日本不卡高清视频一区| 亚洲高清视频一区| 欧美精品一区二区视频| 影音先锋久久久| 麻豆精品视频| 久久久久久国产精品mv| 亚洲欧美日韩在线综合| 91久久爱成人| 亚洲一二三区精品| 青青影院一区二区三区四区| 欧美午夜久久| 欧美不卡在线一区二区三区| 亚洲精品字幕| 一区二区三区av| 午夜在线观看免费一区| 亚洲欧美一区在线| 免费不卡亚洲欧美| 国产一区二区黄色| 国产精品地址| 日韩精品久久久| 高清国产在线一区| 亚洲一区三区视频在线观看| 一区二区三区在线视频看| 国产精品二区三区四区| 国内成人在线| 亚洲欧美国产精品桃花| 精品毛片久久久久久| 麻豆精品传媒视频| 国产日韩一区| 亚洲第一黄色| 午夜亚洲福利| 欧美精品一区二区三区在线看午夜| 国产日韩综合| 亚洲国产日韩美| 日韩午夜在线| 免费看亚洲片| 99一区二区三区| 国产欧美亚洲日本| 久久99国产精品99久久| 美女视频久久| 视频一区二区在线观看| 亚洲欧美综合一区| 午夜欧美理论片| 亚洲视频中文| 亚洲一级在线| 91精品国产综合久久久久久丝袜| 91传媒视频在线观看| 91免费观看| 精品亚洲欧美日韩| 日本在线播放不卡| 午夜久久一区| 99国产精品久久久久久久成人热| 一本色道久久| av色综合网| 日本一区二区在线| 欧美日韩国产三区| 亚洲欧美日韩综合国产aⅴ| 99re在线观看视频| 欧美日韩喷水| 欧美喷水视频| 久久久久一区二区三区| 精品人伦一区二区三区| 亚洲一二区在线| 99re国产精品| 精品久久久久久亚洲| 欧美国产免费| 久久久精品动漫| 欧美国产二区| 狠狠综合久久| 国产精品制服诱惑| 在线观看福利一区| 久久国产精品亚洲77777| 精品日本一区二区三区在线观看| 亚洲一区二区在| 国产伦精品一区二区| 久久久精品动漫| 国产精品v一区二区三区| 每日更新成人在线视频| 日本高清不卡一区二区三| 亚洲国产精品123| 国产一区二区三区色淫影院| 欧美日韩国产免费观看| 99热在线国产| 欧美私人啪啪vps| 国产精品久久久久久久小唯西川 | 国内精品久久久久久久影视蜜臀 | 日韩中文一区| 免费亚洲一区二区| 亚洲人成网站在线播放2019| 亚洲一区日韩| 一区在线电影| 国产激情一区二区三区在线观看 | 国产一区精品在线| 国产精品v一区二区三区| 高清一区二区三区视频| 国产尤物精品| 美国av一区二区三区| 国产亚洲精品久久飘花| 四虎一区二区| 国产欧美亚洲日本| 国产视频亚洲| 欧美在线资源| 明星裸体视频一区二区| 久久高清一区| 国内成人在线| 日韩免费av一区二区三区| 乱人伦精品视频在线观看| 椎名由奈jux491在线播放 | 欧美日韩在线一区二区三区| 午夜在线精品偷拍| 亚洲天堂偷拍| 一区二区视频在线免费| 国产精品乱子乱xxxx| 99亚洲一区二区| 国产一区日韩一区| 深田咏美在线x99av| 国产区二精品视| 久久一区激情| av不卡在线看| 国产精品porn| 亚洲制服欧美久久| 日本一区二区三区四区在线观看| 成人欧美视频在线| 久久国产精品亚洲va麻豆| 亚洲美女视频在线免费观看 | 欧美99久久| 亚洲国产精品视频一区| 女女同性女同一区二区三区91| 91精品黄色| 久久国产手机看片| 亚洲免费综合| 国产乱码精品| 国产亚洲精品久久飘花| 亚洲精品一区二区三区av| 欧美日韩在线精品一区二区三区| 亚洲v国产v| 亚州欧美一区三区三区在线| 日韩精品一区二区三区四区五区| 久久久久免费网| 老牛影视免费一区二区| 蜜桃免费一区二区三区| 久久国产手机看片| 欧美日本韩国在线| 日韩av一区二区三区在线观看| 免费中文日韩| 午夜视频久久久| 在线一区日本视频| 国产在线欧美日韩| 亚洲午夜精品久久| 99国产精品久久久久老师| 在线视频亚洲| 91成人免费在线观看| 96久久精品| 欧美精品尤物在线| 在线免费观看一区二区三区| 欧美日韩一区在线播放| 91久久夜色精品国产九色| 国产精品毛片在线看|