团队合作必备的Git操作

编辑器&Mac

1、编辑器的使用vs code

  • 插件
    • git辅助工具,可查看代码的书写者:Git Blame

2、 Mac工具使用

  • 强大终端 item2

3、在 macOS 中完美配置文件名大小写敏感(解决git默认对大小写不敏感问题)解决git大小写不敏感

知识篇

一、git使用

  • 一般企业中使用代码管理工具Git开发时都是通过拉分支进行功能细致开发,所以掌握git的分支操作时必要的
  • 使用Git下载指定分支命令为:git clone -b 分支名仓库地址
  • 初始开发git操作流程
    • 本地创建公钥ssh-keygen -t rsa -C “邮箱”并配置
    • 克隆最新主分支项目代码git clone 地址
    • 创建本地分支git branch 分支名
    • 查看本地分支git branch
    • 查看远程分支git branch -a
    • 切换分支git checkout 分支名(一般修改未提交则无法切换,大小写问题经常会有,可强制切换git checkout 分支名 -f非必须慎用)
    • 将本地分支推送到远程分支git push <远程仓库> <本地分支>:<远程分支>

必备知识点

概念:

未分类

  • Remote:远程主仓库;
  • Repository:本地仓库;
  • Index:Git追踪树,暂存区;
  • workspace:本地工作区(即你编辑器的代码)

一般操作流程:《工作区》-> git status查看状态 -> git add .将所有修改加入暂存区-> git commit -m “提交描述”将代码提交到本地仓库->git push将本地仓库代码更新到远程仓库

1、git remote

  • 为远程仓库指定别名,以便于管理远程主机,默认只有一个时为origin
  1. 查看主机名:git remote
  2. 查看主机名即网址:git remote -v
    默认克隆远程仓库到本地时,远程主机为origin,如需指定别名可使用git clone -o <别名> <远程git地址>

  3. 查看主机的详细信息git remote show <主机名>

  4. 添加远程主机git remote add <主机名> <网址>
  5. 删除远程主机git remote rm <主机名>
  6. 修改远程主机的别名:git remote rename <原主机名> <新主机名>

2、git fetch

  • 将某个远程主机的更新,全部/分支 取回本地(此时之更新了Repository)它取回的代码对你本地的开发代码没有影响,如需彻底更新需合并或使用git pull
  1. 远程主机的更新,全部取回本地git fetch <远程主机名>;
  2. 将远程仓库特定分支更新到本地git fetch <远程主机名> <分支名>
  • 如果需要将更新拉取但本地工作代码需要合并到本地某一分支git merge <被合并的远程分支>或者在此基础上创建出新分支并切换git checkout -b <分支名> <在此分支上创建>

3、git pull

  • 拉取远程主机某分支的更新,再与本地的指定分支合并(相当与fetch加上了合并分支功能的操作)
  1. 拉取远程某分支并与本地某一分支合并(没有则默认会创建):git pull <远程主机名> <远程分支名>:<本地分支名>
  2. 如果远程分支是与当前所在分支合并,则冒号后面的部分可以省略:git pull <远程主机名> <远程分支名>
  3. 如果当前分支与远程分支存在追踪关系,则可以省略远程分支名:git pull <远程主机名>
  4. 如果当前分支只有一个追踪分支,则远程主机名都可以省略:git pull

4、git push

  • 将本地分支的更新,推送到远程主机,其命令格式与git pull相似
  1. 将本地分支推送到远程分支:git push <远程主机名> <本地分支名>:<远程分支名>
  2. 如果省略远程分支名,则默认为将本地分支推送到与之关联的远程分支:(一般设置本地分支和与之关联的远程分支同名,防止混淆)git push <远程主机名> <本地分支名>
    如果对应的远程分支不存在,则会被创建(m默认与本地分支同名)

  3. 如果省略本地分支名,则表示删除指定的远程分支,这等同于推送一个空的本地分支到对应远程分支:git push origin :<远程分支> 等同于 git push origin –delete <远程分支>

  4. 如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略git push origin
  5. 如果当前分支只有一个追踪分支,那么主机名也可以省略:git push
  6. 如果当前分支与多个主机存在追踪关系(使用场景相对来说较少),可以使用-u指定默认推送主机git push -u origin <主机名>设置时候需推送便可以直接使用git push
  7. 将本地的所有分支都推送到远程主机:git push –all origin
  8. 如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,然后再推送到远程主机。如果一定要推送,可以使用–force选项(谨慎使用,除非你非常确认):git push –force origin
  • 注意:分支推送顺序的格式为<来源地>:<目的地>,所以git pull格式:<远程分支>:<本地分支>,git push格式为:<本地分支>:<远程分支>。

5、分支操作

  1. 创建本地分支:git branch test:(创建名为test的本地分支)
  2. 切换分支:git checkout test:(切换到test分支)
  3. 创建并切换分支git branch -b test:(相当于以上两条命令的合并)
  4. 查看本地分支:git branch
  5. 查看远程仓库所有分支:git branch -a
  6. 删除本地分支:git branch -d test:(删除本地test分支)
  7. 分支合并:git merge master:(将master分支合并到当前分支)
  8. 本地分支重命名:git branch -m oldName newName
  9. 远程分支重命名:
  • 重命名远程分支对应的本地分支:git branch -m oldName newName;
  • 删除远程分支:git push –delete origin oldName;
  • 上传新命名的本地分支:git push origin newName;
  • 把修改后的本地分支与远程分支关联:git branch –set-upstream-to origin/newName

分支关联

查看当前的本地分支与远程分支的关联关系:git branch -vv

未分类

把当前本地分支与远程origin的某分支进行关联处理(通过 –set-upstream-to 命令):git branch –set-upstream-to=origin/feature/clear-server-eslint-error_180713

未分类

分支差异查看

  1. 查看本地当前分支与远程某一分支的差异:git diff origin/feature/reserve-3.4
  2. 查看本地特定分支与远程分支的差异:git diff master origin/feature/reserve-3.4 (查看本地master分支与远程feature/reserve-3.4分支的差异,如图)

