Git如何回滚代码?

摘要: 多年以后,你面对一个需要回滚的Git仓库,准会想起这篇博客。

未分类

某一天,用户跟我反馈,他不能分配任务了。我去看了一下Fundebug捕获的报错信息:

未分类

可知,出错原因是前端发送的请求参数有问题。这个悲伤的故事是这样的:后端同时修改了多个接口,但是前端没有及时修改对应的接口调用。

这个问题不难解决,回滚代码就好了,但是,Git如何回滚代码呢?我花了点时间研究了一下。

测试仓库:Fundebug/git-rollback

https://github.com/Fundebug/git-rollback

我写了一个非常简单的测试仓库,master分支只有3个commit,每个commit只是添加一个文件,因此一共有3个文件:01.txt, 02.txt, 03.txt。

git log
commit b39476b9c730d312266fe9bc7f63e795f9ba856f
Author: kiwenlau <[email protected]>
Date:   Thu Jan 18 14:58:06 2018 +0800

    3个文件

commit 3821210392184432de18b596cee58ab7924e39f9
Author: kiwenlau <[email protected]>
Date:   Thu Jan 18 14:57:38 2018 +0800

    2个文件

commit 55d3012564e94a39f6686c0e532c0459ddc41ec4
Author: kiwenlau <[email protected]>
Date:   Thu Jan 18 14:56:41 2018 +0800

    1个文件

本文介绍的所有回滚代码的命令,都会在一个新的分支执行,方便大家理解:

未分类

git revert : 撤销特定commit

Git的每一个commit都对应着某些代码改动,那万一改错了呢?这时可以使用git reset来撤销某一次commit的改动。所谓撤销,就是把修改了的代码再改回来。

示例1

最简单的一个场景,就是撤销最近的1次commit:

git revert HEAD

最近1次commit是新增03.txt,撤销这个commit之后,test01分支就只剩下2个文件了:01.txt, 02.txt。

示例2

有时,可能需要撤销某个特定commit,比如,当我需要撤销第2个commit时,指定对应ID即可:

git revert 3821210392184432de18b596cee58ab7924e39f9

最近1次commit是新增02.txt,撤销这个commit之后,test02分支就只剩下2个文件了:01.txt, 03.txt。

由这个示例可知,使用git revert撤销commit时,仅仅针对所撤销的commit,与任何其他commit无关。

示例3

假设我们再做某个功能时,进行了多次commit,需要全部撤销。我们当然可以一个个commit依次revert,这样比较麻烦,其实可以一次性搞定:

git revert b39476b9c730d312266fe9bc7f63e795f9ba856f 3821210392184432de18b596cee58ab7924e39f9

撤销了后面2个commit,test03分支就只剩下1个文件了:01.txt。

示例4

示例3中所撤销的2个commit是连续的,其实,因为revert操作只与单个commit相关,我们也可以撤销多个非连续的commit:

git revert b39476b9c730d312266fe9bc7f63e795f9ba856f  55d3012564e94a39f6686c0e532c0459ddc41ec4

撤销了第1个和第3个commit,test04分支就只剩下1个文件了:02.txt。

git reset:重置为特定commit

示例5

在示例3中,撤销了两个连续的commit,这样做等价于将代码重置为第1个commit的状态:仅有01.txt这1个文件。使用git revert命令有些麻烦,我们可以直接使用git reset命令来实现:

git reset –hard 55d3012564e94a39f6686c0e532c0459ddc41ec4
将仓库强制重置为第1个commit,这样test05分支就只剩下1个文件了:01.txt。git reset –hard与git revert效果看起来一样,但是不同点在于,前者直接删除了后面2个commit及其代码,没有保存commi历史,因此这个操作是不可逆的!使用时应该特别小心。

如果你的本地仓库与远程仓库在reset之前是同步过的,reset之后,两者的commit不一致,本地仓库的commit落后与远程仓库,这样会导致push失败:

git push
To [email protected]:Fundebug/git-rollback.git
 ! [rejected]        test05 -> test05 (non-fast-forward)
error: failed to push some refs to '[email protected]:Fundebug/git-rollback.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

这是需要使用–force选项,这样远程仓库会被强制覆盖:

git push --force

示例6

reset时使用–hard选项是一个很危险的操作,因为它把commit以及代码全删了,没法恢复。如果你只希望删除commit,而保留修改过的代码的话,可以使用–soft选项。

git reset --soft 55d3012564e94a39f6686c0e532c0459ddc41ec4

这时,后面2个commit也被删除了,当前commit为第1个commit。但是,02.txt与03.txt并没有被删除。

git status
On branch test06
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   02.txt
    new file:   03.txt

这就意味着,当你的commit的代码有一些小问题时,可以重置commit,修改一下代码,如何重新commit即可。

参考

  • https://git-scm.com/docs/git-revert

  • https://blog.fundebug.com/2018/01/24/git-rollback-tutorial/

场景式解读 Git 工作流

未分类

很开心跟大家分享我自己对工作流的理解,包括我们公司自身正在进行的实践,还有 Coding 的一些用户提出的他们对于工作流的理解。
我希望在今天讲座之后在座的各位可以根据自身开发的具体工作内容,团队的规模和开发的形式,从我提出的几种工作流中找到自己合适的套路,也可以在自有的套路上扩展支撑自己公司特定的流程。

