批量更新Git项目脚本

在平时的工作中,遇到一些优秀的开源项目,如volley、picasso、okhttp等,如果想阅读它的源代码,我通常都会clone项目到本地的GitHub文件夹,这样大神们后面再提交更新的话,只需要git pull更新一下本地的项目就能做到和远程仓库的代码同步了。可是时间长了就会遇到一个问题,如果GitHub文件夹里的项目太多,更新的话每个文件夹进去执行git pull将会是一件很麻烦的事。于是,花了几分钟,写了个批量更新的脚本。

#!/bin/sh
for dir in $(ls -d */)
do
  cd $dir
  echo "into $dir"
  if [ -d ".git" ]; then
     git pull
  elif [ -d ".svn" ]; then
     svn update
  fi
  cd ..
done

代码比较简单,就是遍历文件夹,发现项目目录下有.git文件夹,则执行git pull。很容易理解。

还加入了对svn项目的支持。命名为update.sh,放到GitHub文件夹,添加执行权限,执行./update.sh就可以了。

git 分支重命名

本地 branch 重命名 foo => bar

1. 本地重命名,切到分支 foo

git branch -m bar

或者直接重命名

git branch -m foo bar

2. 如果分支已经在远端,查看远端 origin

git remote show origin

  Remote branches:
    foo    tracked
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local refs configured for 'git push':
    foo    pushes to foo    (up to date)
    master pushes to master (up to date)

这就需要把本地分支 bar push 上去,把 foo 分支删掉

git push origin :foo bar
 - [deleted]         foo
 * [new branch]      bar -> bar

最后在本地的 bar 分支下把 upstream 设置好

git push origin -u bar
Branch bar set up to track remote branch bar from origin.

查看远端 origin

git remote show origin

  Remote branches:
    bar    tracked
    master tracked
  Local branches configured for 'git pull':
    bar    merges with remote bar
    master merges with remote master
  Local refs configured for 'git push':
    bar    pushes to bar    (up to date)
    master pushes to master (up to date)

Centos7.2下yum安装zabbix

环境准备:

[root@xudongmingzuishuai ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
[root@xudongmingzuishuai ~]# systemctl status firewalld.service   #关闭防火墙
● firewalld.service – firewalld – dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
[root@xudongmingzuishuai ~]# getenforce  #检查是否关闭selinux
Disabled
[root@xudongmingzuishuai ~]# hostname -I
10.0.0.202 172.16.1.202

第1章 安装zabbix源

[root@xudongmingzuishuai ~]# rpm -ivh http://mirrors.aliyun.com/zabbix/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
Retrieving http://mirrors.aliyun.com/zabbix/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
warning: /var/tmp/rpm-tmp.de2mvt: Header V4 DSA/SHA1 Signature, key ID 79ea5ed4: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:zabbix-release-3.0-1.el7         ################################# [100%]
[root@xudongmingzuishuai ~]# cd /etc/yum.repos.d/
[root@xudongmingzuishuai yum.repos.d]# ls
CentOS-Base-Aliyun.repo  epel-Aliyun.repo  zabbix.repo

替换zabbix源的下载地址

[root@xudongmingzuishuai yum.repos.d]# sed -i.bak 's#repo.zabbix.com#mirrors.aliyun.com/zabbix#g' zabbix.repo 
 [root@xudongmingzuishuai yum.repos.d]# ls
 CentOS-Base-Aliyun.repo  epel-Aliyun.repo  zabbix.repo  zabbix.repo.bak 

第2章 安装zabbix相关服务

yum install -y zabbix-server-mysql zabbix-web-mysql

安装数据库

yum install -y mariadb-server

启动数据库服务

systemctl start mariadb.service

登录数据库并创建数据库授权用户

mysql
create database zabbix character set utf8;
grant all on zabbix.* to zabbix@'localhost' identified by 'zabbix';
flush privileges;

启动web服务

systemctl start httpd.service 

更改zabbix服务配置文件时区

sed -i 's@# php_value date.timezone Europe/Riga@ php_value date.timezone Asia/Shanghai@g' /etc/httpd/conf.d/zabbix.conf
systemctl restart httpd.service 

更改httpd配置文件

echo "ServerName 127.0.0.1:80">>/etc/httpd/conf/httpd.conf
systemctl restart httpd.service 

查看zabbix数据库文件所在的位置

rpm -ql zabbix-server-mysql 
cd /usr/share/doc/zabbix-server-mysql-3.0.10/

导入数据库文件

zcat create.sql.gz|mysql -uzabbix -pzabbix zabbix

编辑zabbix服务配置文件添加登录数据库密码

vi /etc/zabbix/zabbix_server.conf 
DBPassword=zabbix

重启zabbix服务

systemctl start zabbix-server.service

Zabbix 监控 Nginx status 性能

其实zabbix对nginx的服务状态监控,网上有很多相关模板以及设置方法,根据自己的需求修改即可,后期我会写一些比较详细用于生产环境中的一些教程。

部署环境:

  • OS:CentOS 7.4
  • WEB: Nginx 1.3
  • 监控:Zabbix 3.4

先决条件:

《Centos 7 源码编译安装 Nginx》
https://www.renwole.com/archives/39

注意:主要是 –with-http_stub_status_module 模块。

1. 修改 nginx.conf

在 server 段 添加以下内容:

$ vim /usr/local/nginx/conf/nginx.conf
location /stub_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}