未分类

6、修改撤销

  1. git checkout — <文件名>:丢弃工作区的修改,就是让这个文件回到最近一次git commit或git add时的状态。
  2. git reset HEAD <文件名>:把暂存区的修改撤销掉(unstage),重新放回工作区。
  3. git reset –hard commit_id:git版本回退,回退到特定的commit_id版本
  • 流程:
  • git log查看提交历史,以便确定要回退到哪个版本(commit 之后的即为ID);

未分类

  • git reset –hard commit_id:回退到commit_id版本;
  • git reflog查看命令历史,以便确定要回到未来的哪个版本;
    • 更新远程代码到本地
      git fetch origin master(分支)
      git pull // 将fetch下来的代码pull到本地
      git diff master origin/master // 查看本地分支代码和远程仓库的差异
  • 拉取远程分支并创建本地分支

  1. git checkout -b 本地分支名 origin/远程分支名:使用此方式会在本地新建分支,并自动切换到该本地分支;
  2. git fetch origin 远程分支名:本地分支名:使用此方式会在本地新建分支,但是不会自动切换到该本地分支,需要手动checkout。

7、配置

  • git config -l // 陈列出所有的git配置项
  • git config core.ignorecase false //配置git不忽略大小写(默认忽略)参照(git 大小写)

  • 往期经典好文:

    • JavaScript经典面试题汇总 https://segmentfault.com/a/1190000015162142
    • 我的前端面试日记 https://segmentfault.com/a/1190000015268943
  • 相关好文推荐:
    • http报文详解 https://segmentfault.com/a/1190000015017908

Zabbix 3.2 配置邮件告警实践指南

下面为大家介绍zabbix邮件告警配置,报警方式有好几种,最常用的就是邮件了,比较有钱的公司可能会使用短信,等后面有时间,再写一篇zabbix基于企业微信告警的文章。那么现在就开始讲邮件告警啦。

第一、安装邮件发送工具mailx

这里我选择的是mailx,Centos6默认会安装,如果没有安装的话,请使用语句进行安装。

yum install -y mailx

第二、查看是否有其他的邮件发送工具,进行关闭。

service sendmail  stop
chkconfig sendmail off
service  postfix  stop
chkconfig  postfix off

第三、配置Zabbix服务端外部邮箱

打开文件vim /etc/mail.rc 如果没有的话,有可能是 /etc/nail.rc,在最后加内容如下:

set  sendcharsets=iso-8859-1,utf-8     #设置发送支持的编码
set  [email protected]              #在邮件头中可以看到的发送人 
set  smtp=smtp.139.com             #smtp服务器 
set  [email protected]       #发送邮件的用户 
set  smtp-auth-password=xxx          #邮件发送人密码

第四、测试发送邮件是否可用

echo   “test”  |  mailx    -s   “test  mail”     [email protected]

未分类

发送成功

第五、编辑zabbix-server配置文件,启用脚本执行路径,编写发送邮件脚本

vim    /etc/zabbix/zabbix-server.conf 
AlertScriptsPath=/usr/lib/zabbix/alertscripts/         启用选项

编写脚本

vim  /usr/lib/zabbix/alertscripts/sendmail.sh 
#!/bin/bash export.UTF-8               #解决发送的中文变成了乱码的问题
FILE=/tmp/mailtmp.txt echo "$3" > $FILE 
dos2unix -k $FILE                       #解决了发送的邮件内容变成附件的问题。
bin/mailx  -s  "2" $1 < $FILE

上面涉及3个参数,$1:收件人邮箱 $2:邮件标题 $3:邮件正文

chmod  +x  /usr/lib/zabbix/alertscripts/sendmail.sh       #赋予执行权限 
chown zabbix:zabbix /usr/lib/zabbix/alertscripts/sendmail.sh   #属主属组为zabbix用户
service   zabbix-server    restart

第六、在zabbix的web界面上配置发送告警

1、点击配置 –> 报警媒介类型 –> 创建媒介类型

未分类

2、$1,$2,$3分别表示发送脚本中的$1,$2,$3,配置好后保存,点击更新

未分类

3、给用户添加报警媒介

点击 管理–> 用户 –> Admin用户,或者自己另创建用户

未分类

4、添加媒介

未分类

5、编辑添加,填写后点击 已启用 –> 更新

未分类

6、创建触发告警动作

未分类

填写动作选项

未分类

填写操作,步骤1-0表示无限制,步骤持续时间表示多久发生一次告警

未分类

填写恢复操作

未分类

以上操作完成后点击更新

第七、测试阶段

将一台添加到 Template OS Linux 模板的服务器进行关闭客户端

service  zabbix-agent stop

登录到zabbix Web界面,看触发告警

未分类

触发成功,并显示发送告警成功,查看邮件

未分类

邮件接收成功

启动服务器zabbix客户端查看是否会发生恢复邮件

service   zabbix-agent   start

未分类

接收到恢复告警邮件,查看web界面是否触发问题已取消

未分类

服务器均正常。

到此,zabbix邮件告警就结束了。

zabbix企业级监控之监控数据库大小、表大小

1.怎么去获取到数据库大小、表大小?

information_schema数据库存储了关于数据库的信息

未分类

使用information_schema数据库

MariaDB [(none)]> use information_schema ;

查询数据库总大小

MariaDB [information_schema]> select concat(round(sum(data_length/1024/1024),2),'MB') as data from tables;

未分类

查询指定数据库zabbix的大小

MariaDB [information_schema]> select concat(round(sum(data_length/1024/1024),2),'MB') as data from tables where table_schema='zabbix';

未分类

查询指定数据库的指定表的大小(zabbix数据库的items表的大小)

select concat(round(sum(data_length/1024/1024),2),'MB') as data from tables where table_schema='zabbix' and table_name='items';

未分类

2.如何通过shell 脚本去获取?

vim /etc/zabbix/shell/monitor_mysql.sh

