Linux综合大实验(高可用的WEB业务系统)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24601199/article/details/88990689

Linux大实验记录

结合Nginx、keepalived、ansible、zabbix、iptables、LVS、NFS、MysqlRoute、Django、Python创建一个高可用的WEB业务系统

项目需要达到的效果

   1、 外网所有机器只能ssh到堡垒机(ssh_server),通过堡垒机对其他机器进行ssh连接,并且所有内网机器除堡垒机和ansible机外不能互相ssh连接(设置ssh黑白名单即可)(完成)
    2、所有内网机器能进行上网,外部访问内部服务器通过路由器A进行转发到各个负载均衡器,再通过相关规则(如轮询)进行传递到对应服务器(完成)

正在更新,未完待续......

2019.4.3

 

此处附上拓扑图

 

在两台台式机上分别创建一个1810版本的Centos7(用来克隆出其他所需要的服务器)

一、在Linux里进行基本服务关闭以及其他的习惯性的操作

1、下载vim编辑器

[root@localhost ~]# yum install vim -y

2、下载相关网络命令的包net-tools

[root@localhost ~]# yum install net-tools -y

3、设置快捷键

[root@localhost ~]# vim ~/.bashrc

添加快捷键(个人习惯用”c”代替clear,方便清屏)

4、关闭开机自启的selinux

[root@localhost ~]# vim /etc/selinux/config

如下图,将SELINUX设置为disabled

5、关闭开机自启的firewalld

[root@localhost ~]# systemctl disable firewalld

重启后查看是否禁止开机自启firewalld

[root@localhost ~]# systemctl status firewalld

7、关闭开机自启的firewalld

[root@localhost ~]# systemctl disable firewalld

重启后查看是否禁止开机自启firewalld

[root@localhost ~]# systemctl status firewalld

8、永久添加某些iptables规则

[root@Firewall ~]# iptables -t nat -A POSTROUTING -s 192.168.58.254/24 -o ens33 -j SNAT --to-source 192.168.0.236

[root@Firewall ~]# service iptables save

9、永久开启路由转发功能

