项目实验1-双web站点实现负载均衡,同时数据存在后端,并有实时备份异地,后台人员只能通过跳板机访问服务器

目录

一.项目需求:

双web站点实现负载均衡,同时数据存在后端,并有实时备份异地,后台人员实现操作审计。
注意:因为测试构架,没有涉及到动态网页,所以没有数据库,如果做动态网页,建议专门添加一台或多台服务器存放数据。
实现效果如图:
请添加图片描述

需求分析

需求1:web网站的负载均衡

实现web服务的负载均衡有多种,这里选择通过nfs服务器将web代码挂载到两台apache主机上,能保证两边web数据的一致性;同时通过dns解析,将同一域名指向两台web主机,实现web网站的轮询,从而达到负责均衡。

需求2:web代码实时异地备份

使用一台服务器,搭建rsync服务,通过nfs上的搭建sersync+rsync实时将web代码推给备份服务器。

需求3: 后台人员的操作审计

因为后台服务器数量较多,为了方便操作审计,专门用一台服务器作为跳板机,所有后台人员要操作服务器,都要经过跳板机中转。同时,通过ssh白名单和密钥对验证提高服务器的安全性

二.具体方案

1.服务器准备

服务器名ip
web01192.168.8.12
web02192.168.8.13
nfs192.168.8.13
dns(公网环境不需要)192.168.8.14
backup192.168.8.15
jumper192.168.8.16

2.方案描述

第一步:

在nfs服务器上存放网页源代码,搭建nfs服务,将存放网页源代码的目录共享出去(如果有安全考虑可设置防火墙的上对应端口的白名单),同时再将共享目录挂载到两台web的服务器搭建的apache的web目录下。

第二步:

添加一台服务器backup作为数据备份服务器,运行rsync服务;然后再在nfs服务器上搭建sersync+rsync服务,将网页源代码实时的存储到备份服务器backup上。

第三步:

通过dns解析,将同一域名指向两台服务器,实现用户访问的轮训,同时也实现了负载均衡。

第四步:

分别在各个服务器上开启ssh白名单,同时设置好需要操作后台的用户(最好所有服务器的用户名都统一,比如admin),可以根据情况是否需要sudo提权。
搭建跳板机,在跳板机上生成密钥对(可以生成2对,一对给跳板机访问服务器用,一对给后台人员访问跳板机用,我这里只用了一对,因为设置了ssh白名单),并将密钥对分发给各个服务器,同时分发一份给自己,再将自己的私钥存发给后台人员供后台人员访问跳板机用。

三.方案优缺点分析(一般至少要出两套方案,进行方案分析对比)

优点:

1.同步实时性高,且备份端及时性也很高

2.方案扩展性强,如果出现前端web服务器负债高时,只需再添加web服务器,挂在nfs服务器数据即可

3.使用跳板机最大限度的控制了后台人员的出错率和操作审计

4.经济成本低,除了nfs服务器,其他服务器基本配置要求不高

缺点:

1.容易出现单点故障,该项目最大的故障点在nfs服务器上,如果该服务器出现故障,会导致web服务器直接宕机

2.在访问量较大时,nfs服务器的性能将是整个项目的瓶颈

解决方案:实时的根据访问量和故障率,将后端备份服务器,作为第二台nfs服务器(需要升级配置)将备份的目录共享,在web02或额外添加web服务器挂载backup的备份目录。而且可以继续扩展下去。

拓扑图如图:
在这里插入图片描述
综上所述,该项目方案无论是现在,还是以后都可以作为一种中小规模的web构架。

四.项目报价

1.云服方案(报价来自于腾讯云)

服务器名|配置价格/年
web01|双核-4g-10M7156.26元
web02|双核-4g-10M7156.26元
nfs I 4核8g-无公网ip2724.06元
域名500元
backup| 2核-4g-无公网ip1528.86元
jumper |1核-1g-1M861.54元
总计19926.98元

2.购买物理服务器托管到第三方机房方案

对比下服务器如果买物理服务器的价格
机房托管:(数据来自于数据天下)
在这里插入图片描述
以上仅是服务器托管的费用,并未算上购买物理服务器的费用,可见该方案价格也是年付,而且价格高出云服很多。

3.使用公司自己的机房方案