工作流

什么叫好的工作流呢?适合你的场景就是好,所以今天聊得是场景式解读工作流。工作流从字面意义上理解可以涵盖你工作的各个方面,包括任务管理产品最终上线的反馈,但是我们这边讲工作流只是用 Git 管理代码中,你与别人代码仓库如何协作的工作流。

未分类

这张图可以简单的看什么是 Git 工作流,有开发分支,有主干分支,主干分支上有一些发布,这是一个比较简略的工作流。
我从协作人员数量和开发周期这两个维度划分四个象限出来,划分了几类比较常见的场景。我将详细说明这四种场景下,如何进行工作流的选择。

未分类

工作人员数量比较少的,开发周期比较短的往往是小型外包项目。比如可能是小型外包公司,三五个人的团队,有前端和后端,项目可能是三个月,更快的是两个月搞定,没有后续维护的压力,这个项目交付之后基本告一段落,我想说的是项目即便不是外包项目,但若符合协作人员数量少,开发的周期短也适合这种工作流。

此外还有协作人员数量多,开发周期比较短。比如一个大型外包项目。项目往往有各种模块系统的集成,整个开发团队达到几十个人的规模,不同的人在为各个模块做开发工作,属于图示中第二种工作场景。

也有些项目,协作人员数量比较少,开发周期比较长。比如开源项目,你开发一个开源软件,定期可能要发布一些版本,偶尔还要接受一些其他人发过来的贡献。

最后一类是最复杂、最麻烦的,但却是很多互联网公司的真实使用场景,维护一整套线上运行的系统,但是这套系统没有开发终点,只是不停的在迭代,整个服务庞大,功能模块众多,开发人员的并行性也比较强。
大致上我认为解决中小型团队工作流的场景就分为这四种,我们来分别阐述一下适合他们的工作流程。

小型外包项目

未分类

小型外包项目大家往往都是三五个人在一起工作,沟通成本低,效率高,Code Review 需求不强,很多人说 Code Review 需求强不强不是项目决定的,但是小型外包项目具体的目的是尽快的帮客户把代码交付,即便我极力推荐 Code Review,然而在显示中这个过程事实上在大多数的外包公司并不存在。

未分类

小型外包项目的工作流其实非常的简单,一条主干就足够了,三五个人在一条分支上开发,你的代码写完提交上来,别人同步下来然后再提交,当某一个版本合适发布的时候发给客户验证,有问题的话再去修复再发一个版本,非常简单。如果是这种形式的项目,一条分支解决所有问题,不要让复杂的工作流变成你工作的绊脚石。

小型开源项目

未分类

小型开源项目往往是由个人或者小团队维护,特点是往往要接受第三方的贡献,Code Review 的需求强烈,在开源社区内 Code Review 是比较重要的过程;还有一个特点是开源项目往往有维护多个版本的需求,与小型外包项目不太一样,小型外包项目你跟客户交付的软件很少有 1.0 继续维护,2.0 继续维护的概念。

未分类

小型开源项目其实它的流程相对也是比较简单,可以看到这边其实有一个分支(红色的线),下面有紫色的点是主的开发分支。主开发分支上往往是 Master,主开发分支上会有很多提交,团队的成员来提交,包括第三方的爱好者看到你的代码觉得不错,从这边 Fork 得到一个自己的项目,做完一些贡献之后提交 Pull Request 到主干分支这里来,在这个过程中可以进行 Code Review,而最终发布的过程是由开源项目的维护者来决定的。开源项目也有可能维护多个版本的情况,维护多个版本就是多条分支线(红色)。

大型外包项目

未分类

大型外包项目的特点是开发人员比较多、分模块并行开发,Code Review 的需求强烈,此外需要比较短的时间内把这么大规模的项目做出来,分模块进行开发,并行开发也是必然的。

未分类

我们看一下大型外包项目比较适合用什么样的形式。
这个工作流从本质上来讲是基于特性分支来做的工作流,大型外包项目往往也没有多个大版本,一般情况下只有一个主版本,这条黑色的线就是主分支,主分支上可能有多个团队,多个团队负责不同的模块开发,某个团队基于主干开一个特性分支,提交完毕之后会发一个 MR 到主干分支来,在这个过程中可以做 Code Review,在这个过程中可以使用 Coding 的工具列出这个分支相对于主干分支的差异,评审通过后就可以合并到主干上去。其他的团队也可能会在不同的 Master 上的节点新建分支来进行开发。

并性开发的情况下,如果两个小组开发的内容是属于同一个模块,他们两个产生冲突的可能性非常大。如果说他们开发的功能是相对独立的,比如说这个是模块A 这个是模块B,这个人专门做账户系统,这边的人做订单的系统,那么他们两个冲突概率比较小。本质上讲,冲突的根本原因在于并行开发同一个文件,跟用什么版本控制工具和用什么分支管理模型都没有关系。并行开发的情况下避免冲突的点不在于一定要把这些分支做成一致,而是尽量的让这些部门和分支上开发的内容在项目层面上拆成不同的模块,通过项目模块划分方式减少冲突。
并行开发这种模型一条主干分支开若干个特性分支,特性分支经过评审合并到主干,主干还是会像小型外包项目一样由项目经理决定什么时间何时发布打个标签交给客户。