[root@Route_A ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

10、在开机自启文件里添加相关的开机自启规则

[root@Route_A ~]# vim /etc/rc.local

设置好后还需要给这个文件权限,设置开机自启

[root@Route_A ~]# chmod +x /etc/rc.d/rc.local

                                                         ansible_server配置

1、在ansible主机上生成密钥对

[root@ansible_server ~]# ssh-keygen -t ecdsa

2、上传公钥到node1和node2节点服务器的root用户的家目录下面

[root@ansible_server ~]# cd .ssh/

[root@ansible_server .ssh]# ls

id_ecdsa id_ecdsa.pub

把公钥传到78、79两台节点服务器

[root@ansible_server .ssh]# ssh-copy-id -i id_ecdsa.pub [email protected].59.80

3、测试免密码登录是否成功

[root@ansible_server ~]# ssh [email protected].59.80

依次完成所有的内网服务器连接

或者

生成公钥

[root@ansible_server ~]# ssh-keygen

传输公钥,进行免秘钥操作

[root@ansible_server ~]# ssh-copy-id [email protected]

完成操作

 

                                                                           外网连接内网ssh设置

只允许连接堡垒机

先在防火墙上面做DNAT

[root@Firewall ~]# iptables -t nat -A PREROUTING -i ens33 -d 192.168.0.236 -p tcp --dport 22 -j DNAT --to-destination 192.168.58.1

外网进来的连接22端口的请求转发给Route_A

再在Route_A上面做DNAT把从防火墙转发进来的ssh连接转发给ssh_server

[root@Firewall ~]# iptables -t nat -A PREROUTING -i ens33 -d 192.168.58.1 -p tcp --dport 22 -j DNAT --to-destination 192.168.59.22

 

                                               禁止内网除ssh和ansible服务器以外的所有主机互相连接

[root@docker_server ~]# vim /etc/hosts.allow

添加两条允许ssh的IP

sshd:192.168.59.22

sshd:192.168.59.110

[root@docker_server ~]# vim /etc/hosts.deny

添加禁止所有的IP连接

sshd:all

 

(linux 系统会先检查/etc/hosts.deny规则,再检查/etc/hosts.allow规则,如果有冲突 按/etc/hosts.allow规则处理)

 

                                                                            配置Zabbix_server

Zabbix是分布式的,是SC架构,即server-client模式,服务器和客户机都需要装相关软件

安装zabbix服务端

此处有个脚本,一键安装,贴上脚本来源

https://www.cnblogs.com/clsn/p/7885990.html#auto_id_18

#!/bin/bash

#clsn

 

#设置解析 注意:网络条件较好时,可以不用自建yum源

# echo '10.0.0.1 mirrors.aliyuncs.com mirrors.aliyun.com repo.zabbix.com' >> /etc/hosts

 

#安装zabbix源、aliyun YUM源

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm

 

#安装zabbix

yum install -y zabbix-server-mysql zabbix-web-mysql

 

#安装启动 mariadb数据库

yum install -y  mariadb-server

systemctl start mariadb.service

 

#创建数据库

mysql -e 'create database zabbix character set utf8 collate utf8_bin;'

mysql -e 'grant all privileges on zabbix.* to zabbix@localhost identified by "zabbix";'

 

#导入数据

zcat /usr/share/doc/zabbix-server-mysql-3.0.13/create.sql.gz|mysql -uzabbix -pzabbix zabbix

 

#配置zabbixserver连接mysql

sed -i.ori '115a DBPassword=zabbix' /etc/zabbix/zabbix_server.conf

 

#添加时区

sed -i.ori '18a php_value date.timezone  Asia/Shanghai' /etc/httpd/conf.d/zabbix.conf

 

#解决中文乱码

yum -y install wqy-microhei-fonts

\cp /usr/share/fonts/wqy-microhei/wqy-microhei.ttc /usr/share/fonts/dejavu/DejaVuSans.ttf

 

#启动服务

systemctl start zabbix-server

systemctl start httpd

 

#写入开机自启动

chmod +x /etc/rc.d/rc.local

cat >>/etc/rc.d/rc.local<<EOF

systemctl start mariadb.service

systemctl start httpd

systemctl start zabbix-server

EOF

 

#输出信息

echo "浏览器访问 http://`hostname -I|awk '{print $1}'`/zabbix"

 

安装zabbix客户端

#!/bin/bash

#clsn

 

#设置解析

echo '10.0.0.1 mirrors.aliyuncs.com mirrors.aliyun.com repo.zabbix.com' >> /etc/hosts

 

#安装zabbix源、aliyu nYUM源

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm

 

#安装zabbix客户端

yum install zabbix-agent -y

#修改位允许来采集数据的服务器的ip

sed -i.ori 's#Server=127.0.0.1#Server=192.168.59.111#' /etc/zabbix/zabbix_agentd.conf

systemctl start  zabbix-agent.service

 

#写入开机自启动

chmod +x /etc/rc.d/rc.local

cat >>/etc/rc.d/rc.local<<EOF

systemctl start  zabbix-agent.service

EOF

 

检测连通性

在服务端安装zabbix-get检测

[root@zabbix_server ~]# yum install zabbix-get

2.3.2 在服务端进行测试

注意:只能在服务端进行测试

[root@zabbix_server ~]# zabbix_get -s 192.168.59.120 -p 10050 -k "system.cpu.load[all,avg1]"

[root@zabbix_server ~]# zabbix_get -s 192.168.59.120 -p 10050 -k "system.cpu.load[all,avg1]"

 

使用浏览器访问

  http://10.0.0.61/zabbix/setup.php

配置keepalived高可用

利用ansible服务器对两台LB进行keepalived下载

[root@ansible_server ~]# ansible "192.168.59.120 192.168.59.121" -m shell -a "yum install keepalived -y"

利用ansible服务器打开两台LB的keepalived

[root@ansible_server ~]# ansible "192.168.59.120 192.168.59.121" -m shell -a "service keepalived start"


并设置开机自启

[root@LB_backup ~]# echo "/etc/init.d/keepalived start" >>/etc/rc.local

[root@LB_backup ~]# chmod +x /etc/rc.d/rc.local

之后关闭keepalived

[root@ansible_server ~]# ansible "192.168.59.120 192.168.59.121" -m shell -a "service keepalived stop"

分别对主从LB进行配置

[root@LB_master ~]# vim /etc/keepalived/keepalived.conf

主节点配置信息

 

global_defs{

   notification_email {

        [email protected]         #收邮件人,可以定义多个

   }

   notification_email_from kaadmin@localhost       #发邮件人可以伪装

   smtp_server 192.168.59.120    #发送邮件的服务器地址

   smtp_connect_timeout 30  #连接超时时间

   router_id LVS_DEVEL      

}

vrrp_instanceVI_1 {    #每一个vrrp_instance就是定义一个虚拟路由器的

    state MASTER         #由初始状态状态转换为master状态

    interface ens33   

    virtual_router_id 51     #虚拟路由的id号,一般不能大于255的

    priority 100     #初始化优先级 一定要比BACKUP大

    advert_int 1      #初始化通告

    authentication {     #认证机制

        auth_type PASS

        auth_pass 1111     #密码

    }

    virtual_ipaddress {      #虚拟地址vip

       192.168.59.122

    }

}

 

 

配置好保存后,重启keepalived,过几分钟就能生成一个VIP:192.168.59.122

在LB_backup上进行类似的配置,如下

vrrp_instanceVI_1 {  #每一个vrrp_instance就是定义一个虚拟路由器的

    state BACKUP   #初始化状态

    interface eth0

    virtual_router_id 51

    priority 99       #优先级,一定要比master的优先级要低

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.59.122

    }

}