2. 重启Nginx服务并测试访问

$ systemctl restart nginx.service
$ curl http://127.0.0.1/stub_status
Active connections: 1
server accepts handled requests
304 304 304
Reading: 0 Writing: 1 Waiting: 0

访问返回数据说明Nginx配置正常.

3. 创建 Nginx 监控脚本

将以下代码复制保存为 nginx.sh

$ cd /usr/local/zabbix/bin
$ vim nginx.sh
#!/bin/bash

HOST="127.0.0.1"
PORT="80"
stub_status=stub_status
function check() {
/sbin/pidof nginx | wc -l
}
function active() {
/usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
}
function accepts() {
/usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| awk NR==3 | awk '{print $1}'
}
function handled() {
/usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| awk NR==3 | awk '{print $2}'
}
function requests() {
/usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| awk NR==3 | awk '{print $3}'
}
function reading() {
/usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
}
function writing() {
/usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
}
function waiting() {
/usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
}

case "$1" in
check)
check
;;
active)
active
;;
accepts)
accepts
;;
handled)
handled
;;
requests)
requests
;;
reading)
reading
;;
writing)
writing
;;
waiting)
waiting
;;

*)
echo $"Usage $0 {check|active|accepts|handled|requests|reading|writing|waiting}"
exit
esac

4. 给该脚本执行权限

$ chmod 755 nginx.sh

5. 创建 userparameter_nginx.conf 配置文件

$ cd /usr/local/zabbix/etc/zabbix_agentd.conf.d

添加以下内容:

$ vim userparameter_nginx.conf
UserParameter=nginx.status[*],/usr/local/zabbix/bin/nginx.sh $1

6. 重启 zabbix

$ systemctl restart zabbix-agent.service

7. 导入 zbx_nginx_templates.xml 模板

下载模板: https://www.renwole.com/zabbix/nginx/zbx_nginx_templates.xml

导入模板添加主机链接到 Template App Nginx 模板即可。

zabbix自动发现监控tomcat健康页面

一、背景

公司系统平台有10几个tomcat服务,由于需要服务保持全年无间断服务,特在tomcat中嵌入专门的监控页面,在curl 专用页面返回值为200时,则认定服务正常运行,否则报警发送专门的监控运维的邮箱。

二、原理

正常的tomcat健康状态监控页面如下图

未分类

我们利用如下命令判断返回值是否为200

shell>/usr/bin/curl -o /dev/null -s --connect-timeout 5 -w '%{http_code}' http://10.0.0.107:9100/sms-app/health

倘若返回值不为200,则断定服务异常,报警

三、具体自动发现操作部署如下

1、首先定义需要监控自动发现的tomcat的URL

如下内容

cat >/etc/zabbix/WEB.txt <<EOF
10.0.0.107:9000/sms-admin/health
10.0.0.107:9100/sms-app/health
10.0.0.107:9090/auditServer/health
10.0.0.107:7711/pushControl/health
10.0.0.107:7700/sendService/health
10.0.0.107:6003/pa/health
10.0.0.107:8513/sms/health
10.0.0.107:7712/pushControl/health
10.0.0.107:7725/reply-server/health
10.0.0.107:2222/mdnServer/health
EOF