大型互联网项目

未分类

大型互联网项目是比较麻烦的,往往开发人员多,还会有一些紧急的情况。比如有一天你的用户突然告诉你的网站会泄露密码,我们需要立即快速的做线上修复。这跟传统外包项目不太一样,传统外包项目就算开发过程中已知现在项目的代码有 Bug,但是因为这个版本还没有交付给客户,不用一定要让团队停下工作立即将问题修复之后才能继续。

互联网项目往往 Code Review 的需求强烈,它是从源码的角度上,就是在提交的时候尽可能的避免线上问题的出现性。

未分类

图上黑色的一条线是 Master 分支,主分支上有很多提交的点,某一个团队可能基于某个点上进行开发,像刚才的大型外包公司类似,开一个分支,开发某一个功能,某个功能开发完毕的时候提交到 MR。

但这个过程会被线上出现紧急问题打断,我们需要基于线上的版本立即开一个新的分支,做一个快速的修复再合并到主干分支上去(hotfix)。

主干分支的每一个节点都代表一次线上的成功发布,主干分支最新的点代表现在线上运行的最新的版本。这就带来一个好处:主干分支上的点可以用来作为开发的基准。因为所有开发者都是基于主干分支做开发,这就要求保证主干分支上的代码必须是稳定可靠的,否则容易出现 A 在 B 的不可靠的代码基础上做了开发,如果最终验证 B 的代码有问题,需要回退的时候,往往会牵连到 A 的正常代码,这无疑是一种效率的降低。

而什么样的代码是“稳定可靠的代码”呢?当然大家的评判标准不同:

可能是:高级程序员写的代码
可能是:经过评审的代码
可能是:经过测试的代码
而最可靠的是:经过评审,测试,并最终经过生产环境验证的代码。

从这个角度考虑,我们提高“稳定可靠的代码”的审核标准,让主干分支最新版本始终与线上生产环境运行版本对应就可以避免掉这类的效率降低,同时因为更严苛的代码并入主干的标准使得线上的生产环境极大的减少因为代码 bug 导致的生产事故。

那某个分支基于比较老旧的版本开发,它的功能还没有开发完毕,而线上的版本有其他的团队开发,已经更新上线,导致这个东西落后怎么办呢?有两种办法:一种是 Rebase,Base 就是基准,Rebase 就是变更基准,图示有两个 Feature2,第二个 Feature2 就是 Rebase 之后的。另一种是 Merge ,Merge 是从主干分支往特性分支做合并,跟常规的 Merge Request 是反的,合并之后即可实现同步到所有主干上的代码,就不再落后了。所以两种方式解决你的特性分支落后于主干的情况,具体的情况可能与可根据不同的团队偏好调整。

Git 的工作原理

关于 Git 的原理,很多人听了分支、合并不知道怎么回事,很多人用了很久也不知道 Git 到底怎么存储文件。

未分类

这张图里可以看到有一条红色的线,这条红色的线是提交的历史,它对应于每个开发修订版列表,也对应于某一个主干分支。这条线的最新版本是 Master 和 v1.0 所指向的版本,v1.0 是一个标签,Master 是个分支,他们其实都指向一个具体的修订版(绿色的原点),你改一次代码、提交一次会产生一个新的修订版,这些分支会指向不同的修订版,这些指向是会变的。

我们都知道 Git 所管理的是代码库,而代码库就是一个文件夹,文件夹有很多代码和文件夹,文件夹有子文件夹,子文件夹中又有文件,Git 的每一个修订版都会对应一个 Tree,目录里面有很多子目录,子文件。

Git 的原理很简单,每一个修订版对应一个 Tree,每一个 Tree 又包含了所有版本的文件。

小贴士

冲突

我经常会收到一些用户和朋友的疑问,比如出现了冲突报错。冲突是什么呢?该如何解决呢?
先讲如何解决,解决冲突需要你决定这个冲突端内容最终应该是什么样的形式,解决完冲突的这个文件就是是你想要的最终结果,冲突解决是以业务为目的让原文件呈现最终状态的过程。

虽然冲突解决有一套理论,但是我们更希望从最初避免问题。在并行开发中,不同的开发者之间修改了同一个文件和同一个模块,就有可能产生冲突,一个东西被两个人改了,Git 就不知道该怎么处理。所以冲突的避免不是你使用什么流程模型、也不是使用什么代码管理工具解决,而是由你们的工作安排来解决的,避免的方式是让代码的结构划分的更合理,让不同的模块更为独立。

大文件

大型文件往往会严重拖慢 Git 的性能,Git 的性能消耗不光存在于代码托管的服务器端,也体现在用户端。主要影响是计算文件的 sha1 哈希和压缩,大型文件这两个操作都很慢。Git 本质上是用来管理原代码而不是管理大文件的,如果真的是想把大文件存在 Git 中推荐使用 Git LFS。

Git Bisect

都说 Git 是用来存储原代码仓库的可以帮你追溯历史,但很多人不知道该怎么干。例如说忽然出现一个 Bug,查遍所有资料,还是无法定位问题,那如何找到导致问题代码呢?Bisect 会让你快速的找到到底是哪一个提交导致的这个问题,你只需要告诉 Git 到底这个版本是好是坏就可以了。

