第八周作业

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`  

 

posted @ 2022-09-12 23:37  帅气的工藤新一  阅读(29)  评论(0)    收藏  举报