#!/bin/bash

DB_size() {
       mysql -Dinformation_schema -e "select concat(round(sum(data_length/1024/1024),2)) as data from tables" |awk 'NR==2{print $1}'
}

DB_zabbix_size() {
     mysql -Dinformation_schema -e "select concat(round(sum(data_length/1024/1024),2)) as data from tables where table_schema='zabbix'" | 
     awk 'NR==2{print $1}'
}

$1

3.agent定义模板

vim userparameter_my.conf

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

参数解释:
monitor_mysql[]:是自定义key,是传参 是从server端自定义键值的时候传参传下来的

4.server端自定义键值,请参考第二篇,监控QPS和TPS的那篇
5.准备更新一个关于zabbix监控的专题,欢迎加入我们的Linux技术交流群:642921645,zabbix监控交流群:832462735 ,我们不定期去更新很多关于系统运维的资料在群里,期待你的加入!
6.在腾讯课堂有zabbix监控的免费技术分享,欢迎来听!地址如下:https://ke.qq.com/course/316681?tuin=6645db32

MySQL-Xtrabackup备份还原

前言

通常我们都是使用xtrabackup工具来备份数据库,它是一个专业的备份工具,先来简单介绍下它。

Xtrabackup

percona提供的mysql数据库备份工具,惟一开源的能够对innodb和xtradb数据库,它的增量备份不是基于二进制日志文件来还原数据的,是基于mysql数据块。

特点:

  • 备份还原过程快速、可靠
  • 备份过程不会打断正在执行的事务
  • 能够基于压缩等功能节约磁盘空间和流量
  • 自动实现备份检验
  • 开源,免费

Xtrabackup用法

备份时选项

xtrabackup –backup

--user:该选项表示备份账号

--password:该选项表示备份的密码

--host:该选项表示备份数据库的地址

--databases:该选项接受的参数为数据名,如果要指定多个数据库,彼此间需要以空格隔开;如:”xtra_test dba_test”,同时,在指定某数据库时,也可以只指定其中的某张表。如:”mydatabase.mytable”。该选项对innodb引擎表无效,还是会备份所有innodb表

--defaults-file:该选项指定从哪个文件读取MySQL配置,必须放在命令行第一个选项位置

--incremental:该选项表示创建一个增量备份,需要指定–incremental-basedir

--incremental-basedir:该选项指定为前一次全备份或增量备份的目录,与–incremental同时使用

--incremental-dir:该选项表示还原时增量备份的目录

--include=name:指定表名,格式:databasename.tablename

Prepare于准备选项

prepare

--apply-log:此选项作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态

--use-memory:该选项表示和–apply-log选项一起使用,prepare 备份的时候,xtrabackup做crash recovery分配的内存大小,单位字节。也可(1MB,1M,1G,1GB),推荐1G

--export:表示开启可导出单独的表之后再导入其他Mysql中

--redo-only:此选项在prepare base full backup,往其中merge增量备份时候使用

还原时选项

--copy-back:复制

--move-back:移动

备份生产的相关文件

1)xtrabackup_info:innobackupex工具执行时的相关信息,包括版本,备份选项,备份时长,备份LSN,BINLOG的位置

2)xtrabackup_checkpoints:备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息,每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的

3)xtrabackup_binlog_info:MySQL服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置,可利用实现基于binlog的恢复

4)backup-my.cnf:备份命令用到的配置选项信息

5)xtrabackup_logfile:备份生成的日志文件

还原注意事项

1.datadir目录必须为空。除非指定innobackupex –force-non-emptydirectorires选项指定,否则–copy-backup选项不会覆盖

2.restore还原之前,必须shutdown停止 MySQL服务,不能将一个运行中的实例restore到datadir目录中

3.修改恢复文件的权限为mysql

4.最后一次增量备份还原要回滚事务

5.二进制安装的mysql要是出现停止不了服务就用killall –9 mysqld 杀掉进程进而实现停止服务

实战

规划

1、两台主机17和37,其中17当主mysql服务器,37用来还原的主机,

2、目录,1个存放完整备份的目录,N个存放增量备份的目录

未分类

说明:

full目录: 存放完全备份

inc1目录:存放第一次的增量备份

inc2目录:存放第二次的增量备份

备份阶段

1、完全备份数据库

xtrabackup -pcentos --backup --target-dir=/backups/full/
# --backup表示备份
# --target-dir=填写备份到哪里

2、往表中增加数据

mysql -pcentos hellodb -e "insert students (name,age) values('gaodao01',20)"

未分类

3、第一次增量备份

xtrabackup –pcentos --backup --target-dir=/backups/inc1/ --incremental-basedir=/backups/full
# --incremental-basedir表示基于谁的增量备份,写上上一次的备份路径
#

未分类

4、再次修改数据表

mysql -pcentos hellodb -e "insert students (name,age) values('gaodao02',21)"

未分类

5、第二次增量备份

xtrabackup -pcentos --backup --target-dir=/backups/inc2/ --incremental-basedir=/backups/inc1/

未分类

还原阶段

说明:还原的时候我们要考虑到前几次不要回滚,最后一次还原要回滚,还原主机要安装xtrabackup工具

1、把备份的目录传送到要还原的主机上

scp -r /backups/ 192.168.43.37:/

2、停服务并清空mysql数据