具体点来讲是开始 Bisect 后,Git 会自动检出一个版本,你告诉他这个版本有没有这个bug,不管有还是没有,Git 都会在最小的可能范围中基于二分查找法给出下一个验证的提交,直至最终找到导致问题的提交。

Git Work-tree

有时候我们需要同时查看一个仓库内不同版本的文件,或者有需要同时编译多个不同版本的源代码。这时候直接使用 git checkout 是很麻烦的,必须不断的把版本来回切换,而使用 work-tree 可以很方便的给一份 git 仓库设置多个检出目录树(工作区)。

希望大家可以根据自己团队的实际情况及使用场景,找到适合自己的工作流。

Zabbix监控(JVM):Tomcat

Zabbix3.4.0通过JVM监控Tomcat

一、安装zabbix

参考:
https://www.jianshu.com/p/5b6541681700

二、配置Tomcat JMX

编辑catalina.sh,加入如下配置

CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote #开启远程监控
-Dcom.sun.management.jmxremote.port=12345 #远程监控端口
-Dcom.sun.management.jmxremote.ssl=false #远程ssl验证为false
-Dcom.sun.management.jmxremote.authenticate=false #关闭权限认证
-Djava.rmi.server.hostname=192.168.9.74" #部署了tomcat的主机地址

重启tomcat

验证是否启动JMX监听成功

[root@localhost tomcat6]# lsof -i:12345
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java    26944 root   18u  IPv6 4076076      0t0  TCP *:italk (LISTEN)

至此,Tomcat已经支持JMX.

三、配置zabbix_server

Zabbix通过JMX监控Tomcat的对应关系:
zabbix_server开启java poller, zabbx_java开启JavaGateway,端口为10052,Tomcat JMX开启12345提供性能数据。
数据获取:java pollerJavaGateway:10052Tomcat:12345.

zabbix_server:默认未启用JavaPollers,
启用JabaPollers,编辑/usr/local/zabbix/etc/zabbix_server.conf,加入三行代码:

JavaGateway=127.0.0.1
JavaGatewayPort=10052
StartJavaPollers=5

重启zabbix_server.
zabbix_java:按照步骤一安装可直接启动zabbix_java(安装编译中带了–enable-java参数),
启动路径参考:/usr/local/sbin/zabbix_java/startup.sh
rpm包安装gateway,需要java,java-devel依赖

安装yum源:yum install -y http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm
安装gateway:yum install -y  java  java-devel  zabbix-java-gateway 

检查启动情况

[root@portal zabbix_java]# lsof -i:10052
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java    27021 root   12u  IPv6 5221678      0t0  TCP *:10052 (LISTEN)

Tomcat JMX:按照步骤二安装没问题可略过

四、zabbix监控端web界面配置

主机增加JMX接口

①进入后台,configuration(配置)->hosts(主机)->选择你的主机->找到这一项jmx interface(JMX接口) 点击add,输入对应的tomcat ip地址和jmx端口

②点击主机的模版选项,添加以下两个模板

[Template App Apache Tomcat JMX]
[Template App Generic Java JMX]

点击添加,然后更新。

zabbix中使用ICMP ping监控服务器是否存活

1、安装Fping

下载Fping安装包 http://www.fping.org/
http://www.fping.org/dist/fping-3.10.tar.gz

tar -zvxf fping-3.10.tar.gz
cd fping-3.10
./confingure
make
make install

2、设定fping程序的目录

fping的默认安装目录在usr/local/sbin下,而在zabbix_server.conf配置文件中fping程序的目录是/usr/sbin/,这里可以做链接文件或者修改zabbix_server.conf配置文件的FpingLocation的值,总之一个目的,让zabbix知道fping程序的位置。

3、更改fping程序的权限

zabbix运行时是以普通用户身份运行的,而普通用户是没有权限构建ICMP,因此需要给fping程序加上强制位setuid,让普通用户运行该程序时以root的身份运行,命令:chmod u+s /usr/local/sbin/fping

Zabbix之CentOS7.3下yum安装Zabbix3.5

一、Zabbix特点介绍

