Redis数据库的概念
Redis是一个开源的、使用c语言编写的NosQL数据库。
Redis基于内存运行并支持持久化(支持存储在磁盘),采用key-value(键值对)的存储形式,是目前分布式架构中不可或缺的一环
Redis服务器程序默认是单进程模型
Redis服务在一台服务器上可以同时启动多个Redis进程,Redis的实际处理速度则是完全依靠于主进程的执行效率
若在服务器上只运行一个Redis进程,当多个客户端同时访问时,服务器的处理能力是会有一定程度的下降;若在同一台服务器开启多个Redis进程,Redis在提高并发处理能力的同时会给服务器的CPU造成很大压力。即:在实际生产环境中,需要根据实际的需求来决定开启多少个Redis进程。建议可以开2个进程,好处如下:
备份
抗高并发的同时尽量不给CPU造成太大的压力;
若对高并发要求更高一些,可能会考虑在同一台服务器上开启多个进程。若CPU资源比较紧张,采用单进程即可
Redis数据库的优点
具有极高的数据读写速度
数据读取的速度最高可达到110000 次/s,数据写入速度最高可达到81000 次/s
支持丰富的数据类型
支持key-value、 Strings、 Lists、Hashes ( 散列值)、Sets 及Ordered Sets等数据类型操作
string 字符串(可以为整形、浮点和字符型,统称为元素)
list 列表(实现队列,元素不唯一-,先入先出原则)
set 集合(各不相同的元素)
hash hash散列值( hash的key必须是唯一的 )
set /ordered sets 集合/有序集合
支持数据的持久化
可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
原子性
Redis所有操作都是原子性的:一起成功,一起失败
事务是一个完整的操作,事务的各元素是不可分的
事务中的所有元素必须作为一个整体提交或回滚
如果事务中的任何元素失败,则整个事务将失败
支持数据备份
即master-salve 模式的数据备份
Redis作为基于内存运行的数据库,缓存是其最常应用的场景之一
除此之外,Redis常见应用场景还包括获取最新N个数据的操作、排行榜类应用、计数器应用、存储关系、实时分析系统、日志记录
编译安装squid
安装依赖环境
[root@localhost ~]# yum -y install gcc gcc-c++ make
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
软件包 gcc-4.8.5-44.el7.x86_64 已安装并且是最新版本
软件包 gcc-c++-4.8.5-44.el7.x86_64 已安装并且是最新版本
软件包 1:make-3.82-24.el7.x86_64 已安装并且是最新版本
无须任何处理
解压软件包
[root@localhost opt]# tar xf squid-3.5.27.tar.gz
[root@localhost opt]# ls
rh squid-3.5.27 squid-3.5.27.tar.gz
编译安装
[root@localhost squid-3.5.27]# ./configure --prefix=/usr/local/squid //安装目录
--sysconfdir=/etc/ //单独将配置文件修改到/etc目录下
--enable-arp-acl //可在ACL中设置通过MAC地址进行管理,防止IP欺骗
--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 //使用GNU正则表达式
[root@localhost squid-3.5.27]# make && make install
优化squid管理
[root@localhost squid-3.5.27]# ln -s /usr/local/squid/sbin/* /usr/local/sbin //创建链接文件,优化路径
[root@localhost squid-3.5.27]# useradd -M -s /sbin/nologin squid //创建程序用户
[root@localhost squid-3.5.27]# chown -R squid:squid /usr/local/squid/var/ //改变目录属主
[root@localhost squid-3.5.27]# ll /usr/local/squid/var/ //查看目录属主
总用量 0
drwxr-xr-x 3 squid squid 19 7月 28 15:53 cache
drwxr-xr-x 2 squid squid 6 7月 28 15:53 logs
drwxr-xr-x 3 squid squid 19 7月 28 15:53 run
编写squid服务脚本
[root@localhost squid-3.5.27]# cat /etc/init.d/squid
#!/bin/bash
#chkconfig: 35 90 25
#config: /etc/squid.conf
#pidfile: /usr/local/squid/var/run/squid.pid
#Description: Squid - Internet Object Cache
PID="/usr/local/squid/var/run/squid.pid"
CONF="/etc/squid.conf"
CMD="/usr/local/squid/sbin/squid"
case "$1" in
start)
netstat -utpln | grep squid &>/dev/null
if [ $? -eq 0 ]
then
echo "Squid is running"
else
$CMD
fi
;;
stop)
$CMD -k kill &>/dev/null
rm -rf $PID &>/dev/null
;;
status)
[ -f $PID ] &>/dev/null
if [ $? -eq 0 ]
then
netstat -utpln | 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 "用法:{start | stop | restart |
[root@localhost squid-3.5.27]# chmod +x /etc/init.d/squid //赋予执行权限
[root@localhost squid-3.5.27]# chkconfig --add squid //加入系统服务
[root@localhost squid-3.5.27]# chkconfig squid on //指定squid在各等级为on
[root@localhost squid-3.5.27]# systemctl status squid //查看服务状态
● squid.service - SYSV: Squid - Internet Object Cache
Loaded: loaded (/etc/rc.d/init.d/squid; bad; vendor preset: disabled)
Active: inactive (dead)
Docs: man:systemd-sysv-generator(8)
搭建传统代理
环境
squid 192.168.30.7
web 192.168.30.8
client 192.168.30.200
更新squid配置文件
修改防火墙规则
[root@localhost ~]# iptables -F //清空规则
[root@localhost ~]# systemctl restart firewalld.service //重启防火墙
[root@localhost ~]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT //允许来自tcp3128的流量进入
启动squid服务
[root@localhost ~]# systemctl restart squid
[root@localhost ~]# netstat -antp | grep squid
tcp6 0 0 ::
配置web服务器
[root@localhost ~]# yum -y install httpd
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
软件包 httpd-2.4.6-97.el7.centos.x86_64 已安装并且是最新版本
无须任何处理
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# netstat -antp | grep 80
tcp6 0 0 :::80 :::* LISTEN 76232/httpd
测试
搭建透明代理
环境
squid 192.168.30.7 192.168.10.7
web 192.168.30.8
client 192.168.10.10
开启squid服务器路由转发
[root@localhost ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
更新配置文件
添加防火墙规则,
将来源为10网段:80/443端口的流量重定向到3128端口
[root@localhost ~]# iptables -t nat -I PREROUTING -i ens37 -s 192.168.10.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
[root@localhost ~]# iptables -t nat -I PREROUTING -i ens37 -s 192.168.10.0/24 -p tcp --dport 443 -j REDIRECT --to 3128
[root@localhost ~]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
启动squid服务
[root@localhost ~]# systemctl restart squid
[root@localhost ~]# netstat -antp |grep squid
tcp 0 0 192.168.10.7:3128 0.0.0.0:* LISTEN 19994/(squid-1)
测试
ACL控制访问
在配置文件/etc/squid.conf 中,ACL访问控制通过以下两个步骤来实现:
① 使用acl 配置项定义需要控制的条件;
② 通过http_access配置项对已定义的列表做“允许”或“拒绝”访问的控制。
格式:
acl 列表名称 列表类型 列表内容
列表名称:名称自定义,相当于给acl起个名字(也会被http_access 调用)
列表类型:必须使用squid预定义的值,对应不同类别的控制条件
列表内容:是要控制的具体对象,不同类型的列表所对应的内容也不一样,可以有多个值(以空格为分隔,为“或”的关系)
Squid 日志分析
安装图像处理软件
[root@localhost ~]# yum install -y gd gd-devel pcre-devel
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
软件包 gd-2.0.35-27.el7_9.x86_64 已安装并且是最新版本
软件包 gd-devel-2.0.35-27.el7_9.x86_64 已安装并且是最新版本
软件包 pcre-devel-8.32-17.el7.x86_64 已安装并且是最新版本
无须任何处理
安装squid日志分析工具
[root@localhost ~]# mkdir /usr/local/sarg //创建工作目录
[root@localhost ~]# cd /opt
[root@localhost opt]# rz -E
rz waiting to receive.
[root@localhost opt]# tar xf sarg-2.3.7.tar.gz
[root@localhost opt]# cd sarg-2.3.7/
[root@localhost sarg-2.3.7]# ./configure --prefix=/usr/local/sarg
--sysconfdir=/etc/sarg \ #配置文件目录,默认是/usr/loca/etc
--eenable-xtraprotection #额外安全防护
更新配置文件
--7行--取消注释
access_log /usr/local/squid/var/logs/access.log #指定访问日志文件
--25行--取消注释
title "Squid User Access Reports" #网页标题
--120行--取消注释,修改
output_dir /var/www/html/sarg #报告输出目录
--178行--取消注释
user_ip no #使用用户名显示
--184行--取消注释,修改
topuser_sort_field connect reverse #top排序中,指定连接次数采用降序排列,升序是normal
--190行--取消注释,修改
user_sort_field connect reverse #对于用户访问记录,连接次数按降序排序
--206行--取消注释,修改
exclude_hosts /usr/local/sarg/noreport #指定不计入排序的站点列表的文件
--257行--取消注释
overwrite_report no #同名同日期的日志是否覆盖
--289行--取消注释,修改
mail_utility mailq.postfix #发送邮件报告命令
--434行--取消注释,修改
charset UTF-8 #指定字符集UTF-8
--518行--取消注释
weekdays 0-6 #top排行的星期周期
--525行--取消注释
hours 0-23 #top排行的时间周期
--633行--取消注释
www_document_root /var/www/html #指定网页根目录
启动
[root@localhost sarg-2.3.7]# touch /usr/local/sarg/noreport
[root@localhost sarg-2.3.7]# ln -s /usr/local/sarg/bin/sarg /usr/local/bin/
[root@localhost sarg-2.3.7]# sarg
SARG: 纪录在文件: 8, reading: 100.00%
SARG: 成功的生成报告在 /var/www/html/squid-reports/2021Jul28-2021Jul28
安装httpd
[root@localhost ~]# yum -y install httpd
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
软件包 httpd-2.4.6-97.el7.centos.x86_64 已安装并且是最新版本
无须任何处理
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# netstat -antp | grep 80
tcp6 0 0 :::80 :::* LISTEN 76232/httpd
测试
小结
squid 有三种模式:
传统代理(需要指向squid)
需要客户端指向squid 代理服务器,客户端能感知到squid 代理服务器的存在
透明代理(常用,不需要指向squid)
客户端不需要配置,只要直接访问即可,服务端,借助了防火墙规则及静态路由的方式,完成透明代理
反向代理(需要指向squid)
做为类似与Nginx服务器的反向代理功能,但自身不需要一个首页,基于虚拟的IP:端口、以及虚拟的域名进行反向代理给后端真实服务器的IP:端口,并且以权重的方式完成反向代理(负载均衡)
Squid 自身的管理/功能
ACL:主要做的是http_access(基于http协议,access访问)的允许和拒绝管理
sarg:日志分析功能,可以以天的方式指定将access_log中的内容输出到一个web页面中(借助了httpd)展示出来。