配置好后保存并开启keepalived

主从LB都配置好后进行实验测试BACKUP能否在MASTER挂掉之后立马拿走VIP

先关掉masrer的

[root@LB_maser ~]# service keepalived stop

查看backup的addr,发现已经拿走了,配置成功

配置keepalived负载均衡(LVS DR模式使用轮询算法)

在LB_master和LB_backup里下载ipvsadm

[root@LB_master ~]# yum isntall ipvsadm -y

 

在master上面进行配置设置VS(虚拟服务器 virtual server)和RS(真实服务器real server)

[root@LB_maser etc]# cd /etc/keepalived/

[root@LB_maser keepalived]# vim keepalived.conf

virtual_server 192.168.59.77 80 { #负载均衡配置 (重要:端口必须与realserver端口一致,不能更改)

    delay_loop 6  #每个6秒检查一次real_server状态

    lb_algo rr          #LVS算法 采用轮询算法

    lb_kind DR   #LVS模式

    persistence_timeout 5  #会话保持时间

    protocol TCP

 

    real_server 192.168.59.80 80 {

        weight 1

        HTTP_GET {

            url {

              path /

          

            }

            url {

              path /mrtg/

       state_code            }

            connect_timeout 3         #连接超时时间

            nb_get_retry 3        #重连次数

            delay_before_retry 3       #重连间隔时间

            connect_port 80               #健康检查端口

        }

    }

 

    real_server 192.168.59.81 80 {

        weight 1

        HTTP _GET {

            url {

              path /

       state_code

            }

            url {

              path /mrtg/

       state_code

            }

            connect_timeout 3           #连接超时时间

            nb_get_retry 3                   #重连次数

            delay_before_retry 3       #重连间隔时间

            connect_port 80               #健康检查端口

        }

    }

}

两台调度器做好配置后,重启service keepalived restart,即可实现2台调度器上的VIP切换(关掉机器或断掉网络或关掉keepalived都可以使VIP切换)。

查看轮询的rs

此时还需要在两台RS上面写个脚本,进行ARP毒化,内容如下

 

#/bin/bash

vip=192.168.43.82

#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端

ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up

route add -host $vip lo:0

#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端,又叫arp欺骗

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce

echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

 

 

[root@LB_master ~]# ipvsadm -ln


现在直接访问VIP(virtual IP虚拟IP)就能轮换着访问两台web服务器了

集群调度软件对比

Nginx分析

优点:工作在7层,可以针对http做分流策略;正则表达式比haproxy强大;安装、配置、测试简单,通过日志可以解决多数问题;并发量可以达到几万次;nginx还可以作为web服务器使用

缺点:仅支持http、https、mail协议,应用面小;监控检查仅通过端口,无法使用url检查

 

LVS分析

优点:负载能力强,工作在4层,对内存、CPU消耗低;配置性低,没有太多可配置性,减少认为错误;应用面广,几乎可以为所有应用提供负载均衡

缺点:不支持正则表达式,不能实现动静分离;如果网站架构庞大,LVS-DR配置比较繁琐

 

HAProxy分析

