Git回退命令

$ git reset –hard HEAD^         回退到上个版本

$ git reset –hard HEAD~3        回退到前3次提交之前,以此类推,回退到n次提交之前

$ git reset –hard commit_id     退到/进到 指定commit的sha码

强推到远程:

$ git push origin HEAD –force

删除本地分支

git branch -d branch_name

删除远程分支

git branch -r -d origin/branch_name

git push origin :branch_name

git修改本地和远程分支名称

git branch -m old_branch new_branch # Rename branch locally

git push origin :old_branch # Delete the old branch

git push –set-upstream origin new_branch # P

git 设置代理和取消代理

如果代理类型是socks5进行如下设置即可

git config --global http.proxy socks5://127.0.0.1:1080
git config --global https.proxy socks5://127.0.0.1:1080

如果是普通的http/https进行如下设置即可

git config --global https.proxy http://127.0.0.1:1080
git config --global https.proxy https://127.0.0.1:1080

取消代理设置

git config --global --unset http.proxy
git config --global --unset https.proxy

Zabbix企业级监控之监控Nginx

1.如何监控Nginx?

需要添加http_stub_status_module 模块

2.安装Nginx需要的模块

(1)安装依赖包

yum -y install vim gcc wget pcre-devel openssl-devel gcc-c++ pcre-dev  zlib-devel 

(2)安装nginx

wget http://101.96.10.63/nginx.org/download/nginx-1.12.1.tar.gz

解压

tar -zxvf nginx-1.12.1.tar.gz

添加nginx组并添加nginx用户

useradd -M -s /sbin/nologin nginx

(3)编译安装

cd nginx-1.12.1
./configure --prefix=/etc/nginx --user=nginx --group=nginx --with-http_stub_status_module
make && make install

(4)vim nginx.conf

在server {} 添加nginx统计模块

#nginx状态监控
        location /nginx_status {
              stub_status on;
              access_log off;
              allow all;        }

(5)重启nginx

3.重启agent

systemctl restart zabbix-agent

4.添加nginx模板

vim /etc/zabbix/zabbix_agentd.d/userparameter_nginx.conf
UserParameter=nginx_status[*],/bin/bash /etc/zabbix/shell/monitor_nginx.sh "$1"

5.编写shell脚本

vim /etc/zabbix/shell/monitor_nginx.sh

#!/bin/bash

nginx_port=81
nginx_ip=127.0.0.1
curl_addres="http://$nginx_ip:$nginx_port/nginx_status"
nginx_active() {
    curl -s $curl_addres|grep "Active"|awk '{print $3}'
}

nginx_reading() {
   curl -s $curl_addres |grep "Reading"| awk '{print $2}'
}
nginx_writing() {
   curl -s $curl_addres |grep "Writing"|awk '{print $4}'
}

nginx_waiting() {
   curl -s $curl_addres |grep "Waiting"|awk '{print $6}'
}

nginx_accept() {
   curl -s $curl_addres |awk 'NR==3{print $1}'
}
nginx_handled() {
   curl -s $curl_addres |awk 'NR==3{print $2}'
}

nginx_requests() {
   curl -s $curl_addres |awk 'NR==3{print $3}'
}

case $1 in 
    nginx_active)
        nginx_active;
    ;;
    nginx_reading)
        nginx_reading;
    ;;
    nginx_writing)
        nginx_writing;
    ;;
    nginx_waiting)
        nginx_waiting;
    ;;
    nginx_accept)
        nginx_accept;
    ;;
    nginx_handled)
        nginx_handled;
    ;;
    nginx_requests)
        nginx_requests;
    ;;
    *)
esac

zabbix实战应用-zabbix配置钉钉报

当我们把 zabbix 的基础建设构建完成之后,就能够对 Linux 服务器的一些基本项进行监控了,在 web 界面也可以看到相关问题的一些报警了,但是这样的报警显然是不够的,我们需要的是那种与实际工作常用工具相结合的报警,这样既容易发现告警,先显得比较高端,再加上一些基础的服务器信息以及告警项,做出对应的处理就非常容易了。

今天我们就来整理一下 zabbix 结合钉钉机器人的报警配置。

一、首先是钉钉客户端配置

1、建立一个钉钉群组。
2、添加一个机器人。

未分类

注意,这里要复制下来这个 wenhook 值,等会要用到的。

二、zabbix 服务器端配置