(此介绍来源于https://www.zabbix.com/documentation/3.4/zh/manual/introduction/features)

概述

Zabbix是一个高度集成的网络监控解决方案,一个简单的安装包中提供多样性的功能。

数据收集

可用性和性能检查
支持SNMP(包括捕获和主动轮训),IPMI,JMX,VMware监控
自定义检查
按照自定义的间隔收集需要的数据
由Server/Proxy和agents执行

灵活的阀值定义

您可以非常灵活的定义问题阈值,称之为触发器,触发器从后端数据库获取参考值

高度可配置化的告警

可以根据升级计划,接收方和媒体类型来定制发送告警通知 * 使用宏变量可以使告警通知更有意义更高效 * 自动化动作包含执行远程命令

实时图表绘制

使用内置图表绘制功能可以将监控项的内容立即绘制成图表

Web监控功能

Zabbix可以模拟鼠标在Web网站上的操作来检查Web的功能和响应时间

丰富的可视化选项

能够创建自定义的图形,图形中可将多个监控项组合在一个视图展示
网络拓扑图
以仪表盘的样式展现自定义的展现和幻灯片
报告
监控资源的高级(业务)视图

历史数据存储

数据存储在数据库中
可配置历史数据
内置数据管理机制

配置简单

将被监控对象添加为主机
主机被创建用于监控,在数据库中是唯一存在的
应用模板来监控设备

使用模板

在模板中分组检查
模板可以关联其他模板

网络发现

自动发现网络设备
监控代理自动注册
发现文件系统,网络接口和SNMP OID值

简洁的Web界面

Web前端基于PHP
可从任何地方访问
你可以定制自己的操作方式
审核日志

Zabbix API

Zabbix API为Zabbix 提供了对外的可编程接口,用于批量操作,第三方软件集成和其他目的

权限管理系统

安全用户认证
特定用户可以限制访问特定的视图

功能强大并易于扩展的监控代理

部署在被监控对象上
可以部署在Linux和Windows上

二进制代码

为了性能和更少内存的占用,用C语言编写
便于移植

为复杂环境准备

使用Zabbix proxy代理服务器,使得远程监控更简单

二、部署安装Zabbix

安装yum源

rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm

可以查看安装哪些组件

rpm -ql  zabbix-release

安装zabbix相关包

yum install zabbix-server-mysql -y
yum install zabbix-proxy-mysql -y
yum install zabbix-web-mysql -y
yum install zabbix-get -y
yum install zabbix-agent -y

说明:

zabbix-server-mysql:提供zabbix-server服务
zabbix-proxy-mysql:提供zabbix的代理服务,可以实现分布式监控,减轻zabbix-server的压力
zabbix-web-mysql:提供httpd服务
zabbix-get:提供检查是否能正确获取到zabbix的监控脚本key的监控值
zabbix-agent:提供zabbix-agent服务

三、安装MariaDB

配置MariaDB的yum源

vim /etc/yum.repos.d/mariadb.repo
[mariadb]
name = MariaDB
baseurl = https://ipv4.mirrors.ustc.edu.cn/mariadb/yum/10.2/centos7-amd64
gpgkey=https://ipv4.mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1

更新源

yum update

安装MariaDB

yum -y install MariaDB-server MariaDB-client

设置字符集

vim /etc/my.cnf.d/server.conf
[mysqld]
init_connect='SET collation_connection = utf8_general_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_general_ci
skip-character-set-client-handshake

创建zabbix数据库和账户

mysql -uroot -p
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';
mysql> quit;

导入zabbix相关sql

zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix

zabbix-server 配置数据库地址 数据库 数据库用户 数据库密码

vim /etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix

启动zabbix-server(监听10051端口)

service zabbix-server start

设置开机启动

systemctl enable zabbix-server

zabbix的web配置

vim /etc/httpd/conf.d/zabbix.conf
php_value max_execution_time 300
php_value memory_limit 128M
php_value post_max_size 16M
php_value upload_max_filesize 2M
php_value max_input_time 300
php_value always_populate_raw_post_data -1
php_value date.timezone Asia/Shanghai

SELinux配置

setsebool -P httpd_can_connect_zabbix on
setsebool -P httpd_can_network_connect_db on

被监控机器zabbix-agent安装(被动模式监听10050端口,主动模式下不监听端口)

yum install zabbix-agent
service zabbix-agent start

上述完成后,访问http://192.168.217.20/zabbix/,安装web提示依次完成下面步骤

欢迎界面—>php需求检–>数据库配置—> zabbix服务端详细信息—>zabbix安装前信息列表—>安装完成—>Finish

访问:http://192.168.217.20/zabbix/index.php开始登陆zabbix

默认用户名:Admin,密码:zabbix

http://192.168.217.20/zabbix/index.php

未分类

zabbix自动化监控三种方式

1、agent自动注册
2、sever端自动发现discovery
3、zabbix api

1、agent自动注册

主动模式自动注册配置
主动模式配置items监控类型要改成zabbix agent active

vim /etc/zabbix/zabbix_agentd.conf
#注释Server
#Server=192.168.217.20
#StartAgents=0表示关闭被动模式
StartAgents=0
ServerActive=192.168.217.20
#主机名唯一
Hostname=compute
HostMetadataItem=system.uname

被动模式配置

vim /etc/zabbix/zabbix_agentd.conf
#注释Server
Server=192.168.217.20
StartAgents=3
#ServerActive=192.168.217.20
#主机名唯一
Hostname=compute
#HostMetadataItem=system.uname

在服务端的web界面配置自动注册事件
configuration—>Actions—>选择事件源Auto registration—->create action
—>选择action–>填写相关信息–>选择operation–>填写相关信息–>enable–>add

保存关闭重启agent

service zabbix-agent restart

2、sever端自动发现discovery

被动模式配置

vim /etc/zabbix/zabbix_agentd.conf
#注释Server
Server=192.168.217.20
StartAgents=3
#ServerActive=192.168.217.20
#主机名唯一
Hostname=compute
#HostMetadataItem=system.uname
配置discovery rule
configuration--->discovery--->create discovery rule---->填写相关信息(主要是checks条件)-->add

配置与discovery的Actions

configuration—>Actions—>选择事件源discovery—->create action–>填写相关信息(主要是Conditions条件)–>选择operation–>填写相关信息(主要是operation条件)–>enable–>add

3、zabbix api

1) 验证
2) 请求API,附带上session id
3) host.create

