第八周作业
1. 完成ftp的mysql虚拟用户
#1.在数据库服务器上安装mysql yum install -y mariadb-server systemctl enable --now marisadb.service
#2.在数据库服务上配置数据库支持vsftpd服务 #建立存储虚拟用户名和表 mysql> CREATE DATABASE vsftpd; mysql> USE vsftpd; mysql> CREATE TABLE users ( id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, name CHAR(50) BINARY NOT NULL, password CHAR(48) BINARY NOT NULL ); #添加虚拟用户,为了安全应该使用PASSWORD函数加密其密码后存储 mysql> INSERT INTO users(name,password) values('ftp_wang',password('magedu')); mysql> INSERT INTO users(name,password) values('ftp_mage',password('magedu')); #创建连接的数据库用户 mysql> GRANT SELECT ON vsftpd.* TO vsftpd@'10.0.0.%' IDENTIFIED BY 'magedu'; mysql> FLUSH PRIVILEGES;
#3在FTP服务器上安装vsftpd和pam_mysql #安装相关包 yum -y install vsftpd gcc gcc-c++ make mariadb-devel pam-devel #编译pam_mysql wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql- 0.7RC1.tar.gz https://github.com/NigelCunningham/pam-MySQL/archive/v0.8.1.tar.gz tar xvf pam_mysql-0.7RC1.tar.gz cd pam_mysql-0.7RC1/ ./configure --with-pam-mods-dir=/lib64/security make install
#4在FTP服务器上建立PAM认证所需文件 vim /etc/pam.d/vsftpd.mysql auth required pam_mysql.so user=vsftpd passwd=magedu host=mysqlserver db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 account required pam_mysql.so user=vsftpd passwd=magedu host=mysqlserver db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
#5.建立相应用户和修改vsftpd配置文件 useradd -s /sbin/nologin -d /data/ftproot -r vuser mkdir -pv /data/ftproot/upload setfacl -m u:vuser:rwx /data/ftproot/upload vim /etc/vsftpd/vsftpd.conf guest_enable=YES guest_username=vuser pam_service_name=vsftpd.mysql systemctl enable --now vsftpd
#6.在FTP服务器上配置虚拟用户具有不同的访问权限 vim /etc/vsftpd/vsftpd.conf #添加 user_config_dir=/etc/vsftpd/conf.d/ mkdir /etc/vsftpd/conf.d/ vim /etc/vsftpd/conf.d/ftp_wang anon_upload_enable={YES|NO} anon_mkdir_write_enable={YES|NO} anon_other_write_enable={YES|NO} #登录目录至指定目录 local_root=/data/ftproot2
2. 完成rsyslog远程日志收集,及采集mysql日志。
#1.在rsyslog服务器上安装连接mysql模块相关的数据包 yum install -y rsyslog-mysql scp /usr/share/doc/rsyslog/mysql-createDB.sql 192.168.50.2:/data
#2.准备mysql server yum install -y marisadb-server #在mariadb数据库服务器上创建相关数据库和表,并授权rsyslog能连接至当前服务器 mysql -u mysql>source /data/mysql-createDB.sql mysql>GRANT ALL ON Syslog.* TO 'rsyslog'@'192.168.50.%' IDENTIFIED BY '123456';
#3.配置日志服务器将日志发送至指定数据库 #配置rsyslog将日志保存到mysql中 vim /etc/rsyslog.conf #在 MODULES 语言下面,如果是 CentOS 8 加下面行 module(load="ommysql") #在RULES语句块加下面行的格式 #facility.priority :ommysql:DBHOST,DBNAME,DBUSER, PASSWORD *.info :ommysql:192.168.50.1,Syslog,rsyslog,123456
systemctl restart rsyslog.service
3. 解析ftp主动和被动模式工作原理。
FTP工作原理从服务器角度分主动和被动工作模式 主动(PORT style):服务器主动连接 命令(控制):客户端:随机port ---> 服务器:21/tcp 数据:客户端:随机port <---服务器:20/tcp 被动(PASV style):客户端主动连接 命令(控制):客户端:随机port ---> 服务器:21/tcp 数据:客户端:随机port ---> 服务器:随机port /tcp
4. 利用sesync, inotify分别实现数据备份。
#基于远程shell实现sersync ssh-keygen ssh-copy-id root@192.168.50.2 wget https://storage.googleapis.com/google-code-archivedownloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz cp -a GNU-Linux-x86 /usr/local/sersync echo 'PATH=/usr/local/sersync:$PATH' > /etc/profile.d/sersync.sh source /etc/profile.d/sersync.sh yum install rsync -y cp /usr/local/sersync/confxml.xml{,.bak} vim /usr/local/sersync/confxml.xml <attrib start="true"/> #修改此行为true <localpath watch="/data/www"> #修改此行,指定源数据目录 <remote ip="备份服务器IP" name="/data/backup"/> #修改此行指定备份服务器地址和备份目标目录 <auth start="false" users="root" passwordfile="/etc/rsync.pas"/> #必须修改此行,不启用认证start=false <ssh start="true"/> #修改此行为true,使用远程shell方式的rsync连接方式,无需在目标主机上配置启动rsync daemon服务
sersync2 -dro /usr/local/sersync/confxml.xml
5. 解析LVS调度算法及几种工作模式原理,实现LVS+DR高可用nginx。
LVS调度算法分为静态方法和动态方法 其中静态方法: 仅根据算法本身进行调度 1、RR 轮询,较常用 2、WRR 加权轮询,较常用 3、SH 实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定 4、DH 目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡。 其中动态方法: 主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度 1、LC 适用于长连接应用 Overhead=activeconns*256+inactiveconns 2、WLC 默认调度方法,较常用 Overhead=(activeconns*256+inactiveconns)/weight 3、SED 初始连接高权重优先,只检查活动连接,而不考虑非活动连接 Overhead=(activeconns+1)*256/weight 4、NQ 第一轮均匀分配,后续SED 5、LBLC 动态的DH算法 根据负载状态实现正向代理,实现Web Cache等 6、LBLCR 带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS,,实现Web Cache等
LVS集群的工作模式 lvs-nat:修改请求报文的目标IP,多目标IP的DNAT模式 lvs-dr:操纵封装新的MAC地址 lvs-tun:在原请求IP报文之外新加一个IP首部 lvs-fullnat:修改请求报文的源和目标IP 一、lvs-nat:本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发 (1)RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP (2)请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈 (3)支持端口映射,可修改请求报文的目标PORT (4)VS必须是Linux系统,RS可以是任意OS系统 二、LVS-DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变 1. Director和各RS都配置有VIP 2. 确保前端路由器将目标IP为VIP的请求报文发往Director 3. RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director 4. RS和Director要在同一个物理网络 5. 请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client 6. 不支持端口映射(端口不能修改) 7. 无需开启 ip_forward 8. RS可使用大多数OS系统 三、lvs-tun转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP 1. RIP和DIP可以不处于同一物理网络中,RS的网关一般不能指向DIP,且RIP可以和公网通信。也就是 说集群节点可以跨互联网实现。DIP, VIP, RIP可以是公网地址 2. RealServer的tun接口上需要配置VIP地址,以便接收director转发过来的数据包,以及作为响应的报文源IP 3. Director转发给RealServer时需要借助隧道,隧道外层的IP头部的源IP是DIP,目标IP是RIP,而RealServer响应给客户端的IP头部是根据隧道内层的IP头分析得到的,源IP是VIP,目标IP是CIP 4. 请求报文要经由Director,但响应不经由Director,响应由RealServer自己完成 5. 不支持端口映射 6. RS的OS须支持隧道功能 四、lvs的fullnat模式 通过同时修改请求报文的源IP地址和目标IP地址进行转发 1. VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP 2. RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client 3. 请求和响应报文都经由Director 4. 相对NAT模式,可以更好的实现LVS-RealServer间跨VLAN通讯 5. 支持端口映射
6. 完成nginx编译安装及平滑升级。
#编译安装nginx yum -y install gcc pcre-devel openssl-devel zlib-devel useradd -s /sbin/nologin nginx wget http://nginx.org/download/nginx-1.18.0.tar.gz tar xf nginx-1.18.0.tar.gz cd nginx-1.18.0/ ./configure --prefix=/apps/nginx \ --user=nginx \ --group=nginx \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_realip_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --with-pcre \ --with-stream \ --with-stream_ssl_module \ --with-stream_realip_module make && make install chown -R nginx.nginx /apps/nginx #复制同一版本的nginx的yum安装生成的service文件 vim /usr/lib/systemd/system/nginx.service [Unit] Description=nginx - high performance web server Documentation=http://nginx.org/en/docs/ After=network-online.target remote-fs.target nss-lookup.target Wants=network-online.target [Service] Type=forking PIDFile=/apps/nginx/run/nginx.pid ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s TERM $MAINPID [Install] WantedBy=multi-user.target mkdir /apps/nginx/run/ vim /apps/nginx/conf/nginx.conf pid /apps/nginx/run/nginx.pid; systemctl daemon-reload systemctl enable --now nginx
#平滑升级到1.20.1 wget http://nginx.org/download/nginx-1.20.1.tar.gz tar xvf nginx-1.20.1.tar.gz cd nginx-1.20.1 #编译新版本 #./configure --prefix=/apps/nginx --user=nginx -- group=nginx --with-http_ssl_module --with-http_v2_module --withhttp_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module #只要make无需要make install make #把之前的旧版的nginx命令备份 mv /apps/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old #把新版本的nginx命令复制过去 cp ./objs/nginx /apps/nginx/sbin/ #USR2 平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的nginx #此时两个master的进程都在运行,只是旧的master不在监听,由新的master监听80 #此时Nginx开启一个新的master进程,这个master进程会生成新的worker进程,这就是升级后的Nginx进程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理。 kill -USR2 `cat /apps/nginx/run/nginx.pid` #可以看到两个master,新的master是旧版master的子进程,并生成新版的worker进程 #先关闭旧nginx的worker进程,而不关闭nginx主进程方便回滚 #向原Nginx主进程发送WINCH信号,它会逐步关闭旗下的工作进程(主进程不退出),这时所有请求都会由新版Nginx处理 kill -WINCH `cat /apps/nginx/run/nginx.pid.oldbin` #经过一段时间测试,新版本服务没问题,最后退出老的master kill -QUIT `cat /apps/nginx/run/nginx.pid.oldbin`