优点:支持session、cookie功能;可以通过url进行健康检查;效率、负载均衡速度,高于nginx,低于LVS;HAProxy支持TCP,可以对mysql进行负载均衡;调度算法丰富

缺点:正则弱于nginx;日志依赖于syslogd,不支持apache日志

NFS部署

NFS的工作原理

1)首先服务器端启动RPC服务,并开启111端口

2)服务器端启动NFS服务,并向RPC注册端口信息

3)客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口

4)服务端的RPC(portmap)服务反馈NFS端口信息给客户端。

5)客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。

 

服务端配置

1、查看系统信息

先看自己的系统版本和内核参数,因为不同版本对应的软件可能会有区别

[root@NFS_server ~]# cat /etc/redhat-release

CentOS Linux release 7.6.1810 (Core)

[root@NFS_server ~]# uname -a

Linux NFS_server 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

 

2、NFS相关软件安装

部署NFS服务需要装nfs-utils(NFS主程序)rpcbindRPC主程序)

其中nfs-utils包含了rpc.nfsd和rpc.mount

[root@NFS_server ~]# yum install rpcbind nfs-utils -y

安装好后查看rpc是否启动

[root@NFS_server ~]# systemctl status rpcbind


显然启动的非常成功

  1. 启动NFS之前查看一下NFS服务向PRC服务注册的端口信息

[root@NFS_server ~]# rpcinfo -p localhost

 

  1. 启动NFS服务,并设置为开机自启

[root@NFS_server ~]# systemctl start nfs

[root@NFS_server ~]# systemctl enable nfs

 

  1. 配置NFS服务

NFS服务主要是在/etc/exports这个文件里面进行配置的,默认情况下这个文件是空的

编辑好这个文件后,先启动rpcbind(若已启动无需重启),然后重启NFS就可以了

[root@NFS_server ~]# vim /etc/exports

/tmp/

[共享目录]   [客户端地址1(权限)]        [客户端地址2(权限)]

 

6、查看共享的目录

[root@NFS_server ~]# showmount -e localhost

7、查看配置的信息

[root@NFS_server ~]# exportfs -v

参数代表的意思

 

 
 

客户端配置

因为本实验是配置两个web服务器,所以用ansible服务器进行统一配置

1、安装RPC和NFC

在客户机上同样要装上nfs-utils和rpcbind

[root@ansible_server ~]# ansible "192.168.59.80 192.168.59.81" -m shell -a "yum install nfs-utils rpcbind -y"

 

2、查看NFS服务器共享出来的目录

[root@web1 html]# showmount -e 192.168.59.82

3、挂载NFS服务器上共享的/nfs-share/html目录到本地/usr/share/nginx/html

[root@web1 nginx]# mount -t nfs 192.168.59.82:/nfs-share/html /usr/share/nginx/html

 

  1. 查看挂载结果

 

5、测试挂载结果

我在NFS服务器上共享的文件夹里添加了这些文件


包括修改了404页面

至此,NFS搭载完毕

如果NFS服务器挂了,web服务器也就挂了,所以需要用zabbix进行监控,查看NFS服务器的情况

 

                                                                踩过的坑

情况1

公钥信息改变了

主要是因为换了台物理机,导致公钥密码更该,所以需要去把公钥删除,重新连接

[root@ansible_server ~]#  vim ~/.ssh/known_hosts

进去删掉失效的公钥,重新连接即可


 

情况2

出现zabbix server is not running情况(下图)

大概率是因为zbx_server的地址没有改为zabbix服务器的ip

情况3

ZABBIX忘记登录密码重置方法

[root@zabbix_server ~]#  mysql -uroot -p -e "select * from zabbix.users\G"


此处就是登录密码,只不过转成了md5格式罢了,在线转码就ok

贴一个在线转md5的链接https://www.cmd5.com/

 

情况4:

在zabbix里面查不到客户机

有可能是客户机的配置文件没有配置zabbix_server地址

sed -i.ori 's#Server=127.0.0.1#Server=192.168.59.111#' /etc/zabbix/zabbix_agentd.conf

systemctl  restart zabbix-agent.service

 

情况5

发现ansible可以ssh过去firewalld,但是不能通过ansible命令来操作firewall

最后解决办法是把hosts.allow里面的sshd:192.168.59.110(ansible服务器)替换为sshd:192.168.58.1(路由器)

但是这样很明显是不安全的,有待改进

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_24601199/article/details/88990689