docker 安装部署 zabbix

安装:

# 安装 zabbix server
docker run --name zabbix-server-mysql -t \
       -e DB_SERVER_HOST="172.17.0.1" \
       -e MYSQL_DATABASE="zabbix" \
       -e MYSQL_USER="zabbix" \
       -e MYSQL_PASSWORD="zabbix" \
       -p 172.17.0.1:10051:10051 \
       -d zabbix/zabbix-server-mysql:5.4-alpine-latest

# 安装 zabbix web
docker run --name zabbix-web-nginx-mysql -t \
       -e DB_SERVER_HOST="172.17.0.1" \
       -e MYSQL_DATABASE="zabbix" \
       -e MYSQL_USER="zabbix" \
       -e MYSQL_PASSWORD="zabbix" \
       --link zabbix-server-mysql:zabbix-server \
      -p 172.17.0.1:8080:8080 \
      -d zabbix/zabbix-web-nginx-mysql:alpine-5.4-latest

删除:

docker stop zabbix-server-mysql
docker container rm zabbix-server-mysql

docker stop zabbix-web-nginx-mysql
docker container rm zabbix-web-nginx-mysql

关于仪式感

我在公司负责的项目是某内部系统,两年前项目启动时,团队便以“敏捷”的方式进行运作。每天早上团队成员会进行晨会,晨会过程是每个成员讲昨天完成了什么,今天计划做什么,有没有遇到什么困难,是否需要团队其它成员支持。持续两三周的晨会后,我开始变得不理解晨会的必要性,甚至觉得这会耽误我们一会儿用来开发写代码的时间。我之所以有这种想法大概是因为我发现我并不能从晨会获得太多有价值的信息,整个晨会变得形式化了。因为“敏捷”一般有晨会,因此我们团队也进行晨会,我是这么想的。

之后的有一天,我约老板一起吃午饭,饭间聊起了这个话题。总监给我提供了一个角度,叫“仪式感”。早上大家来到公司,可能不一定能马上进入工作状态,吃吃早餐,喝喝水,看看邮件,看看消息推送,时间就不知不觉过去了。“晨会”作为一种仪式,提醒大家从这一刻开始,今天的工作就开始了,可以帮助大家更快进入工作状态。

人们常说,生活需要仪式感。我是一个不太注重仪式感的人,所以有时往往会让家里的亲人感觉我不够重视一些特殊的日子。

武汉因为新冠病毒疫情,缺少医务工作者,全国各地医院派去医生护士支援,等到疫情结束时,他们完成任务回到自己城市,市里警车开道,市长迎接,场面十足。以前的我可能会觉得这太表面功夫了,不如直接发一些补助更实在。但现在的我也会被这些画面感动,我想如果我是其中一名医务工作者,我也一定会感到自豪。

Node.js vs Amp vs Swoole vs Go helloworld web server performance

server.js

const http = require('http');

const hostname = '0.0.0.0';
const port = 1337;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.end('Hello World!');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

server.php

<?php
require __DIR__ . '/vendor/autoload.php';
error_reporting(-1);
use Amp\Http\Server\RequestHandler\CallableRequestHandler;
use Amp\Http\Server\Server;
use Amp\Http\Server\Request;
use Amp\Http\Server\Response;
use Amp\Http\Status;
use Amp\Socket;
use Psr\Log\NullLogger;

// Run this script, then visit http://localhost:1337/ in your browser.

Amp\Loop::run(function () {
    $sockets = [
        Socket\listen("0.0.0.0:1338"),
    ];
    
    $server = new Server($sockets, new CallableRequestHandler(function (Request $request) {
        return new Response(Status::OK, [
        ], "Hello World!");
    }), new NullLogger());

    yield $server->start();

});

swoole.php

<?php
$http = new swoole_http_server("127.0.0.1", 9501);
$http->on("start", function ($server) {
    echo "Swoole http server is started at http://127.0.0.1:9501\n";
});

$http->on("request", function ($request, $response) {
    $response->end("Hello World");
});

$http->start();

server.go

package main

import (
    "fmt"
    "log"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello World")
}

func main() {
    http.HandleFunc("/", handler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

测试命令为:ab -c1000 -n30000 http://127.0.0.1:1337/

最后结果对比如下:

结论:AMP异步非阻塞框架实现的web server性能最差,swoole和go性能相当。本测试只供参考。

Linux 已启动的进程后台运行

0. Run some SOMECOMMAND
1. ctrl+z to stop (pause) the program and get back to the shell
2. bg to run it in the background
3. disown -h so that the process isn’t killed when the terminal closes
4. Type exit to get out of the shell because now your good to go as the operation will run in the background in it own process so its not tied to a shell

flowable 配置运行在 MySQL 数据库

flowable 下载下来后有五个war文件直接放到 Tomcat webapps 目录下即可使用,默认使用h2内存数据库,如果尝试更改配置文件使用MySQL会提示 com.mysql.jdbc.Driver 这个类不存在或找不到。

(更优解决方案请参考本文评论。)

解决方法是重新编译打包,步骤如下:

下载 flowable 源代码后,分别进去 flowable-app-rest , flowable-ui-modeler, flowable-ui-idm, flowable-ui-task 等目录使用

mvn -Pmysql package

命令进行编译打包,进入 flowalbe-ui-admin 目录使用

mvn -Pdev package

命令进行编译打包,将 war 放到 Tomcat webapps 目录下,启动Tomcat会自动解压得到同名目录,然后修改对应数据库配置即可。

将图片由 RGB 转为 CMYK 格式

$file = 'orignal.png';
$file_cmyk = str_replace('.png', '_cmyk.jpg', $file);
$icc1 = \Yii::getAlias('@vendor/imagine/imagine/lib/Imagine/resources/color.org/sRGB_IEC61966-2-1_black_scaled.icc');
$icc2 = \Yii::getAlias('@vendor/imagine/imagine/lib/Imagine/resources/Adobe/CMYK/USWebUncoated.icc');
$cmd = "convert $file -intent relative -black-point-compensation -profile $icc1 -profile $icc2 -quality 100 $file_cmyk";
system($cmd);

 

PHP-PM 执行原理

大体流程如下:主进程监听两个socket,一个接收外部 http 请求(web 服务器),另一个与子进程通信。主进程通过 proc_open 调用创建子进程,每个子进程会监听一个 socket(http 服务器),主进程将 http 请求转发给子进程进行处理。子进程在 bootstrap 阶段会 new 一个 Application (假设是 symfony 框架),后面所有的请求都不会再重复初始化 Application (因此比传统 PHP-FPM 执行速度快)。

画了一个图