获取登录的session id

curl -s -X POST -H 'Content-Type:application/json ' -d '
{
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "Admin",
"password": "zabbix"
},
"id": 1
}' http://192.168.217.20/zabbix/api_jsonrpc.php | python -mjson.tool 

输出结果:

{
"id": 1,
"jsonrpc": "2.0",
"result": "40b0c714a09b3eb70c32c596ba2e8514"
}

添加主机

curl -s -X POST -H 'Content-Type:application/json ' -d '
{
"jsonrpc": "2.0",
"method": "host.create",
"params": {
"host": "compute",
"interfaces": [
{
"type": 1,
"main": 1,
"useip": 1,
"ip": "192.168.217.20",
"dns": "",
"port": "10050"
}
],
"groups": [
{
"groupid": "4"
}
],
"templates": [
{
"templateid": "10001"
}
]
},
"auth": "40b0c714a09b3eb70c32c596ba2e8514",
"id": 1
}' http://192.168.217.20/zabbix/api_jsonrpc.php | python -mjson.tool

一分钟使用Docker快速搭建WordPress

1、apt install docker.io -y

2、pip install docker-compose

3、vim wordpress_stack.yml

version: '3.1'  

services:  

  wordpress:  
    image: wordpress  
    restart: always  
    ports:  
      - 80:80  
    environment:  
      WORDPRESS_DB_PASSWORD: mysqlrootpasswd  

  mysql:  
    image: mysql:5.7  
    restart: always  
    environment:  
      MYSQL_ROOT_PASSWORD: mysqlrootpasswd  

4、vim start.sh

#!/bin/bash  
docker-compose -f wordpress_stack.yml up -d  

5、 ./start.sh

6、 iptables -I INPUT 1 -p tcp –dport 80 -j ACCEPT

7、 打开http://localhost安装Wordpress

wireshark抓包大于1500字节和提示checksum offload的原因

问题

  • wireshark抓包大于1500字节(如下图所示)
  • wireshark抓包提示:[incorrect, should be xxxx (maybe caused by “TCP checksum offload”?)]

未分类

原因

wireshark是在数据包经过cpu,送到网卡处理之前抓取的。现在操作系统上的网卡大多有一个功能,帮助cpu减轻负担,网卡承担了将segment分段和对数据包进行checksum的工作。
wireshark抓取的数据包还需要网卡进行下一步的分段和checksum,所以我们看到数据包有2000多字节。

解决办法

disable操作系统网卡的large sender offload 和 check sum offload功能。

1、windows操作。在控制面板,网络连接,网卡属性,配置,高级设置,windows 10 截图如下:

未分类

2、Linux操作。

查看:ethtool –show-offload ethX

[root@syslog-ng ~]# ethtool --show-offload ens33
Features for ens33:
rx-checksumming: off
tx-checksumming: on
tx-checksum-ipv4: off [fixed]
tx-checksum-ip-generic: on
tx-checksum-ipv6: off [fixed]
tx-checksum-fcoe-crc: off [fixed]
tx-checksum-sctp: off [fixed]
scatter-gather: on
tx-scatter-gather: on
tx-scatter-gather-fraglist: off [fixed]
tcp-segmentation-offload: on
tx-tcp-segmentation: on
tx-tcp-ecn-segmentation: off [fixed]
tx-tcp6-segmentation: off [fixed]
tx-tcp-mangleid-segmentation: off

配置取消网卡分段功能: ethtool -K ens33 tso off

[root@syslog-ng ~]# ethtool -K ens33 tso off
[root@syslog-ng ~]# ethtool --show-offload ens33
Features for ens33:
rx-checksumming: off
tx-checksumming: on
tx-checksum-ipv4: off [fixed]
tx-checksum-ip-generic: on
tx-checksum-ipv6: off [fixed]
tx-checksum-fcoe-crc: off [fixed]
tx-checksum-sctp: off [fixed]
scatter-gather: on
tx-scatter-gather: on
tx-scatter-gather-fraglist: off [fixed]
tcp-segmentation-offload: off
tx-tcp-segmentation: off
tx-tcp-ecn-segmentation: off [fixed]
tx-tcp6-segmentation: off [fixed]
tx-tcp-mangleid-segmentation: off

参考wireshark wiki : https://wiki.wireshark.org/CaptureSetup/Offloading

又一款抓包分析软件 wireshark

Wireshark 是一款网络分析工具,也是学习网络协议的工具,原先介绍过的 Charles ,mitmproxy 等HTTP抓包工具,都局限于 HTTP/HTTPS 请求,对于更底层的 TCP/IP,UDP 等协议就无能为力了。Wireshark 可以抓取网卡上的网络包,并实时展示,Wireshark 包括了过滤器,协议显示等等工具。

Wireshark 和其他工具的区别,比如 Charles,mitmproxy,Fiddler 等。Charles, mitmproxy,Fiddler是专门用来捕获HTTP,HTTPS请求的。Wireshark 能获取HTTP,也能获取HTTPS,但是不能解密HTTPS,所以Wireshark看不懂HTTPS中的内容。总结,如果是处理HTTP,HTTPS 还是用Charles, mitmproxy, Fiddler 等, 其他协议比如TCP,UDP,IP,ICMP 等就用Wireshark