1、Zabbix 配置文件中查找”Alert”查看告警脚本存放路径。

[root@localhost ~]# vim /etc/zabbix/zabbix_server.conf
AlertScriptsPath=/usr/lib/zabbix/alertscripts       (455 行,默认的,不用修改)

2、进入配置中路径创建配置文件,并添加监听脚本。

[root@localhost ~]# cd /usr/lib/zabbix/alertscripts/

3、然后添加脚本。

[root@localhost alertscripts]# vim token.sh

#!/bin/bash
to=$1
subject=$2
text=$3
curl 'xxxxxxxxx'       #此处的 xxxxx 就是刚刚复制存留的 api 接口地址。
-H 'Content-Type: application/json' 
-d '
{"msgtype": "text",
"text": {
"content": "'"$text"'"
},
"at":{
"atMobiles":[
"'"$1"'"
],
"isAtAll":false
}
}'

三、配置执行文件权限与归属

[root@localhost alertscripts]# chown zabbix.zabbix token.sh
[root@localhost alertscripts]# chmod +x token.sh

切换至 zabbix 用户测试脚本是否执行成功。

bash  token.sh 11 22 33

如果钉钉已经有了提示消息,说明配置成功。

四、设置前端创建脚本及报警媒介

再添加以下 3 个参数,分别对应脚本需要的 3 个参数:收件人地址、主题、详细内容。

{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}

未分类

五、创建动作

配置
--->动作
--->右上角触发器
--->创建动作
--->名称(钉钉)
--->新的触发条件(触发器示警度--->大于等于--->警告)
--->添加(上边出现了两条--->计算方式选和)
--->选择右边操作

未分类

--->步骤时间--->1000
--->标题(故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!)
--->默认信息下边的添加

        告警主机:{HOSTNAME1}
    告警时间:{EVENT.DATE} {EVENT.TIME}
    告警等级:{TRIGGER.SEVERITY}
    告警信息: {TRIGGER.NAME}
    告警项目:{TRIGGER.KEY1}
    问题详情:{ITEM.NAME}:{ITEM.VALUE}
    当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
    事件 ID:{EVENT.ID}

--->操作添加
--->步骤--->5 表示触发 5 次动作
--->步骤持续时间--->每隔 120 秒触发一次
--->告警发给 admin 用户
--->用”钉钉”媒介发送。  
--->点击小”add”添加选项,否则等于没写

未分类

点击添加之后
--->右边恢复操作,相当于服务正常之后的操作
--->标题改为--->恢复{TRIGGER.STATUS}, 服务器:{HOSTNAME1}: {TRIGGER.NAME}已恢复!
--->信息改为--->

    告警主机:{HOSTNAME1}
    告警时间:{EVENT.DATE} {EVENT.TIME}
    告警等级:{TRIGGER.SEVERITY}
    告警信息: {TRIGGER.NAME}
    告警项目:{TRIGGER.KEY1}
    问题详情:{ITEM.NAME}:{ITEM.VALUE}
    当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
    事件 ID:{EVENT.ID}

--->点击”新的”添加发送选项
--->添加群组
--->添加用户 Admin
--->仅送到--->钉钉
--->点击小”添加”添加选项,否则等于没写  
点击小 add 添加选项后再点击大 ADD 完成动作增加。

未分类

六、添加报警媒介

--->点击右上角用户头像
--->点击报警媒介
--->添加
--->类型--->钉钉
--->收件人--->要@的人的手机号
--->当启用时--->这个设置的是报警的时间设置
--->添加
--->然后直接点击更新

未分类

更新。

未分类

七、配置提示

--->点击右上角用户头像
--->选择正在发送消息
--->选中前端消息
--->下边的全选中,,更新。

未分类

测试
直接把监控的 nginx 服务器网卡断掉,然后等待报警!!!

未分类

现在再将网卡链接,看等会儿会是怎样的报警。

这样,一个非常给力好用的 zabbix 结合钉钉的报警就配置完成了。

zabbix监控之监控MYSQL吞吐量

1. 监控MYSQL的吞吐量监控哪些指标?

监控MYSQL的插入、查询、删除、更新等

2. 如何获取吞吐量的指标?

注意:为了shell脚本与mysql更好的交互,设置了mysql免密登录

mysqladmin status
mysqladmin extended-status

3. 如何通过shell脚本获取监控指标?

vim /etc/zabbix/shell/monitor_mysql.sh

