linux运维架构篇
集群规划说明
集群架构概念图示
集群案例规划
集群主机规划表
关于主机规划注意事项:
- 灰色IP地址属于临时使用,企业场景一般没有。
- 负载均衡器的 VIP10.0.0.3/24
- 带外网IP的服务器的内网IP不配置网关和dns
- 外部IP该配啥配啥
host解析(/etc/hosts 针对内网地址和主机名)
备份服务器(10.195.236.142)
Rsync服务:具有可视本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似ssh带有的scp命令,但是优于scp命令,scp只能全量拷贝,rsync可以增量拷贝。
rsync 具有如下的基本特性:
- 可以镜像保存整个目录树和文件系统
- 可以很容易做到保持原来文件的权限、时间、软硬链接等
- 无须特殊权限即可安装
- 优化的流程,文件传输效率高
- 可以使用 rsh、ssh 方式来传输文件,当然也可以通过直接的 socket 连接(服务端和客户端)。
- 支持匿名传输,以方便进行网站镜象
rsync企业两个应用场景
cron+rsync和inotify+rsync
rsync工作方式
1)本地使用:
rsync [OPTION...] SRC... [DEST]
2)通过远程 Shell 使用:
拉: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
推: rsync [OPTION...] SRC... [USER@]HOST:DEST
3)以守护进程(socket)方式传输数据(重点):
拉: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
推: rsync [OPTION...] SRC... [USER@]HOST::DEST
拉: rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
推: rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
其中:
- SRC: 是要复制的源位置
- DEST: 是复制目标位置
- 若本地登录用户与远程主机上的用户一致,可以省略 USER@
- 使用远程 shell 同步时,主机名与资源之间使用单个冒号“:”作为分隔符
- 使用 rsync 服务器同步时,主机名与资源之间使用两个冒号“::”作为分隔符
- 当访问 rsync 服务器时也可以使用 rsync:// URL
- “拉”复制是指从远程主机复制文件到本地主机
- “推”复制是指从本地主机复制文件到远程主机
- 当进行“拉”复制时,若指定一个 SRC 且省略 DEST,则只列出资源而不进行复制
- 若使用普通用户身份运行 rsync 命令,同步后的文件的属主将改变为这个普通用户身份。
- 若使用超级用户身份运行 rsync 命令,同步后的文件的属主将保持原来的用户身份。
- /home : 表示将整个 /home 目录复制到目标目录
- /home/ : 表示将 /home 目录中的所有内容复制到目标目录
参数总结:
-a, ––archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等价于 -rlptgoD (注意不包括 -H)
-z, ––compress 在传输文件时进行压缩处理
--ignore-existing 忽略那些已经存在于接收端的文件,仅备份那些新创建的文件
--bwlimit=RATE limit socket i/o bandwidth
--password-file = /etc/rsync.password #指定连接模块的密码文件
搭建backup服务器之rsyncdaemon服务模式-服务端配置过程
1、确保服务安装rsync服务 yum install -y rsync
2、vim /etc/rsyncd.conf #创建编写配置文件(启动rsync -daemon模式必须),一般没有此文件
#rsync_config created by dsh 20181220 # uid = rsync #该选项指定当该模块传输文件时守护进程应该具有的uid gid = rsync use chroot = no #安全相关配置 max connections = 200 #最大连接数 timeout = 300 #超时时间 pid file = /var/run/rsyncd.pid #进程对应的进程号文件 lock file = /var/run/rsyncd.lock #锁文件 log file = /var/log/rsyncd.log # 日志文件 [backup] #模块名称 path = /backup # 服务器提供的访问目录 ignore errors #忽略错误 read only = false #可写 list =false #不能列表
hosts allow = 10.195.236.0/24 #
#hosts deny = 0.0.0.0/32 #拒绝,和allow同时使用时,会有异常,建议单独使用一个。
auth users = rsync_backup #该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果"auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的challenge/response认证协议。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)。
secrets file = /etc/rsync.password #该选项指定一个包含定义用户名:密码对的文件。只有在"auth users"被定义时,该文件才有作用。文件每行包含一个username:passwd对。一般来说密码最好不要超过8个字符。没有默认的secures file名,需要限式指定一个(例如:/etc/rsyncd.passwd)。注意:该文件的权限一定要是600,否则客户端将不能连接服务器
3、创建用户
useradd rsync -s /sbin/nologin -M
4、创建 并 修改备份路径的属主属组
mkdir /backup -p
chown -R rsync.rsync /backup/
5、根据rsyncd.conf的auth users 创建虚拟账号的密码文件
echo 'rsync_backup:oldboy' >/etc/rsync.password
6、修改密码文件的权限为600
chmod 600 /etc/rsync.password
7、启动服务
rsync --daemon
8、加入开机自启动
echo "/usr/bin/rsync --daemon" >> /etc/rc.local
搭建backup服务器之rsyncdaemon服务模式-客户端配置
1、生成连接服务器的密码文件 ,注意,此时只保存密码,无需账号。
echo "oldboy" >/etc/rsync.password
2、为密码文件配置权限600,此时客户端配置完成。
chmod 600 /etc/rsync.password
3、同步文件(daemon模式下,只在客户端执行命令)
推送:
rsync -az /tmp/ rsync://rsync_backup@10.195.236.142/backup/ --password-file=/etc/rsync.password
拉取:
rsync -az /tmp/ rsync://rsync_backup@10.195.236.142/backup/ /tmp/ --password-file=/etc/rsync.password
注意:上述/backup/表示服务端配置文件中的模块名称。
搭建backup服务器之rsyncdaemon服务模式-开发启动/停止脚本
1、创建服务文件
vim /etc/init.d/rsyncd,键入以下脚本后保存。
#!/bin/sh
#rsync 启动、停止、重启脚本 #source function library . /etc/rc.d/init.d/functions start(){ rsync --daemon if [ $? -eq 0 -a `ps -ef | grep -v grep| grep rsync |wc -l ` -gt 0];then action "Starting Rsync:" /bin/true sleep 1 else action "Starting Rsync:" /bin/false sleep 1 fi } stop(){ pkill rsync;sleep 1;pkill rsync if [`ps -ef | grep -v grep | grep "rsync --daemon"| wc -l` -lt 1];then action "Stopting Rsync:`ps -ef | grep -v grep | grep rsync | wc -l`" /bin/true sleep else action "Stopting Rsync:`ps -ef | grep -v grep | grep "rsync --daemon"| wc -l`" /bin/false sleep 1 fi } case "$1" in start) start; ;; stop) stop; ;; restart|reload) $0 stop; $0 start; ;; *) echo $"Usage:$0 {start|stop|restart|reload}" ;; esac
2、chmod 700 /etc/init.d/rsyncd
3、chkconfig rsyncd on
搭建backup服务器之rsyncdaemon服务模式-客户端推送排除
排除单个文件推送:
rsync -avz -exclude=a /data/ rsync_backup@10.195.236.142::backup --password-file=/etc/rsync.password
排除多个文件推送:
rsync -avz -exclude={a,d} /data/ rsync_backup@10.195.236.142::backup --password-file=/etc/rsync.password
rsync -avz -exclude={a..d} /data/ rsync_backup@10.195.236.142::backup --password-file=/etc/rsync.password
rsync优缺点
优点:
1、增量备份,支持socket(daemon),daemon模式需要传输加密需要利用vpn服务或ipsec服务
缺点:
1、大量小文件时候,在同步时,比对时间较长,可能会造成rsync进程意外停止
2、同步大文件,10G这样的大文件有时候也会异常中断,未完整同步之前,是以隐藏文件方式存在,可以通过续传等参数实现传输。
企业级备份案例1:周期性定时备份web服务器站点目录
要求:
- web服务器a和备份服务器b的备份目录必须都为/backup
- web服务器站点目录假定为/var/www/html
- web服务器本地仅保留七天内备份,并且每天备份当天数据到backup服务器
- 备份服务器上检查备份结果是否正常,并在每天06点将备份结果发送给管理员信箱
- 备份服务器上每周六的数据都保留,其他备份仅保留180天。
思路:
每晚凌晨01点在web服务器按日期打包需要备份的网站目录,并通过rsync推送到备份服务器上做备份。每天06点backup服务器校验发送邮件。
解决方案:
1、配置web服务器为rsync客户端,备份服务器为rsync服务端。
2、web服务器端进行手动推送验证
3、开发脚本实现客户端的打包、备份、推送、校验、删除。
#!/bin/bash export PATH=/sbin:/bin:/usr/bin:/usr/sbin IP=$(ifconfig | awk -F "[ :]+" 'NR==2{print $4}') HostName=$(uname -n) BakPath=/backup mkdir $BakPath/$HostName_$IP -p
if [$(date +%w) -eq 7]:then #if [ "$(date +%w)" -eq "4" ]; then
date="$(date +%F -d "-1day")_week6"
else
date="$(date +%F -d "-1day")"
fi cd / &&\ tar -czfh $BakPath/$HostName_$IP/webdata_${date}.tar.gz var/spool/www &&\ tar -czf $BakPath/$HostName_$IP/webaccess_log_${date}.tar.gz var/log/httpd &&\ find $BakPath/$HostName_$IP/ -type f -mtime -1 -name "*.tar.gz"|xargs md5sum > $BakPath/$HostName_$IP/md5_flag_${date} #给所生成的压缩包文件生成md5校验码并存到flag文件中。 rsync -az $BakPath/ rsync_backup@10.195.236.142::backup --password-file=/etc/rsync.password #推送到备份服务器 find $BakPath -type f -mtime +7 -exec rm -f {} \ #删除七天以前文件
4、web服务器端配置定时任务每天00执行
5、backup服务器开发脚本实现校验、删除、邮件通知
开发脚本实现校验删除动作
#!/bin/bash export LANG=en find /backup/ -name "flag_$(date +%F -d "-1day")*" |xargs md5sum -c &>/tmp/mail_$(date +%F -d "-1day").log if [$(date +%w) -eq 7]:then date="$(date +%F -d "-1day")_week6" else date="$(date +%F -d "-1day")" fi find /backup/ -type f -name "*.tag.gz" -a ! -name "*week6*" -mtime +180 -exec rm -f {} \ mail -s "backup check results `date +%F" "%X`" 1246436536@qq.com date +%F -d "-1day").log \cp /tmp/mail_$(date +%F -d "-1day").log{,.ori} echo "default mail md5 flag error" >/tmp/mail_$(date +%F -d "-1day").log
利用mail工具使用第三方邮件服务器发送邮件,前提需要在/etc/mail.rc文件中添加第三方邮件邮件服务商的账号的相关信息.
set from=dsh_hello@163.com smtp=smtp.163.com smtp-auth-user=dsh1246436536 smtp-auth-password=abc123456 smtp-auth=login
echo "测试邮件内容" | mail -s "-s指定邮件主题" 1246436536@qq.com
mailq #可列出待寄邮件的清单
6、backup服务器配置定时任务每天05点执行
inotify+rsync实现实时备份
1、inotify介绍:它是一个内核用于通知用户空间程序文件系统变化的机制
2、inotify 实施准备
大前提rsync daemon 服务配置成功,可以再rsync客户端推送拉取数据,然后才能配置inotify服务。
3、安装
uname -r #确认linux内核是否为2.3.13以上
ls /proc/sys/fs/inotify/ # 在/proc/sys/fs/inotify目录下有三个文件:max_user_watches:设置inotifywait或inotifywatch命令可以监视的文件数量(单进程);max_user_instances:设置每个用户可以运行的inotifywait或inotifywatch命令的进程数。;max_queued_events:设置inotify实例事件(event)队列可容纳的事件数量。
yum -y install inotify-tools #一共安装了2个工具,即inotifywait和inotifywatch。inotifywait:在被监控的文件或目录上等待特定文件系统事件(open,close,delete等)发生,执行后处于阻塞状态,适合shell脚本中使用。inotifywatch:收集被监视的文件系统使用度统计数据,指文件系统事件发生的次数统计
4、inotifywait 命令常用参数介绍
-m ,--monitor 始终保持事件的监听状态 -r ,--recursive 递归查询目录 -q,--quiet 仅打印监控事件的信息 --timefmt 指定时间输出格式 --format 指定输出监控信息格式 -e 通过此参数指定需要监控的事件,有以下几种常用事件类型: create 文件或目录被创建 close_write 文件被创建或修改 delete 文件被删除inotifywait常用参数
5、实现在nfs客户端对nfs自定文件目录事件(增删改)的实时监控
/usr/local/inotify/bin/inotifywait -mrq --format 'w%f%' -e close_wait,delete /backup
6、当监控到nfs目录文件系统事件后,触发rsync推送变化的文件
#!/bin/bash backup_Server=172.16.1.41 /usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete /data | while read line do cd /data rsync -az ./ --delete rsync_backup@$backup_Server::nfsbackup --password-file=/etc/rsync.password done
提示:
- 上边那个脚本效率很低,效率低的原因在于只要目录出现变化就都会导致我整个目录下所有东西都被推送一遍。因此,我们可以做如下改动提高效率
#!/bin/bash Path=/data backup_Server=172.16.1.41 /usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete /data | while read line do if [ -f $line ];then rsync -az $line --delete rsync_backup@$backup_Server::nfsbackup --password-file=/etc/rsync.password else cd $Path &&\ rsync -az ./ --delete rsync_backup@$backup_Server::nfsbackup --password-file=/etc/rsync.password fi done
脚本可以加入开机启动:
echo "/bin/sh /server/scripts/inotify.sh &" >> /etc/rc.local #提示:一个& 代表从后台开始运行该条命令。
7、优化
使用echo命令修改/proc/sys/fs/inotify目录下的三个文件
echo "50000000" > /proc/sys/fs/inotify/max_user_watches echo "326790" > /proc/sys/fs/inotify/max_queued_events sysctl -p
8、inotify优缺点
优点:
简单易用,监控文件系统事件变化,通过同步工具rsync实时同步数据
缺点:
并发如果大于200个文件(10-100k),同步会有延时
9、高并发数据实时同步方案小结
1)inotify(sersync)+ rsync,是文件级别的。
2)drbd文件系统级别,文件系统级别,基于block块同步,缺点:备节点数据不可用
3)第三方软件的同步功能:mysql同步(主从复制),oracle,mongodb
4)程序双写,直接写两台服务器。
5)利用产品业务逻辑解决(读写分离,备份读不到,读主)
6)NFS集群(1,4,5方案整合)(双写主存储,备存储用inotify(sersync)+rsync)如下所示(读写分离方案)
sersync实现实时备份
特点:
支持配置文件管理
真正的守护进程socket
可以对失败文件定时重传(定时任务功能)
第三方的http接口(例如更新cdn缓存)
默认多线程rsync同步
1、实现rsync推送到backup服务器
2、安装sersync工具
sersync下载地址:https://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz,上传sersync2.5.4_64bit_binary_stable_final.tar.gz到/usr/local/src目录下
#cd /usr/local/src
#tar zxvfsersync2.5.4_64bit_binary_stable_final.tar.gz #解压
#mv GNU-Linux-x86 /usr/local/sersync #移动目录到/usr/local/sersync
3、配置sersync
#cd /usr/local/sersync #进入sersync安装目录
#cp confxml.xml confxml.xml-bak #备份原文件
vim confxml.xml
localpath watch="/home/Sync":#源服务器同步目录
name="Sync": #目标服务器rsync同步目录模块名称
users="Sync": #目标服务器rsync同步用户名
passwordfile="/etc/passwd.pass": #目标服务器rsync同步用户的密码在源服务器的存放路径
remote ip="192.168.0.50": #目标服务器ip,每行一个
failLogpath="/tmp/rsync_fail_log.sh" #脚本运行失败日志记录
start="true" #设置为true,每隔600分钟执行一次全盘同步
vim sersync/confxml.xml 修改24--28行 24"/opt/tongbu"> 25 修改后的内容为: 24"127.0.0.1" name="tongbu1"/> 26 27 28 "/data/www"> 25 修改29--35行,认证部分(rsync密码认证) 29"10.1.20.109" name="www"/> 26 30 修改后的内容如下: 27"-artuz"/> 31 "false" users="root" passwordfile="/etc/rsync.pas"/> 32 "false" port="874"/> 33 "false" time="100"/> 34 <ssh start="false"/> 35 28 "-artuz"/> 29 "true" users="rsync_backup" passwordfile="/etc/rsync.password"/> 30 "false" port="874"/> 31 "true" time="100"/> 32 <ssh start="false"/> 33
4、开启sersync守护进程同步数据
/usr/local/sersync/sersync2 -d -r -n 10 -o /usr/local/sersync/confxml.xml #开启datemon模式
echo "/usr/local/sersync/sersync2 -d -r -n 10 -o /usr/local/sersync/confxml.xml &" >> /etc/rc.local #加入开机自启动
5、inotify sersync总结
为什么要用Rsync+sersync架构?
1)、sersync是基于Inotify开发的,类似于Inotify-tools的工具
2)、sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字,然后使用rsync同步的时候,只同步发生变化的这个文件或者这个目录。
Rsync+Inotify-tools与Rsync+sersync这两种架构有什么区别?
1)、Rsync+Inotify-tools
(1):Inotify-tools只能记录下被监听的目录发生了变化(包括增加、删除、修改),并没有把具体是哪个文件或者哪个目录发生了变化记录下来;
(2):rsync在同步的时候,并不知道具体是哪个文件或者哪个目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此,效率很低。
2)、Rsync+sersync
(1):sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或某一个目录的名字;
(2):rsync在同步的时候,只同步发生变化的这个文件或者这个目录(每次发生变化的数据相对整个同步目录数据来说是很小的,rsync在遍历查找比对文件时,速度很快),因此,效率很高。
小结:当同步的目录数据量不大时,建议使用Rsync+Inotify-tools;当数据量很大(几百G甚至1T以上)、文件很多时,建议使用Rsync+sersync。
NFS共享存储服务器(10.195.236.142)
必备知识点:
多个nfs客户端同时读写文件,需要有以下几个权限注意:
- nfs服务器/etc/exports配置文件中的(rw)读写共享权限是否正确
- nfs服务器实际要共享的NFS目录权限是否具有w权限,及服务器本地目录的安全权限
- 每台机器都对应存在和nfs默认配置UID相同的UID65534的nfsnobody用户(确保所有客户端的访问权限统一(使用all_squash参数),否则每个机器需要同时建立相同uid用户,并覆盖nfs的默认用户配置)
同时满足以上三个条件,即可实现多客户端同时对共享目录文件有读写权限。
重要文件
/etc/exports #nfs服务的主配置文件,配置nfs具体共享服务的目录地址。
/usr/sbin/showmount #常在客户端执行,用以查看nfs配置及挂载结果。
/proc/mounts #客户端挂载参数。用于客户端查看挂载情况,比df 命令更加高效快捷,常用于监控挂载。
服务端启动顺序
/etc/init.d/rpcbind start
/etc/init.d/nfs start
exports语法格式
NFS共享目录 NFS客户端地址(参数1,参数2......)
- NFS共享目录:为nfs服务端要共享的实际目录,要用绝对路径,注意要共享目录的本地权限。如果需要读写共享,务必要让此共享目录可以被nfs客户端的用户(nfsnobody)读写。
- nfs客户单地址:可以为单个主机地址,也可以为一个网段,还可以用* 来匹配素有客户端服务器。这里所谓的客户端一般来说就是前端的业务服务器。例如web服务。
- 参数介绍:
rw 读写 ; ro 只读 ; sync 数据直接写入磁盘,安全性高 ; async 数据会先写入缓冲区,效率高;
all_squash 所有客户端登入nfs主机访问共享目录,统一映射为nobody用户权限,以便所有文件共享。
anonuid 指定客户端登陆访问用户的UID
anongid 指定客户端登陆访问用户的UID
nfs优化:
- 硬件:sas/ssd磁盘,多块,raid5/raid10。网卡至少千兆(多块bond)
- 服务器端配置 /data 10.195.236.135(rw,sync,all_squash,anonuid=65534,anongid=65534)
- nfs客户端mount 挂载企业优化命令参数:
mount -t nfs -o noatime,nodiratime,nosuid,noexec,nodev, rsize=131072,wsize=131072 10.195.236.140:/data
- nfs内核优化
服务器端(增大缓存大小):
cat >>/etc/sysctl.conf<
net.core.wmen_default = 8388608
net.core.rmen_default = 8388608
net.core.wmen_max = 16777216
net.core.rmen_max = 16777216
eof
sysctl -p
- 大型网站nfs采用分布式系统,常见有GlusterFS、FastDFS.
nfs优缺点:
优点:服务稳定,简单高效
局限:
存在单点故障,可以通过负责均衡及高可用方案弥补。
高并发场合效率低,性能受限(指的是日并发超过2千万的日PV量)
多个客户端挂载同一个nfs 服务器时,连接管理维护麻烦。
企业应用场景:使用nfs搭建web服务集群的共享存储。
nfs服务端配置
1、nfs软件安装:yum -y install nfs-utils rpcbind
- nfs-utils:nfs服务主程序包,包括rpc.nfsd、rpc.mountd这两个daemon
- rpcbind:centos6下面RPC的主程序。nfs可以视为一个rpc程序,再启动任何一个rpc之前。
2、启动PRC服务:
/etc/init.d/rpcbind start
rpcinfo -p localhost #查看rpc中是否有nfs资源
3、启动nfs服务:
/etc/init.d/nfs start
- chkconfig rpcbind on
- chkconfig nfs on
4、配置nfs服务端配置文件
默认路径:/etc/exports ,并且默认为空,vim /etc/exports
/data 10.195.236.135(rw,sync,all_squash)
5、给共享目录授权
chown -R nfsnobody.nfsnobody /data
6、showmount -e 服务端IP #查看配置文件的路径有没有生效
nfs客户端配置
1、安装启动rpcbind
/etc/init.d/rpcbind start
2、挂载
mount -t nfs 10.195.236.142:/data /mnt #如果挂载失败尝试安装nfs-utis,然后使用showmount -e 10.195.236.142测试是否有显示远程服务端共享路径
3、开机自动挂载
echo "mount -t nfs 10.195.236.142:/data /mnt" >>/etc/rc.local #设置开机挂载,不能放到fstab中,因为是网络挂载,网卡启动比fstab慢。
ssh批量管理 服务
/etc/init.d/sshd
/etc/ssh/sshd_config
ssh 企业安全优化
1、vim /etc/ssh/sshd_config
Port 2211
ListenAddresss 10.195.236.41 #多网卡情况下,修改监听地址为单一内网地址
PermitRootLogin no #不允许root登陆,实际使用中,使用su从其他用户切换
PermitEmptyPasswords no #禁止空密码登陆
CSSAPIAuthentication no # 优化ssh连接登陆响应时间。
UseDNS no ## 优化ssh连接登陆响应时间。
2、使用密钥登陆,不使用密码登陆
ssh批量分发管理部署步骤(使用管理机进行批量分发管理)
1、创建用户及密码(管理机和后台服务器集群都需要)
#创建管理用户,让此用户使用密钥对进行远程管理,无需口令密码。 useradd oldgirl echo 123456 |passwd --stdin oldgirl su - oldgirl #目标服务器上配置sudoers,给oldgirl管理用户提权(rsync命令)否则系统权限目录无法进行文件推送: echo "oldgirl ALL= NOPASSWD: /usr/bin/rsync" >>/etc/sudoers visudo -c
2、管理机上创建密钥对
交互式:ssh-keygen -t dsa #直接回车三次
[root@zqq-study dsh]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
[root@zqq-study dsh]# ls /root/.ssh/
id_dsa id_dsa.pub #创建密钥后,会在/root/.ssh目录下生成锁和钥匙
非交互式:ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
3、从管理机上分发密钥(锁)到各个服务器
cd ~
ssh-copy-id -i .ssh/id_dsa.pub oldgirl@172.16.1.8 #使用默认端口
ssh-copy-id -i .ssh/id_dsa.pub " -p 2211 oldgirl@172.16.1.6" #指定自定义端口时,使用双引号
非交互式:sshpass -p '123456' ssh-copy-id -i .ssh/id_rsa.pub -p 2211 oldgirl@10.195.236.142
4、测试
ssh -p2211 oldboygirl@172.16.1.8 /sbin/ifconfig eth0
成功标志:连接目标服务器,不适用密码可以直接操作。
5、批量分发文件,脚本优化
#批量分发脚本,服务器固定,源文件、目的路径作为参数 #!/bin/bash if [$# -ne 2]:then echo " USAGE:/bin/sh $0 Sourcefile Destfile" exit 1 fi source /etc/init.d/functions for key in 8 9 12 14 15 18 21 45 67 do scp -P2211 ~/$1 oldgirl@172.16.1.${key}:~ >/dev/null 2>&1&&\ ssh -p2211 oldgirl@172.16.1.$key sudo rsync ~/$1 $2 >dev/null 2>&1 #执行远程sudo 使用-t参数开终端执行。 if [$? -eq 0]:then action "FenFa host 172.16.1.$key" /bin/true else action "FenFa host 172.16.1.$key" /bin/fslse fi done
#批量分发脚本,指定单个服务器、源文件、目的路径作为参数 #!/bin/bash if [$# -ne 3]:then echo " USAGE:/bin/sh $0 Sourcefile Destfile IPADDR" exit 1 fi source /etc/init.d/functions scp -P2211 ~/$1 oldgirl@$3:~ >/dev/null 2>&1&&\ ssh -p2211 oldgirl@$3 sudo rsync ~/$1 $2 >dev/null 2>&1 if [$? -eq 0]:then action "FenFa host $3" /bin/true else action "FenFa host $3" /bin/fslse fi done
#批量分发脚本,依次指定源文件、目的路径、IP地址若干作为参数 #!/bin/bash if [$# -le 3]:then echo " USAGE:/bin/sh $0 Sourcefile Destfile IPADR......" exit 1 fi source /etc/init.d/functions shift 2 #移动变量,表示移除前几个变量 for key in $@ do scp -P2211 ~/$1 oldgirl@172.16.1.${key}:~ >/dev/null 2>&1&&\ ssh -p2211 oldgirl@172.16.1.$key sudo rsync ~/$1 $2 >dev/null 2>&1 if [$? -eq 0]:then action "FenFa host 172.16.1.$key" /bin/true else action "FenFa host 172.16.1.$key" /bin/fslse fi done
6、批量分发中权限问题解决方法(例:批量分发hosts文件覆盖到目标服务器/etc/hosts,本方案使用(2))
1)直接使用root用户执行,批量分发管理绝大多数企业选用root(条件是允许root用户登录,但是我们实际环境中已经做了root禁止登录的优化)
2)sudo提权实现没有权限用户使用rsync拷贝
#目标服务器上配置sudoers,给oldgirl用户提权: echo "oldgirl ALL= NOPASSWD: /usr/bin/rsync" >>/etc/sudoers visudo -c #迂回方案:先拷贝hosts文件到各自家目录下 scp -P2211 hosts oldgirl@172.16.1.8:~ #使用rsync管道模式拷贝更好(增量、加密) -az hosts -e 'ssh -p2211' oldgirl@172.16.1.8:~ #然后使用远程sudo,rsync 拷贝hosts文件覆盖到/etc/hosts ssh -p2211 -t oldgirl@172.16.1.8 sudo rsync ~/hosts /etc/hsots #-t允许执行远程sudo命令
WEB服务
http请求响应流程
URL 是URI命名机制的一个子集。
网页分类
1、静态网页
静态网页资源常见扩展名为:
- 纯文本类程序或文件:htm、html、xml、js、css
- 图片类或数据文档:jpg、gif、png、doc、ppt等
- 视频流媒体类文件:MP4、swf、avi、wmv等
静态网页特征
- 每个页面都有一个固定的URL地址,且URL一般以htm、html等常见形式为后缀,而且地址中不含有?或&等特殊符号
- 网页内容已经发布到网站服务器上,无论是否有用户访问,每个页面的内容都是保存在王章服务器的文件系统上的,也就是说,静态网页是实实在在保存在服务器上的文件,每个网页都是一个独立的文件。
- 网页内容是固定不变的,因此,容易被搜索引擎收录(容易被用户找到)(优点)
- 网页没有数据库的支持,在网站制作和维护方面的工作量比较大,因此当网站信息量很大的时候,完全依靠静态网页制作的方式比较困难。(缺点)
- 网页的交互性较差,在程序功能实现方面局限性。(缺点)
- 网页程序在用户浏览器端解析,如:IE浏览器,程序解析效率很高,由于服务端不进行解析,并且不需要读取数据库,因此服务器端可以接受更多的并发访问。当客户端向服务器请求数据时,服务器直接把数据从磁盘上返回(不做任何解析),待客户端拿到数据后,在浏览器端解析并展示出来,服务端不解析,所以并发性能更高。(优点)
2、动态网页
形式特点:
- 通常以asp、aspx、php、js、do、cgi等形式为后缀
- 一般网址中会有标志性符号?&
- 网页一般以数据库技术为基础,大大降低了网站维护的工作量。
- 采用动态网页技术的网站可以实现很多交互功能,比如:用户注册、登陆、在线调查、投票、用户管理、订单管理、发博文等
- 动态网页并不是独立存在于服务器上的网页文件,当用户请求服务器上的动态程序时,服务器解析这些程序并读取数据库然后返回一个完整的网页内容。服务器端解析。
- 动态网页中的?&在搜索引擎的收录方面存在一定的问题,一般搜索引擎不会去抓取网址中?后面的内容,因此在企业通过搜索引擎进行推广时,需要针对动态网页的网站做一定的技术处理(伪静态技术),以便适应搜索引擎抓取需求
- 有关动态网页的架构思想:一般来说静态网页性能是动态网页的10-30倍,在高并发的场景中,应尽可能的把动态网页转换成静态网页提供服务。动态转静态,几乎是所有高并发网站必备架构方案思路,也是架构师的职责所在。
3、伪静态网页(rewrite技术实现,跟业务需求挂钩,一般由开发实现,运维发布更新)
缺点:伪静态网页不会提高性能,反而会一定程度降低。
功能:
- 一是让搜索引擎收录网站内容,方便推广。
- 二是提升用户访问体验(url中无&?等符号)
网站流量度量术语
ip访问量:独立IP计数,同一IP多次访问计数为1
pv访问量:Page View
uv访问量:Unique Vistor 独立访客量
www服务概述
1、常用提供静态程序服务软件apache、nginx
2、常用提供动态服务软件
- php:配合apache解析动态程序,使用mod_php5.so(module);配合nginx解析动态程序常用Fastcgi守护进程模式。
- tomcat:Tomcat只能算Web Container,是官方指定的JSP&Servlet容器。只实现了JSP/Servlet的相关规范,不支持EJB(硬伤啊)!不过Tomcat配合jboss和apache可以实现j2ee应用服务器功能一般来说考虑stucts等架构tomcat就可以了,但如果考虑EJB的话,WebLogic是比较好的选择。
- Jboss (免费):JBoss是一个管理EJB的容器和服务器,支持EJB 1.1、EJB 2.0和EJB3的规范。但JBoss核心服务不包括支持servlet/JSP的WEB容器,一般与Tomcat或Jetty绑定使用。
- weblogic (收费) :weblogic是j2ee的应用服务器(application server),包括ejb ,jsp,servlet,jms等等,全能型的。是商业软件里排名第一的容器(JSP、servlet、EJB等),并提供其他如JAVA编辑等工具,是一个综合的开发及运行环境。
- resin:大型动态web服务主流,互联网java容器主流(如jsp、do)
- IIS:微软windows下的web服务软件(如asp、aspx)
NginxWeb服务
主要应用场景:
- 使用Nginx运行html、js、css、小图片等静态数据
- Nginx结合FastCGI运行PHP等动态程序(常用用fastcgi_pass方式)
- Nginx结合tomcat/resin等支持java动态程序(常用proxy_pass方式)
安装nginx(编译安装)
- 1、yum install pcre pcre-devel openssl-devel -y #安装依赖
- 2、useradd www -s /sbin/nologin -M
- 3、wget -q http://nginx.org/download/nginx-1.8.1.tar.gz #到nginx官网http://nginx.org/复制下载链接,然后使用wget命令下载到本地
- 4、tar -xf nginx-1.8.1.tar.gz
- 5、./configure --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --prefix=/user/local/nginx-1.8.1/ #配置
- 6、make &&make install #编译 &安装
- 7、ln -s /usr/local/nginx-1.8.1/ /application/nginx #创建位置软连接,提供给开发或者其他脚本调用,以方便升级维护nginx
- 8、/usr/local/nginx-1.8.1/sbin/nginx #启动nginx 不加任何参数
- 9、/usr/local/nginx-1.8.1/sbin/nginx -V #显示nginx相关信息,和编译参数。
yum安装nginx
- wget -q http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
- rpm -ivh epel-release-6-8.noarch.rpm
- yum install nginx -y
虚拟主机概念
在web服务里就是一个独立的网站站点,这个站点对应独立的域名(也可能是IP或端口),具有独立的程序及资源目录,可以独立得对外提供服务,对于apache来说,一个虚拟主机的标签段通常包含在
基于域名的虚拟主机访问:DNS解析到IP地址后,根据IP:端口,建立tcp-http连接,sever端根据客户端的请求报文的请求头(如果使用ip访问,则没有请求头,直接找第一个位置的虚拟主机),拿到server_name,然后将请求发给相同server_name的虚拟站点。
基于IP的虚拟主机访问:
基于端口的虚拟主机访问:
location语法
=精确匹配,优先级最高
~区分大小写匹配
~*不区分大小写匹配
^~常规字符匹配后,不做正则表达式检查
rewrite
语法格式
rewrite[flag]; 关键字 正则 替代内容 flag标记 关键字:其中关键字rewrite不能改变 正则:perl兼容正则表达式语句进行规则匹配 替代内容:将正则匹配的内容替换成replacement flag标记:rewrite支持的flag标记 flag标记说明: last #本条规则匹配完成后,继续向下匹配新的location URI规则 break #本条规则匹配完成即终止,不再匹配后面的任何规则 redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址 permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
使用位置:server,location,if
举例说明(permanent301 redirect302)
server { listen 80; server_name www.360buy.com; rewrite ^/(.*) http://www.jd.com/$1 permanent; } server { listen 80; server_name www.jd.com; location / { root html/www; index index.html index.htm; } }
http { # 定义image日志格式 log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status; # 开启重写日志 rewrite_log on; server { root /home/www; location / { # 重写规则信息 error_log logs/rewrite.log notice; # 注意这里要用‘’单引号引起来,避免{} rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4; # 注意不能在上面这条规则后面加上“last”参数,否则下面的set指令不会执行 set $image_file $3; set $image_type $4; } location /data { # 指定针对图片的日志格式,来分析图片类型和大小 access_log logs/images.log mian; root /data/images; # 应用前面定义的变量。判断首先文件在不在,不在再判断目录在不在,如果还不在就跳转到最后一个url里 try_files /$arg_file /image404.html; } location = /image404.html { # 图片不存在返回特定的信息 return 404 "image not found\n"; } } ### 对形如/images/ef/uh7b3/test.png的请求,重写到/data?file=test.png,于是匹配到location /data,先看/data/images/test.png文件存不存在,如果存在则正常响应,如果不存在则重写tryfiles到新的image404 location,直接返回404状态码。 ###
nginx访问认证(了解)
1、添加配置文件
location或server中
auth_basic "oldboy training";
auth_basic_user_file /usr/local/nginx/conf/htpasswd;
2、htpasswd -cb /usr/local/nginx/conf/htpasswd oldboy 123456 #生成密码文件
403状态的解决
1、没有index.html、或者没有设置index
2、没有权限
PHP服务
FastCGI介绍
一个可伸缩的、高速的在HTTP服务器和动态脚本语言间通信的接口(在linux下,FastCGI接口即为socket),主要优点是把动态语言和HTTP服务器分离开来
nginx通过FastCGI借口和动态脚本语言PHP交换逻辑图
php安装
1、检查php安装所需的lib库
libmcrypt-devel在官方的yum源中没有,需要首先配置epel第三方yum源:
wet -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
rpm -qa libxml2-devel libpng-devel libjpeg-devel libmcrypt-devel mcrypt
rpm -qa freetype-devel gd-devel curl-devel libxslt-devel zlib-devel mhash
libiconv-devel包无yum源,需下载安装指定repo包然后再指定yum的repo包安装(https://pkgs.org/download/libiconv-devel; wget https://forensics.cert.org/cert-forensics-tools-release-el7.rpm;rpm -Uvh cert-forensics-tools-release-el7.rpm; yum --enablerepo=forensics install libiconv-devel -y)
2、下载、配置PHP安装参数
./configure --prefix=/usr/local/php-5.6.38 \ --enable-fpm \ --enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-fpm-user=www \
--with-fpm-group=www \
--with-config-file-path=/etc \
--with-config-file-scan-dir=/etc/php.d
make && make install
注意: --prefix=安装目录 --with-使用包名称[=包目录] --enable-需要激活的功能 --with-mysql=mysqlnd,如果本机没有安装mysql,使用mysqlnd代替,因为php已经自带了mysql的客户端工具
--with-fpm-user=www,php指定用户要和nginx一样
--with-apxs2=/usr/local/apache/bin/apxs #php使用此选项生成模块嵌入到apache(到httpd.conf)来配合apache的动态交互.当然也可以使用fastcgI,但LAMP中一般都用模块方式。
如果失败,使用make clean ,然后重新配置、编译、安装。
3、调整配置文件
pwd /usr/local/php-5.6.38 php --ini #检查php安装的配置文件定义的路径 cp php.ini-production /etc/php.ini mkdir -p /etc/php.d cp /usr/local/php-5.6.38/etc/php-fpm.conf.default /usr/local/php-5.6.38/etc/php-fpm.conf cp /usr/local/php-5.6.38/sbin/php-fpm /etc/init.d/php-fpm ln -s /usr/local/php-5.6.38 /usr/local/php
/usr/init.d/php-fpm #启动php
4、配置测试解析php
#去除nginx.conf中匹配php的location注释,然后主要修改的就是fastcgi_param中的/scripts 为 $document_root location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
编辑vim test.php文件放到根目录html下
<?php
phpinfo();
?>
/usr/local/nginx/sbin/nginx -s reload
浏览器输入地址/test.php,验证是否可以正常解析。
mysql数据库
https://www.cnblogs.com/he-ding/p/10020688.html
DNS服务
windows 客户端DNS解析相关维护命令
1)查看windows客户端本地dns缓存
ifconfig /displaydns #显示dns cache
2)清除windows客户端本地dns缓存的dns解析记录
ipconfig /flushdns
3)windows系统下hosts域名解析记录位置
C:\Windows\System32\drivers\etc\hosts
Tomcat
概述:
web应用服务器和nginx、apache、lighthttpd等web服务器一样,具有处理html页面功能,主要用于servlet和jsp容器。java最为广泛应用的容器,其他还有resin、weblogic(收费国企等)
安装
官网下载jdk和tomcat安装包 部署Java环境 tar xf jdk-8u60-linux-x64.tar.gz -C /application/ ln -s /application/jdk1.8.0_60 /application/jdk sed -i.ori '$a export JAVA_HOME=/application/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib/:$JAVA_HOME/lib/tools.jar' /etc/profile source /etc/profile java -version 安装tomcat tar -xf apache-tomcat-8.0.27.tar.gz -C /application/ ln -s /application/apache-tomcat-8.0.27 /application/tomcat echo 'export TOMCAT_HOME=/application/tomcat\nexport CATALINA_HOME=/application/tomcat' >>/etc/profile source /etc/profile /application/tomcat/bin/version.sh chown -R root:root /application/jdk/ /application/tomcat/
tomcat启动成功的标志:tail /usr/local/tomcat/logs/catalina.out 日志中找到org.apache.catalina.startup.Catalina.start Server startup in 573 ms 语句
日常运维注意/log/文件夹下catalina.out运行日志文件不断增大占用空间。
配置tomcat管理页面登陆(生产环境务必关闭)
vim conf/tomcat-users.xml #修改用户管理配置文件,增加管理角色账号
vim webapps/manager/META-INF/context.xml #修改manger访问地址控制
vim webapps/host-manager/META-INF/context.xml #修改host-manger访问地址控制
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.195\.\d+\.\d+"
重启tomcat
tomcat安装目录
bin 目录是二进制运行文件
webapps/ROOT 目录是默认站点目录
生产环境tomcat安全优化
cd /webapps
mv docs examples host-manager manger /tmp/ #移除webapps目录下ROOT意外所有文件夹
mv ROOT/* /tmp #清空ROOT 文件夹
tomcat配置文件
/tomcat/conf/server.xml #主配置文件
redirectPort="8443" />
unpackWARs="true" autoDeploy="true">
Redis
概述
参考维护文档
Redisdoc.com
特点:
缓存服务器(数据库)
速度快、支持多种数据结构、持久化、主从复制、支持过期时间、支持事务、消息订阅
对比memcached,多了主从和持久化功能以及多数据结构支持。
应用场景:
数据缓存、会话缓存(保存web回话信息)、排行榜/计数器、消息队列
安装配置.
docker
概述
docker的三大特性构建、运输、运行(一次构建、多处运行)
docker是传统cs架构,组要分为三大组件镜像、容器、仓库。
安装
[root@pbx ~]# yum -y install docker [root@pbx ~]# systemctl enable docker Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service. [root@pbx ~]# vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd-current --registry-mirror=https://a14c78qe.mirror.aliyuncs.com \ #找到ExecStart行,添加registry-mirror参数,修改docker下载仓库地址。 [root@pbx ~]# systemctl daemon-reload [root@pbx ~]# systemctl start docker [root@pbx ~]# systemctl status docker
简单操作
镜像操作 docker search nginx docker pull nginx docker save nginx >/tmp/nginx.tar.gz #保存镜像(导出镜像) docker load < /tmp/nginx.tar.gz #导入镜像 docker images # 查看镜像列表 docker rmi nginx #删除镜像 /var/lib/docker/ #docker默认路径 /usr/lib/systemd/system/docker.service #docker配置文件,可指定docker内核参数(centos7)环境变量等,需daemon-reload 重启docker服务 docker daemon --help #查看docker内核参数帮助 容器操作 docker run -it --name mytest alpine sh #启动镜像alpine,使用-it参数进入到docker终端中,--name参数指定容器运行名字而不是随机生成 docker inspect mytest #查看容器运行的详细信息。 exit#退出docker终端,此时如果此运行中的镜像里无其他进程运行,那么退出终端时,此镜像会自动关闭,使用docker ps 命令无法显示。让退出终端后的空镜像继续运行操作:ctrl 不放手 p q docker rm -f mytest #强制删除容器,运行中的也可以删除。 docker ps #显示正在运行的docker容器 docker ps -a #显示所有容器 docker execid> #docker exec 命令会在运行中的容器执行一个新进程。 docker commit id> #docker commit命令将容器的可读写层转换为一个只读层,这样就把一个容器转换成了不可变的镜像。 docker inspect id> or id> #ocker inspect命令会提取出容器或者镜像最顶层的元数据。
docker的http代理配置(通过修改/lib/systemd/system/docker.service文件增加配置环境方法无效)
mkdir -p /etc/systemd/system/docker.service.d
vim /etc/systemd/system/docker.service.d/http-proxy.conf
[Service] #键入配置内容
Environment="HTTP_PROXY=http://pill:pill@node2:3128/"
systemctl daemon-reload #重新加载配置文件
systemctl restart docker # 重启docker
docker search nginx #搜索nginx镜像 测试http连接