安装

各大系统的安装文件:https://www.wireshark.org/download.html

Linux 下可以使用 PPA

sudo add-apt-repository ppa:wireshark-dev/stable && sudo apt-get update
sudo apt-get install wireshark

简单使用

打开 Wireshark 就可以看到很多网络硬件可以选择,任选其中一块网卡就能够抓取经过这个网卡的所有流量包。常见的设备名字,或者网卡名字有这样几个:

  • eth0 物理网卡,一般连接网线会获取到IP地址
  • eth1 第二块网卡
  • wlan0 是无线网卡,一般连接无线网会获取到IP地址
  • lo 设备虚拟端口,自身回环,一般指向 127.0.0.1

还有一些设备名字可以参考之前的文章。比如我笔记本使用无线网卡连接了WIFI,那么进入 Wireshark 之后选择 wlan0 设备,自动进入抓包,可以看到经过无线网卡的所有请求包。

未分类

Wireshark 的界面大致可以分成三个部分,最上面的部分为原始数据包预览,可以在该面板中看到抓取的包大致内容,包括序号,耗时,原始地址,目标地址,协议,长度,基本信息等等,分别使用不同的颜色标记了,这个颜色可以在设置 View -> Coloring Rules 中设置,根据不同的协议,或者自定义一些过滤规则,将关心的内容以不同的颜色标记出。

面板中间是封包详细信息 (Packet Details Pane),这个面板是最重要的,用来查看协议中的每一个字段。各行信息分别为

  • Frame: 物理层的数据帧概况
  • Ethernet II: 数据链路层以太网帧头部信息
  • Internet Protocol Version 4: 互联网层IP包头部信息
  • Transmission Control Protocol: 传输层T的数据段头部信息,此处是TCP
  • Hypertext Transfer Protocol: 应用层的信息,此处是HTTP协议

面板最下面一栏是数据包真正传输的内容,以十六进制和 ASCII 显示出来。

过滤器

https://wiki.wireshark.org/CaptureFilters

两种过滤器的目的是不同的。

捕捉过滤器(CaptureFilters):用于决定将什么样的信息记录在捕捉结果中。需要在开始捕捉前设置。捕捉过滤器是数据经过的第一层过滤器,它用于控制捕捉数据的数量,以避免产生过大的日志文件。

显示过滤器(DisplayFilters):在捕捉结果中进行详细查找。他们可以在得到捕捉结果后随意修改。显示过滤器是一种更为强大(复杂)的过滤器。它允许您在日志文件中迅速准确地找到所需要的记录。

两种过滤器使用的语法是完全不同的。

http://openmaniak.com/cn/wireshark_filters.php

三次握手

Wireshark实际分析下三次握手的过程

在wireshark中输入http过滤, 然后选中GET /tankxiao HTTP/1.1的那条记录,右键然后点击”Follow TCP Stream”,

这样做的目的是为了得到与浏览器打开网站相关的数据包

可以看到wireshark截获到了三次握手的三个数据包。第四个包才是HTTP的, 这说明HTTP的确是使用TCP建立连接的。

第一次握手数据包

客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接。

第二次握手的数据包

服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的ISN加1以.即0+1=1

第三次握手的数据包

客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1

使用 Docker 搭建 Tomcat 运行环境

1、Docker与虚拟机

未分类

2、搭建过程

2.1 准备宿主系统

准备一个 CentOS 7操作系统,具体要求如下:

  • 必须是 64 位操作系统

  • 建议内核在 3.8 以上

通过以下命令查看您的 CentOS 内核:

# uname -r

2.2 安装Docker

# yum install docker

可使用以下命令,查看 Docker 是否安装成功:

# docker version

若输出了 Docker 的版本号,则说明安装成功了,可通过以下命令启动 Docker 服务:

# systemctl start  docker.service

一旦 Docker 服务启动完毕,就可以开始使用 Docker 了。

2.3 下载镜像

以 CentOS 为例,下载一个 CentOS 的镜像:

# docker pull centos:7.2.1511

下载完成后,使用命令查看本地镜像列表:

# docker images
REPOSITORY        TAG        IMAGE ID      CREATED      VIRTUAL SIZE
docker.io/centos  7.2.1511   83ee614b834e  9 weeks ago  194.6 MB

2.4 启动容器

容器是在镜像的基础上来运行的,一旦容器启动了,我们就可以登录到容器中,安装自己所需的软件或应用程序。

使用以下命令即可启动容器:

# docker run -i -t -v /root/software/:/mnt/software/ 83ee /bin/bash

命令包含以下三个部分:

docker run <相关参数> <镜像 ID> <初始命令>

其中,相关参数包括:

  • -i:表示以“交互模式”运行容器

  • -t:表示容器启动后会进入其命令行

  • -v:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>

本例中,所有安装程序都放在了宿主机的/root/software/目录下,现在需要将其挂载到容器的/mnt/software/目录下。

# pwd
/root/software

# ls
apache-tomcat-7.0.67.tar.gz  jdk1.7.0_79.tar.gz

初始命令表示一旦容器启动,需要运行的命令,此时使用“/bin/bash”,表示启动后直接进入bash shell。

2.5 安装软件