#!/bin/bash
#监控mysql的吞吐量
slow_queries() {
mysqladmin status | awk '{print $9}'
}
Com_delete() {
mysqladmin extended-status | awk '/<Com_delete>/{print $4}'
}
Com_insert() {
mysqladmin extended-status | awk '/<Com_insert>/{print $4}'
}
Com_update() {
mysqladmin extended-status | awk '/<Com_update>/{print $4}'
}
Com_select() {
mysqladmin extended-status | awk '/<Com_select>/{print $4}'
}
$1

4. 定义agent端得模板

UserParameter=mysql_status[*],/bin/bash /etc/zabbix/shell/monitor_mysql.sh "$1"

5. 还有更多企业级监控项目,获取更多关于信息

zabbix自定义监控规则

这里先需要再zabbix端安装一个测试工具,用于测试自定义的规则是否可用
查看可以安装的工具:

yum list all |grep zabbix 

进行安装

yum install zabbix-get.x86_64

现在举一个监控进程状态的例子

1、先编写脚本,这个脚本可以是python也可以是shell,下面以shell为例子

1)无需传参数的脚本

#!/bin/sh

ret_ok=1
ret_warn=0

info_count=`/etc/init.d/workflow status|grep running|wc -l` #进程在运行中
#echo ${info_count}
#process_count=$((${info_count}-0))
if [[ ${info_count} == 1 ]]; then
      echo ${ret_ok} #成功返回1,打印出来就会被zabbix接收,zabbix触发器也是比较这个值
else
      echo ${ret_warn} #失败返回0
fi

2)可以传参数的脚本

#!/bin/sh

ret_ok=1
ret_warn=0
model=$1 #接收一个参数,用于监控不同模块
info_count=`/etc/init.d/$1 status|grep running|wc -l`
#echo ${info_count}
#process_count=$((${info_count}-0))
if [[ ${info_count} == 1 ]]; then
      echo ${ret_ok}
else
      echo ${ret_warn}
fi

2、修改zabbix_client的配置文件

模块好像不用配置,我的没有配置,但是网上很多人都手动配置了一下