2、监控脚本如下所示

cat >/etc/zabbix/scripts/web_site_code_status.sh <<EOF
#!/bin/bash 
# function:monitor tcp connect status from zabbix 

source /etc/bashrc >/dev/null 2>&1
source /etc/profile  >/dev/null 2>&1
#/usr/bin/curl -o /dev/null -s -w %{http_code} http://$1/ 

web_site_discovery () {
WEB_SITE=($(cat  /etc/zabbix/WEB.txt|grep -v "^#"))
        printf '{n'
        printf 't"data":[n'
for((i=0;i<${#WEB_SITE[@]};++i))
{
num=$(echo $((${#WEB_SITE[@]}-1)))
        if [ "$i" != ${num} ];
                then
        printf "tt{ n"
        printf "ttt"{#SITENAME}":"${WEB_SITE[$i]}"},n"
                else
                        printf  "tt{ n"
                        printf  "ttt"{#SITENAME}":"${WEB_SITE[$num]}"}]}n"
        fi
}
}

web_site_code () {
/usr/bin/curl -o /dev/null -s --connect-timeout 5 -w '%{http_code}' $1
}

case "$1" in
web_site_discovery)
web_site_discovery
;;
web_site_code)
web_site_code $2
;;
*)

echo "Usage:$0 {web_site_discovery|web_site_code [URL]}" 
;;
esac
EOF

3、增加zabbix配置文件监控项目

root@DL-test2:zabbix# grep '^[a-Z]' zabbix_agentd.conf 
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=10.0.0.113
ServerActive=10.0.0.113
Hostname=DL-test2
Include=/etc/zabbix/zabbix_agentd.d/*.conf  #此项打开
cat >/etc/zabbix/zabbix_agentd.d/web_site_discovery.conf <<EOF
UserParameter=web.site.discovery,/bin/bash /etc/zabbix/scripts/web_site_code_status.sh web_site_discovery  
UserParameter=web.site.code[*],/bin/bash /etc/zabbix/scripts/web_site_code_status.sh web_site_code $1
EOF
#/bin/bash 此项必须要加上,不然有可能找不到命令,导致脚本命令无法被zabbix-agent调用

4、增加自动发现模板

模板详见附件
直接在模板里导入附件模板
启动zabbix-agent
会在被监控主机的触发器中发现我们需要监控的tomcat

未分类

停止6003端口的服务,我们会发现如下图所示报警

未分类

然后启动6003服务后,服务监控正常。

至此自动发现tomcat服务状态,部署完毕。

基于docker的WordPress环境搭建

WordPress是一个强大的框架,它的使用者众多,社区十分活跃,我们可以非常轻易地找到很多非常漂亮的主题来装饰个人博客。

根据官方的说法,搭建一个wordpress至少需要系统支持以下特征:

  • PHP 7 以及更高版本
  • MySQL 5.6 以及更高版本或者是 MariaDB 10.0 以及更高版本
  • Apache的mod_rewrite模块支持

对于我这种大白来说,搭建服务并不难,配置软件也不是不可接受。但是我只是搭一个博客而已啊喂,要安装这么多东西把系统弄的乱糟糟的,简直不能忍,有没有更优雅的方式呢?

这时候。docker这一个工具就该派上用场了。它创建了一个与主机系统独立的空间,整洁高效。

mariadb:

$docker run --name db --env MYSQL_ROOT_PASSWORD=example -d mariadb

wordpress:

$docker run --name WordPress --link db:mysql -p 4000:80 -d wordpress

第一条命令创建了一个db容器,并给它创建了一个别名叫db,并设置了MySQL的密码为example。第二条则创建了一个wordpress的容器,由于两个容器有数据交流,这里用了一个–link参数来将它们联系起来,但是注意:用–link containerA参数时需要A已经创建并且已经在运行。在这里我们将docker的80端口和主机的4000端口连起来。访问docker里的wordpress,只需要在主机的浏览器输入http://localhost:4000就可以了。

另外,这个博客就是在docker里面搭建起来的。

几个提高WORDPRESS速度的技巧

虽然有很多介绍WordPress缓存插件的,我也介绍过用Redis来缓存WordPress生成的页面,这也不失为一个较便捷的优化方法。但是很多时候我们会使用动态的元素,比如手机端和桌面端分发不同的图片,如果直接使用前端缓存插件会导致这些元素失去原有的效果。
Apache因为可以把PHP作为自己的一个模块,所以在大并发的时候理论上效率要比Nginx之类的使用FastCGI方式的效率高一点,而且不容易出现502错误。不过我个人觉得这种差异非常小,而且PHP+Nginx也是非常常见的搭配方式,所以这里不讨论。

0x00 主题资源

很多人使用了外国主题,里面调用了许多国内无法访问或者访问很慢的资源,比如Google fonts,或者直接引用的外国CDN上的js文件,都可能导致网站加载速度过慢。在Chrome中按F12打开Developer Tools,选择其中的Network面板就可以看到加载过慢的元素,你可以下载这些文件到自己的服务器中,然后通过跨文件搜索工具搜索引用这些元素的文件并将他们的URL修改为自己网站的链接。

0x01 Nginx

如果你使用了HTTPS,那请直接开启HTTP2,极大的提高网页加载速度

listen 443 ssl http2 fastopen=3 reuseport;

fastopen是Linux内核的特性,客户端和服务端均为Linux内核时才有作用,可加快TCP握手速度。reuseport为Nginx 1.9.1的新特性套接字端口共享,详情可参考Socket Sharding in NGINX Release 1.9.1。

使用keepalive并设定一个过期时间,单位为秒,在时间内浏览器和服务器会保持连接,有新的请求响应会更迅速。

keepalive_timeout 70;

对于https,可以设置ssl会话过期时间

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;

对于一些静态化的资源,比如js与css文件,可以通过设置缓存过期时间,告诉浏览器在规定时间内不需要再次请求这些资源以加快访问速度(d为天,h为小时)

location ~.*.(js|css)?$  
{  
 expires 1d;  
} 

大多数Nginx配置中都已经启用Gzip来压缩网页内容,你也可以使用谷歌开发的Brotli来提高压缩率,需要在Nginx编译时引入

#下载Brotli的Nginx模块
git clone https://github.com/google/ngx_brotli.git
cd ngx_brotli
git submodule update --init

#在Nginx编译时设定参数
./configure --add-module=../ngx_brotli

#在Nginx的主配置http块中开启Brotli
brotli             on;
brotli_comp_level  6;
brotli_types       text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;

0x02 PHP

PHP对WordPress性能的影响非常大,建议使用7.0以及更新的版本,我目前在使用PHP7.1。PHP的几个大版本性能差异可以看PHP核心开发者鸟哥的评测,大致上7.x版本会比5.x版本提高一倍左右的性能。
PHP另外一个需要注意的点是要开启OPcache,OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销。
PHP 5.5.0及以后的版本只要未在编译时禁用默认扩展,OPcache均已附带在PHP中,只需要在PHP配置文件PHP.ini中使用zend_extension=opcache.so即可加载(Windows使用zend_extension=php_opcache.dll加载)
推荐配置(官方配置说明)

opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.max_wasted_percentage=5
opcache.validate_timestamps=60 (你对代码的改动将会在此秒数后生效)
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.file_cache=/tmp (让Opcache把opcode缓存缓存到外部文件中)

同时可以为OPcache启用大页内存,使用命令sudo sysctl vm.nr_hugepages=512分配,PHP.ini中加入

opcache.huge_code_pages=1

对于使用IIS的用户,可以使用WinCache扩展,下载后将其释放到PHP目录下的ext文件夹中,在PHP.ini中加载

extension=php_wincache.dll
wincache.fcenabled=1
wincache.ocenabled=1

0x003 WordPress后端缓存

WordPress的后端缓存有例如使用Memcached和Redis的,不过无一例外,都需要使用TCP进行通讯,而使用PHP的扩展APCu进行后端缓存则可以绕过这一瓶颈。
首先安装APCu,如果你和我一样直接使用包管理器安装PHP,那么使用同样的方式安装即可。如果你使用的一键包或者自己手动编译安装,则需要自己手动编译,你可以在这里找到最新的模块

wget https://pecl.php.net/get/apcu-5.1.8.tgz
tar zxf apcu-5.1.8.tgz
phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
sudo make install

在PHP.ini中添加

extension=apcu.so
apc.enabled=1
apc.enable_cli=1

在WordPress中安装WP LCache插件并启用,在WordPress网站目录下的wp-content中新建一个文件object-cache.php,在其中填入

<?php
$lcache_path = dirname( realpath( __FILE__ ) ) . '/plugins/wp-lcache/object-cache.php';
require_once( $lcache_path );

保存即可生效,之后会发现WP后台的响应速度有可见变化。

一分钟开启Tomcat https支持

1、修改配置文件

打开tomcat/conf/server.xml配置文件,把下面这段配置注释取消掉, keystorePass为证书密钥需要手动添加,创建证书时指定的。

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

2、创建证书

使用jdk工具类里面的 keytool命令来生成证书,按照提示输入相应的信息。

C:>keytool -genkey -alias https -keyalg RSA
输入密钥库口令:
您的名字与姓氏是什么?
 [Unknown]:  test
您的组织单位名称是什么?
 [Unknown]:  test
您的组织名称是什么?
 [Unknown]:  test
您所在的城市或区域名称是什么?
 [Unknown]:  test
您所在的省/市/自治区名称是什么?
 [Unknown]:  test
该单位的双字母国家/地区代码是什么?
 [Unknown]:  test
CN=test, OU=test, O=test, L=test, ST=test, C=test是否正确?
 [否]:  y
输入 <https> 的密钥口令
       (如果和密钥库口令相同, 按回车):
再次输入新口令:

这里的密钥口令就是配置文件中的 keystorePass配置。

3、访问https

通过 https://localhost:8443/your-project就能访问https项目。

这种方式只适合本地开启https测试,线上环境需要购买商业授权的证书,不过原理都是一样的。

Linux 一台服务器部署多个tomcat

linux系统下安装两个或多个tomcat

编辑环境变量:vi /etc/profile

加入以下代码(tomcat路径要配置自己实际的tomcat安装目录)

##########first tomcat###########

CATALINA_BASE=/usr/local/tomcat
CATALINA_HOME=/usr/local/tomcat
TOMCAT_HOME=/usr/local/tomcat
export CATALINA_BASE CATALINA_HOME TOMCAT_HOME

##########first tomcat############

##########second tomcat##########

CATALINA_2_BASE=/usr/local/tomcat_2
CATALINA_2_HOME=/usr/local/tomcat_2
TOMCAT_2_HOME=/usr/local/tomcat_2
export CATALINA_2_BASE CATALINA_2_HOME TOMCAT_2_HOME

##########second tomcat##########

保存退出。
再输入:source /etc/profile
才能生效。

第一个tomcat,保持解压后的原状不用修改,

来到第二个tomcat的bin目录下
打开catalina.sh ,找到下面红字,

# OS specific support.  $var _must_ be set to either true or false.

在下面增加如下代码

export CATALINA_BASE=$CATALINA_2_BASE
export CATALINA_HOME=$CATALINA_2_HOME

来到第二个tomcat的conf目录下
打开server.xml更改端口:
修改server.xml配置和第一个不同的启动、关闭监听端口。
修改后示例如下:
 

 <Server port="9005" shutdown="SHUTDOWN">                  端口:8005->9005
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
    <Connector port="9080" maxHttpHeaderSize="8192"        端口:8080->9080
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
     enableLookups="false" redirectPort="8443" acceptCount="100"
     connectionTimeout="20000" disableUploadTimeout="true" />
<!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="9009"                                  端口:8009->9009
     enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

分别进入两个tomcat的bin目录,启动tomcat–./startup.sh
http://localhost:8080http://localhost:9080然后访问 和 都可以看到熟悉的tomcat欢迎界面。

将尝试SSH爆破的IP批量添加到hosts.deny

如果有人尝试爆破ssh服务,就会在 /var/log/secure留下错误记录,因此我们可以利用下面的脚本批量添加历史IP到/etc/hosts.deny

#!/bin/bash

#add ip ban list and log the first 1000 lines
#grep "Failed password for invalid user" /var/log/secure | awk '{print $13}' | sort | uniq -c | sort -nr | head -n 1000|
#add invalid user ban list and log the first 100 lines
grep "Failed password for invalid user" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr|head -n 100|

while read a b  
do  
    grep -q $b /etc/hosts.deny
      if [ $? != 0 ] ; then
        if [ $a -ge 5 ] ; then
            echo "sshd: $b" >> /etc/hosts.deny
            fi
      fi
done