为了搭建 Java Web 运行环境,需要安装 JDK 与 Tomcat,下面的过程均在容器内部进行。本例中,选择/opt/目录作为安装目录,首先需要通过cd /opt/命令进入该目录。

2.5.1 安装JDK

首先,解压 JDK 程序包:

# tar -zxf /mnt/software/jdk1.7.0_79.tar.gz -C .

然后,移动 JDK 目录:

# mv jdk1.7.0_79/ /opt/jdk/

2.5.2 安装Tomcat

首先,解压Tomcat程序包:

# tar -zxf /mnt/software/apache-tomcat-7.0.67.tar.gz -C .

然后,移动Tomcat目录:

# mv apache-tomcat-7.0.67/ /opt/tomcat/

2.5.3 编写运行脚本

编写一个运行脚本,当启动容器时,运行该脚本,启动 Tomcat。

首先,创建运行脚本:

# touch /root/run.sh

# vi /root/run.sh

然后,编辑脚本内容如下:

#!/bin/bash

export JAVA_HOME=/opt/jdk/
export PATH=$JAVA_HOME/bin:$PATH

sh /opt/tomcat/bin/catalina.sh run

最后,为运行脚本添加执行权限:

# chmod u+x /root/run.sh

2.6 退出容器

当以上步骤全部完成后,可使用exit命令,退出容器。

随后,可使用如下命令查看正在运行的容器:

# docker ps

此时,应该看不到任何正在运行的程序,因为刚才已经使用exit命令退出的容器,此时容器处于停止状态,可使用如下命令查看所有容器:

# docker ps -a
CONTAINER ID  IMAGE  COMMAND     CREATED         STATUS                  
02bebc3f546a  83ee   "/bin/bash" 12 minutes ago  Exited (0) 7 seconds ago

记住以上CONTAINER ID(容器 ID),随后将通过该容器,创建一个可运行 Tomcat 镜像。

2.7 创建Tomcat镜像

使用以下命令,根据某个“容器 ID”来创建一个新的“镜像”:

# docker commit 02be mytomcat:1.0
65c88ec597e04812ec3b06b7749578bebcae3aa3d735b565ed25db6818d9d7f3

# docker images
REPOSITORY        TAG       IMAGE ID      CREATED             VIRTUAL SIZE
mytomcat          1.0       65c88ec597e0  About a minute ago  514.4 MB
docker.io/centos  7.2.1511  83ee614b834e  9 weeks ago         194.6 MB

该容器的ID是02be,所创建的镜像名是“mytomcat:1.0”,随后可使用镜像来启动Tomcat容器。

2.8 启动Tomcat容器

首先,新建/root/webapps/ROOT目录,并在该目录下创建一个index.html文件,文件内容如下:

<html>
<body>
<h2>Hello World!</h2>
</body>
</html>

正如上面所描述的那样,可以通过“镜像名”或“镜像 ID”来启动容器,与上次启动容器不同的是,现在不再进入容器的命令行,而是直接启动容器内部的 Tomcat 服务。此时,需要使用以下命令:

# docker run -d -p 58080:8080 -v /root/webapps/:/opt/tomcat/webapps/ --name mytomcat_1 mytomcat:1.0 /root/run.sh

其中,相关参数包括:

  • -d:表示以“守护模式”执行/root/run.sh脚本,此时 Tomcat 控制台不会出现在输出终端上。

  • -p:表示宿主机与容器的端口映射,此时将容器内部的 8080 端口映射为宿主机的 58080 端口,这样就向外界暴露了 58080 端口,可通过 Docker 网桥来访问容器内部的 8080 端口了。

  • -v:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>

  • –name:表示容器名称,用一个有意义的名称命名即可。

在浏览器中,输入宿主IP和端口号,即可访问 Tomcat:

未分类

2.9 最终示意图:

未分类

2.10 停止Tomcat容器

# docker ps -a
CONTAINER ID  IMAGE         COMMAND         CREATED         STATUS        
f23598b6544d  mytomcat:1.0  "/root/run.sh"  6 minutes ago   Up 6 minutes  

# docker stop f235

2.11 移除容器

# docker ps -a
CONTAINER ID  IMAGE         COMMAND         CREATED        STATUS                         
f23598b6544d  mytomcat:1.0  "/root/run.sh"  8 minutes ago  Exited (137)

# docker rm f235
f235

# docker ps -a
CONTAINER ID  IMAGE         COMMAND         CREATED        STATUS

2.12 移除镜像

# docker images
REPOSITORY          TAG        IMAGE ID       CREATED         VIRTUAL SIZE
mytomcat            1.0        65c88ec597e0   31 minutes ago  514.4 MB
docker.io/centos    7.2.1511   83ee614b834e   9 weeks ago     194.6 MB

# docker rmi 65c8
Untagged: mytomcat:1.0
Deleted: 65c88ec597e04812ec3b06b7749578bebcae3aa3d735b565ed25db6818d9d7f3

# docker images
REPOSITORY          TAG        IMAGE ID       CREATED         VIRTUAL SIZE
docker.io/centos    7.2.1511   83ee614b834e   9 weeks ago     194.6 MB

PS:本文参考了大神博文:http://my.oschina.net/huangyong/blog/372491?fromerr=kHrZPM01,并在原文基础上,进行了部分添加修改。