电费:一台服务器300w功率,一天大概用电是7.2度电,现在商业电费大约是1.2元/小时,一天就是8.64元,一年电费大概3153.6元,5台大约1.6w元不到
宽带费:电信商业宽带100m的光线去年的报价是1399元/月,16788元/年,这是最低的新套餐宽带,只能选更贵的
物理服务器的价格:5w左右

4.结论

方案2,方案3都是购买物理服务器,购买物理服务器还有一个致命的缺陷,服务器的配置应该满足访问量的峰值。比如淘宝双11当天的流量肯定是平时10倍以上,那么物理服务器的配置就应该满足平时流量10倍情况选择配置。这个配置在平时就很浪费。
如果是云服,可以在后台弹性选择服务器的配置和带宽,过了流量高峰期,就可以在后台将配置降下来,资费也会恢复到平时的配置。
由此,无论是前期投入还是后期因为技术和业务发展的需求,云服务器方案是最佳选择

五.项目实施

因为可能用在公网用途全程采用最小权限

第一步:搭建nfs和web网站,并将nfs服务器的网页代码挂载到web01和web02上。

nfs服务器:

[root@nfs_server ~]# hostnamectl set-hostname nfs_server	#修改主机名,我已经改过了
[root@nfs_server ~]# yum -y install nfs-utils rpcbind		#安装nfs和rpc
[root@nfs_server ~]# mkdir /web
[root@nfs_server ~]# useradd -M -s /sbin/nologin www -u 2000
[root@nfs_server ~]# vim /etc/exports						#修改配置文件
[root@nfs_server ~]# cat /etc/exports
/web 192.168.8.*(ro,all_squash,anonuid=2000,anongid=2000)	#表示把/web目录共享给192.168.8.0网段,并且所有访问共享的用户全部进行权限压缩,压缩为新创建的www权限
[root@nfs_server ~]# vim /etc/sysconfig/nfs					#在最后添加,固定nfs传输文件时的端口,方便防火墙开放
[root@nfs_server ~]# tail -5 /etc/sysconfig/nfs
RQUOTAD_PORT=32801
LOCKD_TCPPORT=32802
LOCKD_UPDPORT=32803
MOUNTD_PORT=32804
STATD_PORT=32805
[root@nfs_server ~]# firewall-cmd --permanent --add-port=2049/tcp
[root@nfs_server ~]# firewall-cmd --permanent --add-port=2049/udp
[root@nfs_server ~]# firewall-cmd --permanent --add-port=111/tcp
[root@nfs_server ~]# firewall-cmd --permanent --add-port=111/udp
[root@nfs_server ~]# firewall-cmd --permanent --add-port=32801-32805/tcp
[root@nfs_server ~]# firewall-cmd --permanent --add-port=32801-32805/udp
[root@nfs_server ~]# systemctl restart firewalld
[root@nfs_server ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: dhcpv6-client ssh
  ports: 2049/tcp 2049/udp 111/udp 111/tcp 32801-32805/tcp 32801-32805/udp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
[root@nfs_server ~]# systemctl restart rpcbind			#注意,如果没有固定nfs端口(不用防火墙,实验环境下),一般不要重启nfs,用reload刷新配置就行,如果一定要重启,记得先重启rpc,再重启nfs
[root@nfs_server ~]# systemctl enable rpcbind
[root@nfs_server ~]# systemctl restart nfs
[root@nfs_server ~]# systemctl enable nfs
[root@nfs_server ~]# exportfs -v				#查看共享的目录和权限
[root@nfs_server ~]# echo "test page" > /usr/local/httpd/htdocs/index.html					#测试创建一个测试页面,方便web网站搭建好以后测试

web01:
源码安装apache

[root@web01 ~]# yum -y install gcc gcc-c++ apr apr-devel cyrus-sasl-devel expat-devel libdb-devel openldap-devel apr-util-devel apr-util pcre-devel pcre lrzsz
[root@web01 ~]# tar xvf httpd-2.4.48.tar.gz 
[root@web01 ~]# cd httpd-2.4.48
[root@web01 httpd-2.4.48]#  ./configure  --prefix=/usr/local/httpd    --enable-so    --enable-rewrite  --enable-charset-lite  --enable-cgi
[root@web01 httpd-2.4.48]# make && make install && echo $?      #等待安装完,看最后一行是否为0,如果不为0就是报错了
[root@web01 httpd-2.4.48]# cd
[root@web01 ~]# ln -s /usr/local/httpd/bin/* /usr/local/bin/	#挂软连接,不用输入绝对路径,可以使用apache相关命令
[root@web01 ~]# httpd -v
[root@web01 ~]# cp /usr/local/httpd/bin/apachectl /etc/init.d/httpd		#把httpd添加为启动项
[root@web01 ~]# vim /etc/init.d/httpd.  						#在第二行添加下面内容,注意注释符号要保留
[root@web01 ~]# cat /etc/init.d/httpd |grep chkconfig
# chkconfig: 35 85 21
[root@web01 ~]# chkconfig --add httpd
[root@web01 ~]# systemctl restart httpd
[root@web01 ~]# systemctl enable httpd
[root@web01 ~]# yum -y install rpcbind nfs-utils
[root@web01 ~]# systemctl restart rpcbind
[root@web01 ~]# useradd -M -s /sbin/nologin www -u 2000
[root@web01 ~]# mount -t nfs 192.168.8.11:/web /usr/local/httpd/htdocs/
[root@web01 ~]# vim /etc/fstab				#添加开机挂载
[root@web01 ~]# cat /etc/fstab |grep 192.168.8			#在最后添加一行
192.168.8.11:/web       /usr/local/httpd/htdocs nfs     defaults        0 0
[root@web01 ~]# systemctl restart httpd			
[root@web01 ~]# firewall-cmd --permanent --add-port=80/tcp
[root@web01 ~]# systemctl restart firewalld
[root@web01 ~]# firewall-cmd --list-all
[root@web01 ~]# curl 192.168.8.12				#测试一下apache是否能正常显示nf共享的内容

web02:
操作方式和web01一样。

第二步:使用sersync+rsync实时同步,进行数据备份

Rsync服务器:

[root@rsync ~]# yum -y install rsync		#安装rsync
[root@rsync ~]# vim /etc/rsyncd.conf		#将配置文件清空,添加如下内容
[root@rsync ~]# cat /etc/rsyncd.conf		
uid = rsync
gid = rsync
address  =192.168.8.15
port = 9873
hosts allow = 192.168.8.0/24
use chroot = yes
max connections = 5
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
motd file = /etc/rsyncd.motd
[web]
path = /web_bak
comment = backup web
read only = false
list = yes
auth users = backuper
secrets file = /etc/rsyncd.passwd
[root@rsync ~]# mkdir /web_bak
[root@rsync ~]# echo "backuper:123" > /etc/rsyncd.passwd		#创建虚拟用户backuper密码是123
[root@rsync ~]# chmod 600 /etc/rsyncd.passwd
[root@rsync ~]# echo "this is backuper" >	/etc/rsyncd.motd	#输出数据时的欢迎信息,可以不写
[root@rsync ~]# rsync --daemon --config=/etc/rsyncd.conf 		#后台运行rsync服务
[root@rsync ~]# firewall-cmd --permanent --add-port=9873/tcp
[root@rsync ~]# firewall-cmd --permanent --add-port=9873/udp	
[root@rsync ~]# firewall-cmd --permanent --add-port=22/tcp
[root@rsync ~]# firewall-cmd --permanent --add-port=22/udp
[root@rsync ~]# echo "rsync --daemon --config=/etc/rsyncd.conf" >>/etc/rc.d/rc.local		#设置开机启动
[root@rsync ~]# chdmo +x /etc/rc.d/rc.local
[root@rsync ~]# firewall-cmd --permanent --add-port=9873/tcp
[root@rsync ~]# firewall-cmd --permanent --add-port=9873/udp
[root@rsync ~]# systemctl restart firewalld

nfc服务器:

[root@nfs_server ~]# yum -y install rsync
[root@nfs_server ~]# echo "123" > /etc/rsyncd.passwd
[root@nfs_server ~]# chmod 600 /etc/rsyncd.passwd
[root@nfs_server ~]# rsync -rlvz --delete /web backuper@192.168.8.15::web --password-file=/etc/rsyncd.passwd --port=9873 		#测试手动免密备份,确认能正常将数据推到backuper服务器,如果不正常,先排查前面,再往后做
[root@nfs_server ~]# tar xvf sersync2.5.4_64bit_binary_stable_final.tar.gz -C /opt/					#自行下载sersync的程序包
[root@nfs_server ~]# mv /opt/GNU-Linux-x86 /opt/sersync
[root@nfs_server ~]# cp /opt/sersync/confxml.xml /opt/sersync/confxml_web.xml
[root@nfs_server ~]# vim /opt/sersync/confxml_web.xml        #修改24-32行内容
[root@nfs_server ~]# cat -n /opt/sersync/confxml_web.xml
...
    24          <localpath watch="/web">
    25              <remote ip="192.168.8.15" name="web"/>
    26              <!--<remote ip="192.168.8.39" name="tongbu"/>-->
    27              <!--<remote ip="192.168.8.40" name="tongbu"/>-->
    28          </localpath>
    29          <rsync>
    30              <commonParams params="-lrvz"/>
    31              <auth start="true" users="backuper" passwordfile="/etc/rsyncd.passwd"/>
    32              <userDefinedPort start="true" port="9873"/><!-- port=874 -->
...
[root@nfs_server ~]#/opt/sersync/sersync2 -d -r -o /opt/sersync/confxml_web.xml 
[root@nfs_server ~]# vim check_sersync_alived.sh		#编写检查sersync是否正常运行,没有运行就启动的脚本
[root@nfs_server ~]# cat check_sersync_alived.sh
#!/bin/bash
SERSYNC="/opt/sersync/sersync2"
CONFXML_WEB="/opt/sersync/confxml_web.xml"
STATUS_WEB=$(ps aux|grep -v 'grep' |grep 'confxml_web' | wc -l )
if [ $STATUS_WEB -eq 0 ];then
        $SERSYNC -d -r -o $CONFXML_WEB > /dev/null
else
        exit 0;
fi
[root@nfs_server ~]# echo "1 * * * * /usr/bin/sh /root/check_sersync_alive.sh" >> /var/spool/cron/root	#将执行脚本写进任务计划,每小时的第一分钟运行一次脚本
[root@nfs_server ~]# echo "/usr/bin/sh /root/check_sersync_alive.sh" >> /etc/rc.d/rc.local		#开机执行脚本
[root@nfs_server ~]# chmod +x /etc/rc.d/rc.local
[root@nfs_server ~]# touch /web/test.txt			#创建测试文件,看是否能实时同步到backuper端

第三步:设置dns解析,使用户访问web站点时轮询,从而实现web前端服务器的负载均衡

外网环境:

需要在第三方代理上购买域名,然后在代理网站后台进行域名解析的添加,将域名解析成我们之前搭建的web01和web02的外网地址

测试环境:

添加一台dns服务器
dns服务器

[root@dns ~]# yum -y install bind bind-chroot bind-utils bind-libs
[root@dns ~]# vim /etc/named.conf					#因为测试,我们只需要配置正向解析条目
[root@dns ~]# cat /etc/named.conf					
 options {
        listen-on port 53 { any; };
        listen-on-v6 port 53 { any; };
        directory       "/var/named";
        allow-query     { any; };
        recursion       yes;
        forwarders { 8.8.8.8;114.114.114.114; };
};

zone "." IN {
        type hint;
        file "named.ca";
};

zone "deny.com" IN {
        type master;
        file "deny.com.zone";
};
[root@dns ~]# vim /var/named/deny.com.zone
[root@dns ~]# cat /var/named/deny.com.zone				注意第一条NS记录和第二条dns的A记录必须要写不然会报错
$TTL 3D
@       IN SOA deny.com rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
deny.com.       IN      NS      dns.deny.com.
dns             IN      A       192.168.8.14
www             IN      A       192.168.8.12
www             IN      A       192.168.8.13
[root@dns ~]# named-checkconf -z /etc/named.conf
[root@dns ~]# systemctl restart named
[root@dns ~]# systemctl enable named

第四步:增加跳板机,并在各个服务器上配置登陆用户及ssh白名单。

1.在各个服务器上添加登陆用户

[root@nfs_server ~]# useradd admin && echo "admin:123" |chpasswd				#密码尽量复杂,我这里只是随便输入的,这个用户是给跳板机登陆的

2.在jumper服务器创建并分发密钥对

[root@jumper ~]# ssh-keygen -t rsa
[root@jumper ~]# ssh-copy-id admin@192.168.8.16			#发布给自己是用同一对密钥对,后台工作人能远程到跳板机,因为其他服务器有ssh白名单,所以这里一对密钥对就够了
[root@jumper ~]# ssh-copy-id admin@192.168.8.11
[root@jumper ~]# ssh-copy-id admin@192.168.8.12
[root@jumper ~]# ssh-copy-id admin@192.168.8.13
[root@jumper ~]# ssh-copy-id admin@192.168.8.14
[root@jumper ~]# ssh-copy-id admin@192.168.8.15

3.在各个服务器上设置ssh白名单和sudo权限

[root@nfs_server ~]# vim /etc/ssh/sshd.conf				#添加一行,建议在Allow字段附近添加
[root@nfs_server ~]# cat /etc/ssh/sshd.conf |grep AllowUsers
AllowUsers admin@192.168.8.16
[root@nfs_server ~]# systemctl restart ssh
[root@nfs_server ~]# vim /etc/sudoers					#给指定用户sudo提权
[root@nfs_server ~]# cat /etc/sudoers |grep "admin"		#我这里给的是root权限,可以根据需求自定义权限级别
admin   ALL=(ALL)       NOPASSWD:ALL

4.在jumper服务器上创建客户端(需要登陆到后台服务器的人员)登陆时需要的账号

[root@jumper ~]# useradd admin && echo "admin:123" |chpasswd				#创建一个需要登陆到服务器后台的账户

[root@jumper ~]# ls -aR /root/
/root/:
.   anaconda-ks.cfg  .bash_logout   .bashrc  .pki  .tcshrc
..  .bash_history    .bash_profile  .cshrc   .ssh  .viminfo

/root/.pki:
.  ..  nssdb

/root/.pki/nssdb:
.  ..

/root/.ssh:
.  ..  id_rsa  id_rsa.pub  known_hosts					#这里就是存放的密钥对,id_rsa是私钥,id_rsa.pub是发布给自己的公钥,管理员需要把id_rsa下载保存起来,提供给需要远程后服务器的后台人员

至此,所有功能及操作已完成。

六. 测试效果

测试跳板机效果

用一台电脑接入网络测试

Last login: Mon Aug 23 14:02:54 on console
deny@denydeMacBook-Pro ~ % ssh admin@192.168.8.11
admin@192.168.8.11's password: 
Permission denied, please try again.
admin@192.168.8.11's password: 
Permission denied, please try again.
admin@192.168.8.11's password: 
admin@192.168.8.11: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
deny@denydeMacBook-Pro ~ % 

从跳板机

[root@jumper ~]# ssh admin@192.168.8.11
Last failed login: Mon Aug 23 15:02:33 CST 2021 from 192.168.8.1 on ssh:notty
There were 3 failed login attempts since the last successful login.
[admin@nfs ~]$ 

可以看到白名单已经生效

测试轮询,负载均衡

[root@jumper ~]# ping www.deny.com
PING www.deny.com (192.168.8.12) 56(84) bytes of data.
64 bytes from 192.168.8.12 (192.168.8.12): icmp_seq=1 ttl=64 time=1.74 ms
64 bytes from 192.168.8.12 (192.168.8.12): icmp_seq=2 ttl=64 time=1.56 ms
^C
--- www.deny.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 1.560/1.651/1.742/0.091 ms
[root@jumper ~]# ping www.deny.com
PING www.deny.com (192.168.8.13) 56(84) bytes of data.
64 bytes from 192.168.8.13 (192.168.8.13): icmp_seq=1 ttl=64 time=1.63 ms
64 bytes from 192.168.8.13 (192.168.8.13): icmp_seq=2 ttl=64 time=1.54 ms
64 bytes from 192.168.8.13 (192.168.8.13): icmp_seq=3 ttl=64 time=0.677 ms
64 bytes from 192.168.8.13 (192.168.8.13): icmp_seq=4 ttl=64 time=1.75 ms
^C
--- www.deny.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3044ms
rtt min/avg/max/mdev = 0.677/1.400/1.750/0.426 ms

可以看到在跳板机上ping域名,已经实现访问的轮询

测试数据同步

在nfs服务器上添加数据

[root@nfs admin]# echo "data rsync test" > /web/index.html

测试两个web网站是否同步了数据

[root@jumper ~]# curl www.deny.com
data rsync test
[root@jumper ~]# curl 192.168.8.12
data rsync test
[root@jumper ~]# curl 192.168.8.13
data rsync test

登陆到rsync服务器上看数据是否实时同步到了rsync

[root@rynsc ~]# cat /web_bak/index.html 
data rsync test

至此,环境搭建完毕,所有需求已实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值