vim /etc/zabbix/zabbix_agentd.conf
Include=/etc/zabbix/zabbix_agentd.d/*.conf

创建一个conf文件

vim /etc/zabbix/zabbix_agentd.d/check_process.conf 

填入下面两行

UserParameter=checkworkflow,sh /home/zabbix/moniterworkflow.sh #监控单个模块,对应的是没有传参的那个脚本
UserParameter=checkmodel[*],sh /home/zabbix/moniall.sh $1 #监控多个模块,对应的是可以传参的脚本

3、再到zabbix-server上去测试一下

 不传参的:
[root@localhost ~]# zabbix_get -s 200.200.169.212 -k "checkworkflow"
1
传参的
[root@localhost ~]# zabbix_get -s 200.200.169.212 -k "checkmodel[workflow]"
1

4、配置到web端监控

键值需要自己输入,选择里面是没有的

未分类

添加触发器

未分类

查看结果

未分类

Tomcat 日志切割(logrotate)详细介绍

这篇文章主要介绍了Tomcat 日志切割(logrotate)详细介绍的相关资料,需要的朋友可以参考下

Tomcat 日志切割

logrotate是个强大的系统软件,它对日志文件有着一套完整的操作模式,譬如:转储、邮件和压缩等,并且默认logrotate加到cron(/etc/cron.daily/logrotate)作为每日任务执行。自动有了logrotate,我想不用再自己写日志切割脚本。

如下对Tomcat日志catalina.out日志切割

# ls -lh /usr/local/tomcat/logs/catalina.out
-rw-r--r-- 1 www www 14M Aug 28 15:55 /usr/local/tomcat/logs/catalina.out

配置logrotate对catalina.out日志切割

# cat /etc/logrotate.d/tomcat
/usr/local/tomcat/logs/catalina.out {
daily
rotate 5
missingok
dateext
compress
notifempty
copytruncate
}

参数详解:

  • daily 指定转储周期为每天
  • rotate 5 指定日志文件删除之前转储的次数,0指没有备份,5指保留5个备份
  • missingok 如果日志不存在则忽略该警告信息
  • dateext 文件后缀是日期格式,也就是切割后文件是:xxx.log-20150828.gz
  • compress 通过gzip压缩转储以后的日志(gzip -d xxx.gz解压)
  • notifempty 如果是空文件的话,不转储
  • copytruncate 用于还在打开中的日志文件,把当前日志备份并截断

立即截断日志:

# logrotate --force /etc/logrotate.d/tomcat

效果如下:

# ls -lh /usr/local/tomcat/logs/catalina.out*
-rw-r--r-- 1 www www  0 Aug 28 16:00 /usr/local/tomcat/logs/catalina.out
-rw-r--r-- 1 www www 1.1M Aug 28 16:00 /usr/local/tomcat/logs/catalina.out-20150828.gz

记一次线上 tomcat 内存告警问题排查

最近几天线上服务器内存一直报警,物理内存持续超过 90%, 导致监控一直报警。

线上服务器 tomcat 启动参数:

-Xms3072m -Xmx3072m -XX:PermSize=256m -XX:MaxPermSize=256m -Xmn1024m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSCompactAtFullCollection -XX:+HeapDumpOnOutOfMemoryError

服务器配置:
双核 4GB 内存

通过本地和开发环境模拟测试:

当 tomcat 启动之后内存并没有占用到 3GB 的内存,只有 1GB 左右。然后通过一段测试代码将内存耗光 (代码如下):

  HashMap<Object,Object> map = new HashMap<>();
  Integer i= 1;
  flag1 = flag;
  for(;;) {
    i++;
    if(flag1 == 1) {
      map.put(i, i+1);
    }else {
      break;
    }
  }

然后系统一直会执行 Full GC,直到抛出 OutOfMemoryError 为止。但是如果在系统开始 Full GC 之后马上终止程序,

这个时候 JVM 的堆内存使用会释放至正常范围,但是通过系统命令查看 JVM 的内存占用发现内存一直没有释放。

未分类

因为对于操作系统,请求内存的系统调用会占用大量的 cpu 时间,所以频繁的请求、释放内存将会导致性能的严重下降。所以对于 jvm 最好的方式就是尽量多占用内存作为 heap, 少释放甚至不释放空闲的 heap 给操作系统以减少消耗在内存请求、释放操作上的 cpu 时间。

所以导致 JVM 内存一直占用过高,但是通过打印堆栈的使用情况来看,堆内存的使用率并不是很高,再加上系统的占用以及其他应用对内存的占用,所以会导致监控平台内存告警。

using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 3221225472 (3072.0MB)
   NewSize          = 1073741824 (1024.0MB)
   MaxNewSize       = 1073741824 (1024.0MB)
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 268435456 (256.0MB)
   MaxPermSize      = 268435456 (256.0MB)
   G1HeapRegionSize = 0 (0.0MB)

Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 966393856 (921.625MB)
   used     = 57484824 (54.821800231933594MB)
   free     = 908909032 (866.8031997680664MB)
   5.94838467184957% used
Eden Space:
   capacity = 859045888 (819.25MB)
   used     = 50165232 (47.84129333496094MB)
   free     = 808880656 (771.4087066650391MB)
   5.839645204145369% used
From Space:
   capacity = 107347968 (102.375MB)
   used     = 7319592 (6.980506896972656MB)
   free     = 100028376 (95.39449310302734MB)
   6.818565955528846% used
To Space:
   capacity = 107347968 (102.375MB)
   used     = 0 (0.0MB)
   free     = 107347968 (102.375MB)
   0.0% used
concurrent mark-sweep generation:
   capacity = 2147483648 (2048.0MB)
   used     = 276183376 (263.3889923095703MB)
   free     = 1871300272 (1784.6110076904297MB)
   12.860790640115738% used
Perm Generation:
   capacity = 268435456 (256.0MB)
   used     = 85506216 (81.54508209228516MB)
   free     = 182929240 (174.45491790771484MB)
   31.85354769229889% used

34698 interned Strings occupying 3779016 bytes.

最终的解决方案通过降低内存分配解决。

tomcat配置https自签名证书(keytool生成)

生成keystore

keytool -genkeypair -alias "server" -keyalg "RSA" -validity "365" -keystore "/app/webapp/tomcat/https/server.keystore"
[webapp@machina https]$ pwd
/app/webapp/tomcat/https
[webapp@machina https]$ keytool -genkeypair -alias "server" -keyalg "RSA" -validity "365" -keystore "/app/webapp/tomcat/https/server.keystore"
Enter keystore password:  
Re-enter new password: 
What is your first and last name?
  [Unknown]:  10.13.22.102
What is the name of your organizational unit?
  [Unknown]:  ai
What is the name of your organization?
  [Unknown]:  ai
What is the name of your City or Locality?
  [Unknown]:  gz
What is the name of your State or Province?
  [Unknown]:  gd
What is the two-letter country code for this unit?
  [Unknown]:  cn
Is CN=10.13.22.102, OU=ai, O=ai, L=gz, ST=gd, C=cn correct?
  [no]:  yes

Enter key password for <server>
        (RETURN if same as keystore password):  
Re-enter new password: 

Warning:
The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore /app/webapp/tomcat/https/server.keystore -destkeystore /app/webapp/tomcat/https/server.keystore -deststoretype pkcs12".
[webapp@machina https]$ 

修改配置server.xml

[webapp@machina conf]$ pwd
/app/webapp/tomcat/apache-tomcat-7.0.88/conf
[webapp@machina conf]$ vi server.xml
    <!--
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
    -->

改为:

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" 
               keystoreFile="/app/webapp/tomcat/https/server.keystore" keystorePass="123456"/>

保存:
:wq

修改https的tomcat里的默认端口8443(也可不改,用默认的)。
这里修改为18003。共修改三处。另外两处是注释里的,可不修改。

    <Connector port="18002" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <Connector port="18002" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="18003" />

    <Connector port="18003" protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS"
               keystoreFile="/app/webapp/tomcat/https/server.keystore" keystorePass="123456"/>

    <Connector port="8009" protocol="AJP/1.3" redirectPort="18003" />

修改tomcat的web.xml,强制http跳转到https

[webapp@machina conf]$ pwd
/app/webapp/tomcat/apache-tomcat-7.0.88/conf
[webapp@machina conf]$ vi web.xml

后面加上这样一段:

    <login-config>    
        <!-- Authorization setting for SSL -->    
        <auth-method>CLIENT-CERT</auth-method>    
        <realm-name>Client Cert Users-only Area</realm-name>    
    </login-config>    
    <security-constraint>    
        <!-- Authorization setting for SSL -->    
        <web-resource-collection >    
            <web-resource-name >SSL</web-resource-name>    
            <url-pattern>/*</url-pattern>    
        </web-resource-collection>    
        <user-data-constraint>    
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>    
        </user-data-constraint>    
    </security-constraint>

重启tomcat

[webapp@machina bin]$ pwd
/app/webapp/tomcat/apache-tomcat-7.0.88/bin
[webapp@machina bin]$ sh shutdown.sh
Using CATALINA_BASE:   /app/webapp/tomcat/apache-tomcat-7.0.88
Using CATALINA_HOME:   /app/webapp/tomcat/apache-tomcat-7.0.88
Using CATALINA_TMPDIR: /app/webapp/tomcat/apache-tomcat-7.0.88/temp
Using JRE_HOME:        /opt/jdk1.8.0_151
Using CLASSPATH:       /app/webapp/tomcat/apache-tomcat-7.0.88/bin/bootstrap.jar:/app/webapp/tomcat/apache-tomcat-7.0.88/bin/tomcat-juli.jar
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=256m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
[webapp@machina bin]$ sh startup.sh
Using CATALINA_BASE:   /app/webapp/tomcat/apache-tomcat-7.0.88
Using CATALINA_HOME:   /app/webapp/tomcat/apache-tomcat-7.0.88
Using CATALINA_TMPDIR: /app/webapp/tomcat/apache-tomcat-7.0.88/temp
Using JRE_HOME:        /opt/jdk1.8.0_151
Using CLASSPATH:       /app/webapp/tomcat/apache-tomcat-7.0.88/bin/bootstrap.jar:/app/webapp/tomcat/apache-tomcat-7.0.88/bin/tomcat-juli.jar
Tomcat started.

访问

http://10.13.22.102:18002/ops/app

自动跳转:

https://10.13.22.102:18003/ops/app

tomcat的安装方法

安装tomcat

1) 切换至java目录

cd /usr/java

2) 解压压缩包至/usr/java目录

tar -zxvf  apache-tomcat-7.0.65.tar.gz

3) 切换至tomcat的bin目录

cd /usr/java/apache-tomcat-7.0.65/bin

4) 启动tomcat

./startup.sh

测试Tomcat

打开浏览器输入输入http://localhost:8080/,看到以下页面表示Tomcat安装后,启动成功。

未分类