systemctl stop mysqld
rm -rf /app/mysql/*

3、完全备份的预处理

xtrabackup  --prepare --apply-log-only --target-dir=/backups/full
# --prepare 表示还原
# --apply-log-only 表示不回滚

4、第一次增量备份预处理

xtrabackup --prepare --apply-log-only --target-dir=/backups/full --incremental-dir=/backups/inc1
# 同样不回滚

5、第二次增量备份预处理

xtrabackup --prepare  --target-dir=/backups/full --incremental-dir=/backups/inc2
# 这是最后一次,所以要回滚不完整的事务

6、复制处理好的数据到真正的存放数据库目录下

xtrabackup --copy-back --target-dir=/backups/full
# 它会根据你的配置文件my.cnf来读取存放位置

7、修改数据库文件权限

chown -R mysql.mysql /app/mysql/

以上还原到了备份时的状态,我们备份完二次增量后又加了条记录,还没来得急三次增量备份就宕机了,所以再次利用二进制日志文件还原到最新状态

8、通过二进制文件还原到最新状态

1)以下图中文件记录了还原到的位置

未分类

2)从原主机导出二进制文件日志

mysqlbinlog --start-position=1039 /app/logs/mysql-bin.000003 >/app/binlog.sql

3)scp传送到目标主机来还原

  • 首先在配置文件中加入禁止所有人访问选项
skip-networking
  • 启动服务
systemctl start mysqld
  • 导入二进制日志
mysql -pcentos <binlog.sql

4)进入数据库验证

未分类

5)OK 恢复完成,删除配置文件中的skip-networking并重启服务

systemctl restart mysqld

Squid传统代理与透明代理构建

一、缓存代理概述

1.缓存代理概述

作为应用层的代理服务软件,Squid主要提供缓存加速和应用层过滤控制的功能。

2.代理的工作机制

当客户机通过代理来请求Web页面时,指定的代理服务器会检查自己的缓存,如果缓存中已经存在客户机需要访问的页面,则之间将缓存中的页面内容反馈给客户机;若代理服务器中的缓存中没有客户机需要访问的页面,则由代理服务器向Internet发送访问请求,再将获得的页面数据保存到缓存中,并发送给客户机.

二、手工编译安装squid

1.解压缩squid安装文件到/opt

tar zxvf squid-3.5.28.tar.gz -C /opt

2.配置squid的编译选项

cd /opt/squid-3.5.28/
[root@promote squid-3.5.28]# ./configure --prefix=/usr/local/squid      //指定安装目录
> --sysconfdir=/etc      //单独将配置文件修改到其他目录
> --enable-arp-acl     
> --enable-linux-netfilter     //使用内核过滤
> --enable-linux-tproxy        //支持透明模式
> --enable-async-io=100        //异步I/O
> --enable-err-language="Simplify_Chinese"   //错误提示信息的语言
> --enable-underscore     //允许url中有下划线
> --enable-poll          //使用poll()模式,提升性能
> --enable-gnuregex    //使用gun正则表达式
make && make install

3.将squid程序命令创建软链接到系统命令下

ln -s /usr/local/squid/sbin/* /usr/local/sbin/

4.添加用户

useradd -M -s /sbin/nologin squid

5.更改所属主与所属组

chown -R squid.squid /usr/local/squid/var/

6.编辑squid配置文件,

vim /etc/squid.conf

cache_effective_user squid        #添加   指定程序用户
cache_effective_group squid       #添加   指定账号基本组
coredump_dir /usr/local/squid/var/cache/squid
squid -k parse   //检查配置文件语法

squid -z   //初始化缓存目录

squid    //启动服务

查看服务是否开启

netstat -natp | grep squid
tcp6       0      0 :::3128                 :::*                    LISTEN      84346/(squid-1)

7.创建squid脚本文件,更好的管理squid服务

cd /etc/init.d/
vim squid
#!/bin/bash
#chkconfig: 2345 90 25
PID="/usr/local/squid/var/run/squid.pid"
CONF="/etc/squid.conf"
CMD="/usr/local/squid/sbin/squid"

case "$1" in
   start)
     netstat -natp | grep squid &> /dev/null
     if [ $? -eq 0 ]
     then
       echo "squid is running"
       else
       echo "正在启动 squid..."
       $CMD
     fi
   ;;
   stop)
     $CMD -k kill &> /dev/null
     rm -rf $PID &> /dev/null
   ;;
   status)
     [ -f $PID ] &> /dev/null
        if [ $? -eq 0 ]
          then
            netstat -natp | grep squid
          else
            echo "squid is not running"
        fi
   ;;
   restart)
      $0 stop &> /dev/null
      echo "正在关闭 squid..."
         $0 start &> /dev/null
      echo "正在启动 squid..."
   ;;
   reload)
      $CMD -k reconfigure
   ;;
   check)
      $CMD -k parse
   ;;
   *)
      echo "用法:$0{start|stop|status|reload|check|restart}"
   ;;
esac

chmod +x squid //给脚本添加可执行权限

8.添加为系统服务并设置开机自启动

chkconfig --add squid
chkconfig --level 35 squid on

此时我们可以使用squid脚本来启动、停止、重启和重载suqid服务器了。

三、传统代理构建

传统代理案例环境

未分类

1.squid代理服务器的配置

(1)编辑suqid.conf 配置文件

cache_mem 64 MB   #指定缓存功能所使用的内存空间大小,便于保持访问较频繁的WEB对象,容量最好为4的倍数,单位为MB,建议设为物理内存的1/4
reply_body_max_size 10 MB    #允许用户下载的最大文件大小,以字节为单位。默认设置0表示不进行限制
maximum_object_size 4096 KB    #允许保存到缓存空间的最大对象大小,以KB为单位,超过大小限制的文件将不被缓存,而是直接转发给用户

重启squid服务

service squid restart
正在关闭 squid...
正在启动 squid...

(2)添加防火墙策略

[root@promote init.d]# iptables -F
[root@promote init.d]# setenforce 0
[root@promote init.d]# iptables -I INPUT -p tcp --dport 3218 -j ACCEPT

重载suqid服务

[root@promote init.d]# service squid reload

2.在http的服务器上安装httpd服务

(1)关闭防火墙

[root@promote ~]# systemctl stop firewalld.service 
[root@promote ~]# setenforce 0

(2)安装httpd

[root@promote ~]# yum install httpd -y

(3)开启httpd服务

[root@promote ~]# systemctl start httpd.service
[root@promote ~]# netstat -natp | grep 80
tcp6       0      0 :::80                   :::*                    LISTEN      7975/httpd

3.win7客户机上进行代理配置

(1)在Ie浏览器中,选择“工具”一>“Internet 选项”,弹出“Internet选项”对话框,

在“连接”选项卡中的“局域网(LAN)设置”选项组中单击“局域网设置”按钮,弹出“局域网(LAN)设置”对话框,
勾选”为LAN使用代理服务器”,在地址栏框中输入squid代理服务器的地址,端口为3128

未分类

(2)访问httpd服务器的网站

未分类

4.查看httpd服务器访问日志的新增记录

cd /etc/httpd/logs
vim access_log

未分类

四、构建透明代理

未分类

1.squid服务器配置

(1)编辑squid.conf配置文件

http_port 192.168.100.1:3128 transparent

重载服务

service squid reload

(2)添加防火墙策略

[root@localhost ~]# iptables -t nat -I PREROUTING -i ens32 -s 192.168.100.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
[root@localhost ~]# iptables -t nat -I PREROUTING -i ens32 -s 192.168.100.0/24 -p tcp --dport 443 -j REDIRECT --to 3128
[root@localhost ~]# iptables -I INPUT -p tcp --dport 3218 -j ACCEPT

2.win7测试机浏览器配置

未分类

3.查看htpt服务器的日志访问

未分类

squid代理服务的ACL访问控制、日志分析及反向代理(4.1版本)

squid的ACL访问控制列表

squid提供了强大的代理控制机制,通过合理的设置ACL(Access Control List,访问控制列表)并进行限制,可针对源地址、目标地址、访问的URL路径、访问的时间等各种控制条件进行过滤。

ACL访问控制通过以下两个步骤来实现:

①、使用acl配置项定义需要控制的条件;

②、通过http_access配置项对已定义的列表做“允许”或者“拒绝”访问的控制。

1. 定义访问控制列表

格式:acl 列表名称 列表类型 列表内容 ···

常见的访问控制列表类型

未分类

2. 设置访问权限

定义好各种访问控制列表以后,使用http_access配置项来进行控制。

格式:http_access allow或deny 列表名···

在设置访问权限时,需要注意两点:

  1. 没有设置任何规则时:squid服务将拒绝客户端的请求
  2. 有规则但找不到相匹配的项:squid将采用与最后一条规则相反的权限。

演示实验

因为之前我们做了squid的透明代理的实验,所以这里就接着那个实验继续做,配置好透明代理后,我们可以使用IP为192.168.100.50的client(客户端)访问IP为12.0.0.12的web服务器,那么下面我们就通过设置acl访问控制列表使client不能访问web服务器

vim /etc/squid.conf

acl localhost src 192.168.100.0/24     #定义访问控制列表

http_access deny localhost   #对列表做拒绝处理

service squid stop
service squid start      #重启服务

未分类

未分类

未分类

未分类

squid日志分析

squid的日志分析功能需要借助sarg(Squid Analysis Report Generator),首先先部署安装sarg工具

  • 安装相关的软件环境包
yum -y install gcc gcc-c++ gd gd-devel httpd #这里的dg库是支持图像处理的软件

sarg下载地址https://sourceforge.net/projects/sarg/

  • 安装sarg
mkdir /usr/local/sarg       #为sarg创建安装目录

tar zxvf sarg-2.3.11.tar.gz -C /opt/  #将sarg解压到指定目录
cd /opt/sarg-2.3.11/    #到sarg目录中进行编译安装

./configure --prefix=/usr/local/sarg     #这里指定安装目录
--sysconfdir=/etc/sarg     #指定配置文件目录
--enable-extraprotection    #开启额外保护功能

配置完后,进行编译和安装
make && make install
  • 修改sarg配置文件

vim /etc/sarg/sarg.conf

access_log /usr/local/squid/var/logs/access.log    #指定访问日志文件(开启)
title "Squid User Access Reports"      #网页标题(开启)
output_dir /var/www/html/squid-reports    #报告输出目录(开启)
user_ip no          #使用用户名显示(开启)
exclude_hosts /usr/local/sarg/noreport   #不计入排序的站点列表文件(开启,删除none,添加路径)
topuser_sort_field connect reverse   #top排序中有连接次数、访问字节、降序排列升序是normal (开启,修改BYTES)
user_sort_field connect reverse    #用户访问记录  连接次数、访问字节按降序排序  (开启,修改BYTES)
overwrite_report no   #同名日志是否覆盖(开启)
mail_utility mailq.postfix   #发送邮件报告命令(开启,修改mail)
charset UTF-8   #使用字符集 (开启)
weekdays 0-6   #top排行的星期周期 (开启)
hours 0-23   #top排行的时间周期(开启)
www_document_root /var/www/html  #网页根目录(开启)
touch /usr/local/sarg/noreport 创建上述不计入站点文件,添加的域名将不被显示在排序中
ln -s /usr/local/sarg/bin/sarg /usr/local/bin/
#建立软链接,方便使用命令
systemctl start httpd.service
#因为我们要在网页里访问日志,需要我们开启httpd服务
  • 运行sarg

未分类

然后使用client登录网页管理界面

未分类

反向代理

squid反向代理可以加速网站的访问速度,可将不同的URL请求分发到后台不同的web服务器上,同时互联网用户只能看到反向代理服务器的地址,加强网站的访问安全。

squid反向代理加速的原理描述如下:

  • Squid反向代理服务器位于本地Web服务器和Internet之间,客户端请求访问Web服务器时,DNS将访问的域名解析为Squid反向代理服务器的IP地址,客户端将访问Squid代理服务器。
  • 如果Squid反向代理服务器缓存了该请求的资源,则将该请求的资源返回给客户端,否则反向代理服务器将向后台的Web服务器请求资源,然后将应答资源返回给客户端,同时也将该资源在本地缓存一份,供下一个请求使用。

未分类

实验环境

未分类

  • 修改squid代理服务的配置文件

vim /etc/squid.conf

acl web1 dstdomain www.yun.com
acl web2 dstdomain www.yun.com
#定义两个个基于域名的控制列表,分别命名为web1,web2
http_access allow web1 web2
#允许以web1,web2为目标域名的访问
http_port 172.16.10.137:80 accel vhost vport
#将端口监听在 172.16.10.137的80端口上,accel 指启用加速模式,vhost,vport用于转发请求
cache_peer 172.16.10.29 parent 80 0 no-query originserver round-robin weight=1 name=web1
#cache_peer 指定后端服务器地址,80 为后端服务端口,0 为 ICP 端口号(多个 Squid 时用),originserver 指定资源服务器,round-robin指使用轮询方式,weight指的是权重,自由分配,name 指定一个别名
cache_peer 172.16.10.134 parent 80 0 no-query originserver round-robin weight=1 name=web2
#和上面的一样

未分类

这里记得重新启动squid服务

  • 修改两个http服务的首页内容,方便后面实验的验证

未分类

未分类

  • 修改客户端win7的地址解析使之识别www.yun.com

未分类

未分类

未分类

这样就实验成功了,访问www.yun.com,真实服务器会使用轮询的方式,分别轮流访问两台web服务器。

自动化运维工具—SaltStack安装部署及简单案例

SaltStack原理

  • SaltStack由Master(服务端)和Minion(客户端)组成,Master和Minion之间通过ZeroMQ(消息队列)进行通讯,Master和Minion分别监听4505与4506端口,4505为master与minion认证通信端口,4506为master用来发送或者接受minion的命令执行返回信息。
  • 当客户端启动后,会主动链接master端注册,然后一直保持该TCP连接,而master通过这条TCP连接对客户端进行控制,如果连接断开,master将对客户端不能进行控制,但是,当客户端断开连接后,会定期向master端请求注册。

SaltStack常用模块

  • 与ansible类似,SaltStack提供了很多功能模块,便于对操作系统的基础功能和常用工具操作。
1:pkg模块 :是包管理,包括增删更新。
2:file模块 :管理文件操作,包括同步文件、设置文件权限和所属用户组、删除文件等操作。
3:cmd模块 :是在Minion上执行命令或者脚本。
4:user模块 :管理系统账户操作。
5:service模块 :管理系统服务操作
6:cron模块 :管理cron服务操作

实验环境

未分类

SaltStack安装

1、更改主机名关闭防火墙

  • 需要注意的是master与minion端都需关闭SELinux和防火墙,且一定要设置完整的FQDN,域名的形式也要一样,不然在主控端执行远程执行命令或者配置的时候,等待的时间会非常长,甚至还会出现其他不可控的情况。
systemctl stop firewalld.service
setenforce 0

vim /etc/hostname

master.saltstack.com    //(管理)
web01.saltstack.com     //(被管理)
  • 修改每台hosts文件

vim /etc/hosts

192.168.144.112 master.saltstack.com     //所有机器保持一致,保证解析得到的域名可控
192.168.144.111 web01.saltstack.com
  • 重启服务器

2、安装master与minion端

  • 安装master端
yum install epel-release -y 
yum install salt-master
  • 安装被控制端
yum install epel-release -y
yum install -y salt-minion

3、master端配置

vim /etc/salt/master

interface: 192.168.144.111    //15行 监听地址改为本地IP
............
auto_accept: True                //215  证书认证
............
file_roots:                          //416行 站点目录开启,注意打开后目录文件是否存在,若不存在需要手动创建
    base:
         - /srv/salt
............
nodegroups:                          //710行 组分类
    group1: 'web01.saltstack.com' 
    group2: 'web02.saltstack.com'
............
pillar_opts: True              //552行  pillar开启

pillar_roots:                     //529行
     base:
        - /srv/pillar
  • 过滤空行与#开头行,查看所配置项。
cat /etc/salt/master | grep -v ^$ | grep -v ^#
  • 创建master的站点目录/srv/salt与pillar目录/srv/pillar
mkdir /srv/salt
mkdir /srv/pillar
systemctl start salt-master.service //开启服务
netstat -natp | egrep '4505|4506' //查看4505、4506端口

4、被管理端minnion配置

vim /etc/salt/minion

master: 192.168.144.111     //16行 指定管理端IP
id: web01.saltstack.com      //78行 指定被控的主机名
  • 启动minion
systemctl start salt-minion.service

5、C/S构建完成,验证简单操作

salt '' test.ping //查看通信状态
salt '' cmd.run 'df -h' //查看所有被管理端的挂载情况
salt 'web01.saltstack.com' cmd.run 'df -h' //查看指定主机的挂载情况
salt '' grains.items //查看grains值
salt '' pillar.items //查看pillar(动态信息)
salt-key //查看已经被接受过的客户端

Saltstack批量部署安装Apache

1、创建sls入口文件表示执行Apache模块

vim /srv/salt/top.sls

base:
 '*':        //*号表示对所有主机
     - apache   //对应下面执行文件的名称

2、创建模块执行文件

vim /srv/salt/apache.sls

apache-service:
    pkg.installed:
        - names:
            - httpd
            - httpd-devel
    service.running:
        - name: httpd
        - enable: True
systemctl restart salt-master
  • 在主控端执行刷新state配置命令,让被控制端执行安装apache
salt '*' state.highstate
  • 也可去minion被控制端检测是否安装成功。

rsync远程同步的基本配置与使用

未分类

rsync是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,保持链接和权限,且采用优化的同步算法,传输前执行压缩,因此非常适用于异地备份,镜像服务器等应用。

rsync的官方站点是http://rsync.samba.org/,目前最新版本是3.1.1,由Wanyne Davison进行维护。作为一种最常用的文件备份工具,rsync往往是Linux和UNIX系统默认安装的基本组件之一。

1、rsync:快速增量备份工具,实现远程同步,可使用ssh和rsync备份

rsync服务器:备份源,提供一个目录供客户端上传或下载

2、rsync的配置:

建立rsync的配置文件:/etc/rsyncd.conf

use  chroot=yes             禁锢在源地址

port  837                   默认端口号为873

pid  file                     进程号文件位置

hosts  allow                 允许访问客户机地址

[wwwroot]                   共享名

path=/路径                   真正的文件夹位置

comment=                  描述

read  only=yes|no              只读|读写

auth  users=用户名            认证的用户

secrets  file=文件名路径          验证文件

验证文件格式: 用户名:密码

权限必须设置为600

3、管理rsync服务:

启动:rsync –daemon

停止:kill 进程号

4、rsync的使用

格式:rsync 选项 原始位置 目标位置

选项:

  • -a:归档模式,等同于 -rlptgoD

  • -r:递归,包含目录

  • -p:权限(保留权限)

  • -t:时间

  • -z:压缩

  • -v:同步过程信息

  • –delete:删除目标位置有而原始位置没有的文件

5、备份源(服务器端)的表达方式:

1)用户名@服务器IP::共享名

例:[email protected]::wwwroot

2)rsync://用户名@服务器IP/共享名

Rsync -avz [email protected]::wwwroot /root

6、实现免交互模式:

1)创建密码文件并设置权限为600

2)同步时使用 --password-file=文件名 的方式指定文件位置

7、实时同步:有变化则备份,无变化不备份

通过inotify机制实现,实时监控本地文件系统目录的变化,并作出通知响应,适当调整监控文件数量

inotify-tools辅助工具,有两个命令:

inotifywait:持续监控,实时输出结果

inotifywatch:短期监控,完成后输出结果

格式:inotifywait -mrq -e 监控事件类型 /监控目标

-m:持续监控 -r:监控整个目录

-q:简化输出 -e:监控事件类型

类型有:modify(修改) create(创建) move(移动)

delete(删除) attrib(属性更改)

以上便是rsync的基本使用方法了,rsync远程同步实验案例请关注微信公众号 L宝宝聊IT 浏览“rsync远程同步示例”文章进行查阅。

rsync远程同步示例

未分类

实验要求:

(1)如图所示,搭建网络,配置地址。

(2)在1.10服务器上配置为服务端,修改rsync的配置文件/etc/rsyncd.conf,并启动rsync服务程序。

(3)在1.20上使用rsync命令验证是否能够从服务端(/var/www/html)下载文件到客户机端(/myweb)。

(4)修改rsync的配置文件/etc/rsyncd.conf,实现客户机端(/myweb)能上传文件到服务端的(/var/www/html)位置。在客户机端验证。

(5)在1.20上实现每天晚上22:00对服务器的网站目录(/var/www/html)做一次同步。

(6)在1.20上配置rsync+inotify实时同步。通过编写脚本来实现,客户机能够实时上传文件到服务端。注意:需要安装inotify软件。

步骤:

1、 按照要求配置IP地址,实现可以互相ping通。

未分类

2、为备份账户创建数据文件(vim /etc/rsyncd_users.db)并赋予权限。

未分类

未分类

3、修改1.10服务器端的rsync配置文件/etc/rsyncd.conf,并启动rsync服务程序。(启动rsync服务:rsync –daemon)

未分类

4、使用1.20客户机测试能够从服务器端下载文件到/myweb

1) 在1.10的/var/www/html目录下创建一个文件。

未分类

2)在1.20客户机端创建目录/myweb,并同步下载服务器端的文件

未分类

3) 在客户机/myweb目录下查看是否同步,

未分类

5、修改rsync的配置文件/etc/rsyncd.conf,实现客户机端(/myweb)能上传文件到服务端的(/var/www/html)位置。在客户机端验证。

1)进入/etc/rsyncd.conf配置文件并修改。

未分类

2)重启rsync服务,需要先杀死再启动

keill $(cat  /var/run/rsyncd.pid)

rsync --daemon

3)赋予/var/www/html目录相应的权限

未分类

4) 在客户机端/myweb目录下创建一个文件并验证是否能上传同步到服务器端。

未分类

未分类

5)到服务器端查看

未分类

6、在1.20上实现每天晚上22:00对服务器的网站目录(/var/www/html)做一次同步。

1) 创建一个zhangsan用户的密码文件/etc/server.pass,并赋予权限

未分类

未分类

2)创建计划任务,crontab -e ,并启动

00        22  *  *  *  /usr/bin/rsync  -az --delete  --password-file=/etc/server.pass  /myweb/  [email protected]::wwwroot

未分类

7、在1.20上配置rsync+inotify实时同步。通过编写脚本来实现,客户机能够实时上传文件到服务端。

1)配置/etc/sysctl.conf ,调整inotify内核参数

未分类

sysctl -p运行一下

未分类

3)安装inotify-tools

未分类

4)编写脚本vim /opt/test.sh

未分类

赋予脚本执行权限并执行

chmod +x  /opt/test.sh

未分类

5)在打开一个控制台在客户机端/myweb下创建一个文件并到服务器端/var/www/html查看是否自动同步

未分类

未分类

rsync远程同步及rsync+inotify实时同步

思维代入

正确、有效的备份方案是保障系统及数据安全的重要手段。在服务器中,通常会结合计划性任务、shell脚本来执行本地备份。但有时候为了提高备份的可靠性,异地备份也是非常有必要的。那下面就给大家介绍一种异地远程备份的方法:rsync远程备份。

rsync简介

rsync是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份、保持链接和权限,且采用优化的同步算法,在传输前执行压缩,因此非常适用于异地备份、镜像服务等应用。

rsync在同步过程中有两个部分组成:发起端、同步源。负责发起rsync同步操作的客户机称为发起端;负责响应来自客户机的rsync同步操作的服务器称为同步源。在同步过程中,同步源负责提供文档的原始位置;发起端对该位置具有读取权限。

rsync拓扑图

未分类

rsync源服务器的部署

rsync下载地址下载地址https://rsync.samba.org/download.html

CentOS7系统非常友好的默认安装了rsync服务,如果你的系统没有安装rsync服务,那么用上面的链接下载安装即可,因为我这边默认安装了rsync,直接进行修改配置文件,配置文件默认在/etc/rsyncd.conf

  • 修改配置文件
vim /etc/rsyncd.conf
 uid = nobody    
 gid = nobody
 use chroot = yes             //禁锢在源目录
 address = 172.16.10.133      //监听地址
 port 873                     //监听端口
 log file = /var/log/rsyncd.log         //日志文件位置
 pid file = /var/run/rsyncd.pid         //进程ID存放位置
 hosts allow = 172.16.10.0/24           //允许访问的客户机地址

[wwwroot]                     //共享模块的名称
 path=/var/www/html           //源目录的实际路径
 comment=www.yun.com          //注解内容,可不填写
 read only= yes               //是否为只读
 dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2    //同步时不再进行压缩的文件类型
 auth users = backuper         //授权账户
 secrets file = /etc/rsyncd_users.db     //存放账户信息的数据文件
rsync远程同步及rsync+inotify实时同步

未分类

#这边解释一下,对于rsync的同步源最好仅允许以只读方式做同步。同步时也可以采用匿名的方式,只要将上面的auth users和secrets file配置记录加#注释或者删除就可以了。

为备份账户创建数据文件

vim /etc/rsyncd_users.db
backuper:abc123 //创建账户记录,以冒号分割
chmod 600 /etc/rsyncd_users.db

这边由于账户信息采用明文存放,因此上面调整了文件权限,避免账户信息泄露。

备份用户backuper需要对源目录/var/www/html具有相应的读取权限

未分类

  • 开启rsync服务进程
rsync --daemon

未分类

关闭服务的时候,直接采用kill $(cat /var/run/rsyncd.pid) 就可以了

rsync备份工具的使用

  • rsync命令的基本用法

rsync和大多数的备份程序一样,需要指定原始位置和目标位置,命令格式:rsync 源目录位置 目标位置

rsync /etc/fatab /opt

例如这条,意义就是:备份/etc/fstab目录到/opt目录下

命令格式及常用的备份选项

-r:递归模式,包含目录及子目录中的所有文件。
-l:对于符号链接文件仍然复制为符号链接文件。
-v:显示同步过程的详细信息。
-a:归档文件,保留文件的权限、属性等信息。
-z:在传输文件时进行压缩。
-p: 保留文件的权限标记。
-t:保留文件的时间标记。
-g:保留文件的属性标记(仅超级用户使用)。
-o:保留文件的属主标记(仅超级用户使用)。
-H:保留硬连接文件。
-A:保留ACL属性信息。
-D:保留设备文件及其他特殊文件。
--delete:删除目标位置有而原始位置没有的文件。
--checksum:根据校验和(而不是文件大小、修改时间)来决定是否跳过文件。
  • 配置源的表示方法

配置源的表示方法 三种
将对方源目录的文件同步到本地的/opt目录下

格式一:

rsync -avz [email protected]::wwwroot /opt/ 
password:abc123

格式二:

rsync -avz rsync://[email protected]/wwwroot /opt/
password:abc123

格式三:免密码交互

vim /etc/server.pass
abc123
chmod 600 /etc/server.pass
rsync -az --delete --password-file=/etc/server.pass [email protected]::wwwroot /opt
  • rsync备份操作示例
rsync -avz [email protected]::wwwroot /opt/

未分类

配置部署rsync+inotify实时同步

  • 调整inotify内核参数
vim /etc/sysctl.conf
fs.inotify.max_queued_events = 16384     #监控事件队列
fs.inotify.max_user_instances = 1024     #最多监控实例
fs.inotify.max_user_watches = 1048576    #每个实例最多监控文件数

sysctl -p     //刷新使之立即生效
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
  • 安装inotify-tools

使用inotify机制需要安装inotify-tools,以便提供inotifywait和inotifywatch辅助工具程序,用来监控和汇总改动情况。

tar xf inotify-tools-3.14.tar.gz -C /opt/     //解压软件至/opt目录下
cd /opt/inotify-tools-3.14/
./configure                      //配置
make && make install          //编译安装

这里以监控网站目录/var/www/html为例,先执行inotifywait命令,然后在源服务器的终端上向/var/www/html目录下进行操作,这边发起端会监控输出结果。

inotifywait -mrp -e modify,create,move,delete /var/www/html

-e用来指定要监控的哪些事件,-m 表示持续监控,-r 表示递归整个目录, -q 简化输出信息。

未分类

  • 编写触发式同步脚本
vim /opt/inotify_rsync.sh

#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /var/www/html/"
RSYNC_CMD="rsync -vazH --delete --password-file=/etc/server.pass /var/www/html/ [email protected]::wwwroot/"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
    if [ $(pgrep rsync | wc -l) -le 5 ] ; then
        $RSYNC_CMD
    fi
done

chmod +x /opt/inotify_rsync.sh 
#添加执行权限

然后我们来看一下脚本执行的效果

未分类

未分类

未分类

未分类

未分类

至此实验结束,试验成功,rsync远程同步及rsync+inotify实时同步就成功了!!!各位看官上手试试吧!!!

Redis 与 fastjson 实现存储与读取

1、数组 list

Redis 结合 fastjson 存储

List<Home> home = new ArrayList<Home>();
String key = "redisKey";
redisUtil.set(key, JSON.toJSONString(home));

Redis 结合 fastjson 读取

String key = "redisKey";    
Object value = redisUtil.get(key);  
List<Home> home =  JSON.parseArray((String)value, Home.class);

2、HashMap

Redis 结合 fastjson 存储

Map<Integer, List<ItemsToTemplate>> itemMap = new HashMap<Integer, List<ItemsToTemplate>>();
String key = "redisKey";
redisUtil.set(key, JSON.toJSONString(itemMap));

Redis 结合 fastjson 读取

String key = "redisKey";
String value = redisUtil.getStr(key);   
Map<Integer, List<ItemsToTemplate>> itemMap = JSON.parseObject(value,new TypeReference<Map<Integer,List<ItemsToTemplate>>>(){}.getType());
B3log  Redis  Java