Web服务器集群搭建关键步骤纪要

14次阅读

前言:本文记述了搭建一个小型 web 服务器集群的过程,由于篇幅所限,系统、软件的安装和基本配置我这里就省略了,只记叙关键配置和脚本内容。假如各位朋友想了解各软件详细配置建议查阅官方文档。

 

需求分析:

1.整体需求:搭建一个高可用的网站服务器集群,能承受高并发请求,能抵御一般的网络攻击,任何一台服务器的退服不影响整个集群的运作,并且能对各服务器的运行情况作出实时监控。

2.详细需求分析:

根据需求,计划根据以下拓扑搭建运行环境:

 

二 详细功能描述:

1. 前端服务器采用 nginx 实现反向代理和负载均衡,用 keepalive 实现 HA。此部分由 centos1 和 centos4 实现,centos1 作为主服务器,centos4 作为热备服务器。Nginx 会根据不同的请求 ip 机会均等地把请求发送到后端两台服务器,并且以 ip hash 的方式保持各个 ip 的会话。

2. 后端服务器构建在 centos2 与 centos3 上,采用 apache 作为 web 发布软件,mysql 作为数据库,测试网页用 Django 来实现。两台服务器的数据库能够自动同步。

3. 作为热备服务器,centos4 在 centos1 没有故障时并没有业务流量,处于相对空闲的状态,因此在 centos4 上配置 nfs 使它成为文件共享服务器,网站文件放在这台服务器上。

4.centos5 作为监控服务器,运行 nagios 监控各服务器状态。出现告警时通过告警通知管理员。另外 centos5 还作为 saltstack 的服务器,其他主机的软件安装、文件传输、命令运行等操作均通过 saltstack 批量实现。

 

三 总体部署描述:

1. 各个服务器均安装 centos6.4  64 位版本,采用 cobbler 实现批量自动安装。

2. 各个软件均安装最新的稳定版,centos 自带的软件也要进行升级,例如 python,Centos 自带的版本比较久,会影响 Django 的运行。

 

四 详细部署描述:

1.nginx 设置

Nginx 在这里的作用主要是反向代理、作为用户以及服务器之间的缓存、以及以负载均衡的方式把请求发送到后端两台服务器。

采用编译安装的方式安装 nginx,具体过程就不在此记述了,不过为了更好地抵挡入侵,建议编译前修改一下安装文件,使入侵者难以查出 nginx 的版本号,修改安装文件中的 nginx.h,把相关字段修改如下:

 

Nginx的配置文件如下:

 

因为后端测试网页是用 Django 写的,因此 nginx 就不用处理 php 等动态网页的请求了。

设置完毕后,把 nginx 设置为开机启动,可以用如下方式:

 

2.Keeplive 设置

Keeplive的作用是在两台服务器(centos1centos4)之间,以 VRRP 协议实现 HA。通过虚拟出一个Virtul IP(本例子中是192.168.48.138)来对外发布业务。两台服务器中的任一台退服了,keeplive 会自动把业务转到另一台上。在这里 centos1 是主服务器,centos4是备用服务器。平时的数据流量只会通过 centos1,只有centos1 退服了,数据流量才会割接到 centos4 上。

centos1上的 keepalive 配置:

 

对于从服务器centos4,只需要把以上配置文件的部分内容修改即可:

 

同样,配置好配置文件后,把 keepalive 添加到开机启动中。

对于 keepalive,由于是使用VRRP 协议来检查对端是否在线的,只要对端能 ping 通,那么 keeplive 就会认为对端在线。但也有一种情况是对端服务器没有宕机,但 nginx 出错关闭了,这种情况下 keepalive 仍然会判断对端在线,不会把业务割接到备用服务器。因此我们需要在服务器上运行一个脚本,监控 nginx 进程的状态。假如 nginx 进程关闭了,先尝试重启 nginx,无法重启时就关闭keepalive 的进程,使业务割接到备用端。脚本如下:

 

把这个脚本放在 centos1 上,设置开机后于后台运行:

 

由于脚本中的 while 会不断循环下去来检查进程运行情况,因此没必要添加进计划任务。不过谨慎起见,防止脚本意外停止,也可以在计划任务中设置每 30 分钟运行一次。

 

3.后端 Web 服务器设置

后端 web 服务器运行在 centos2centos3 上,采用 apache 搭建,测试网页使用 Django 编写,网页文件存放在共享文件服务器 centos4 上,分别挂载在本机的 /var/www/html 目录。

saltstack 批量在两台服务器上安装 apacheapache-develwsgiDjangomysql 以及升级python,过程省略。

部署好运行环境后,修改一下 apache 的配置文件(http.conf),把运行用户名和组名改为apache,根目录指向/var/www/html

接下来设置 mysql,把两台服务器的mysql 设置互为主从,使得其中一台服务器的数据库变更了,马上同步到另一台,保证两台服务器的数据一致。设置步骤如下:

首先设置centos2

打开 centos2mysql的配置文件my.cnf,作如下修改:

 

然后以 root 身份登陆 mysql,执行下面命令:

 

这命令的含义是,在 10.0.0.3 机器上建立一个 test 用户,用户密码为 test123,这个用户拥有对centos2 上所有数据库的所有表同步到centos310.0.0.3)的权限。

然后执行:

show master status;

可以看到以下信息:

 

记录好这个信息,然后以 root 身份登陆 centos3mysql,执行下面的命令(有一点需要注意,假如同步之前需要同步的数据库不是空的话,需要先在数据库上加上读锁,把主服务器的相关数据库导入到从数据库中):

 

上面的 master_log_filemaster_log_pos的信息就是之前 centos2 上执行 show master status 命令后所显示的信息。执行 show slave status; 命令,查看一下 centos3 是否已经成功成为从服务器:

 

可以看到 centos3 的 mysql 已经成为 centos2(10.0.0.2)的从服务器了。至此 centos3 的 mysql 已经能主动同步 centos2 的数据了,我们只需要把以上操作在 centos3 上操作一次(先修改 my.cnf,其中 server-id 要设为 2,然后再执行创建用户以及授权命令),就能实现两个数据库互为主从,相互之间自动同步。

 

4. 共享文件服务器 nfs

本环节中,我们需要把 centos4 配置成共享文件的服务器端,后端两台 web 服务器的网页内容将放在共享文件服务器上,以此保证两台 web 服务器的网页文件内容一致。

 

nfs 在 centos6.2 上默认已安装,我们首先在 centos4 的 /etc 目录下新建 exports 文件,加入以下内容:

 

然后在 centos4 上一步步执行下面的命令:

 

关于共享目录的权限设置,由于后端两台 web 服务器的 apache 都是以 apacheapache 这个用户来执行的,文件的读写也是通过这个用户,因此为保证数据安全,共享目录只开放权限给这个用户即可,其他用户一律什么权限都不给予。另外还要把共享文件夹的所属者设为 apache:apache 这个用户。

接下来到 centos2centos3 两台 web 服务器上作如下设置,使它们开机时自动加载共享目录:

 

上面选项中 hard 表示网络短暂中断时会继续尝试连接服务器,并且不会显示错误信息;

bg表示执行 mount 时如果无法顺利 mount 上时,系统会将 mount 的操作转移到后台并继续尝试 mount,直到mount 成功为止;

nfsvers=3表示采用第 3 版的nfs

 

5.nagios设置

监控软件安装在 centos5 上,负责监控其他 4 台服务器的情况,出现异常时发出邮件给管理员进行警报。

 

安装过程:需要在 centos5 上安装 nagiosnagios 插件包、nrpeapache(用于搭建监控网页)、pnp(用于生成监控数据的分析图表)。4台被监控的主机需要安装 nagios 插件包以及nrpe,详细安装过程这里省略。

以下项目是对于 4 台服务器都需要监控的:

1.Check Swap:监控交换分区的剩余空间

2.Check Zombie Procs:监控僵尸进程的数目

3.Total Processes:监控总进程的数目

4.check-no_alowed_user:监控是否有非允许的用户登陆

5.check-system-load:监控系统负载

 

对于 nagios 的工作原理,简单来说就是:在服务端的 nagios 目录下的 services.cfg 文件上定义需要监控各个客户端的哪个监控项目,对应的监控脚本被放在客户端执行,执行结果通过客户端上的 nrpe 守护进程反馈给 nagios 服务器端。

默认情况下监控脚本返回的值所代表的的含义如下:

OK—退出代码 0—表示服务正常地工作。

WARNING—退出代码 1—表示服务处于警告状态。

CRITICAL—退出代码 2—表示服务处于危险状态。

UNKNOWN—退出代码 3—表示服务处于未知状态。

 

因此,要实现上述 5 个监控项目,首先修改 nagios 服务器端(即 centos5)上的services.cfg 文件,添加上以下内容:

 

以上写出了描述 centos1 监控服务的描述,其他 3 台服务器的描述都是一样的,只是 host_name 不一样,限于篇幅,这里就不把剩余部分列出了。

接下来修改客户端的设置,同样以 centos1 为例,修改 nagios 目录下的 nrpe.cfg 文件,添加以下内容(部分内容默认已经存在的,修改的时候需要注意有没有重复):

 

上面这 5 个命令对应的脚本中,check_no_allowed_user.py 是我编写的脚本,另外 4 个是 nagios 自带的。check_no_allowed_user.py 的作用是检测是否有允许用户以外的用户登录系统。使用方法是脚本后面加上选项 -a,然后添加允许登录的用户列表(格式是 -a user1,user2…,root 默认已添加到允许列表,因此无需添加 root)。当允许用户列表以外的用户登录时,将会触发 nagios 的 critial 告警。这个脚本的内容如下:

 

另外,对于 centos1centos4 两台前端服务器,还需要添加 2 项监控服务:

80port:监控 80 端口的情况

CheckNginxState:监控 nginx 进程是否启动

 

同样,以 centos1 为例,修改 centos5 上的services.cfg,添加上以下内容:

 

然后修改 centos1 上的nrpe.cfg,添加上以下内容:

 

这里的 check_nginx.sh 也是我自己编写的脚本,脚本内容如下:

 

对于 centos4 这台共享文件服务器,还需要增加一个监控项目,监控硬盘的容量大小,这里可以用 nagios 自带的 check_disk 脚本,方法和上面一样的,这里就不在叙述了。

对于作为后端 web 服务器的 centos2centos3,也很有必要监控服务器上apache 以及 mysql 是否正在运行。监控脚本很简单,只需要把上面 check_nginx.sh 中“a=`ps -C nginx –no-header |wc -l`”修改一下,把“nginx”替换为“httpd”和“mysqld”即可。

最后,客户端都设置好监控设置了,作为服务器端,也可以为 centos5 增加监控内容,服务器端的监控脚本同样放在服务器端的 libexec/ 下,监控服务是在 localhost.cfg 中定义的。

谨记添加自己写的脚本后要把用户改为nagios:nagios,并且增加执行权限。

最终配置完毕后,打开 nagios 监控页面的效果图如下:

 

6、安全设置

为了减少 ssh 密码被暴力破解的风险,在各个服务器上把 ssh 端口从默认的 22 端口更改为其他端口(本例子中改为 2002),并且在 /etc/hosts.allow 中指定允许 sshd 通信的 ip,在 /etc/hosts.deny 中添加 sshd:ALL

考虑到服务器都是在内网环境,已经能隔绝外网的很多攻击,并且开启防火墙的话会影响服务器之间数据转发速度,因此我在这 4 台服务器上都关闭 iptables,仅在 centos5 上开启。在实际生产环境中,依靠在集群前面的防火墙对集群进行进一步保护。

centos5 的 iptables 脚本如下:

 

结语:

最后我用 apache benchmark 测试了一下网站。虽然是在虚拟机环境,测试数据没多大参考价值,但是通过测试也可以看看在高并发的环境下,那些服务器负荷最大。经测试,在 100 并发的环境下,虽然网页还能打开,但是 nagios 已经失去了后端两台 web 服务器的响应,提示 request timeout 了,其他两台服务器的负载还是很低,说明在高并发的环境下,后端的 web 服务器负荷最大,也是重点需要优化的对象。

这个实验环境存在一个不足,那就是共享文件只放在一台服务器上,容易造成单边,建议条件许可的情况下可使用分布式存储系统,例如MFS

另外在搭建实验环境的过程中还有 2 点待日后跟进:

1、优化 apache 的性能,让后端服务器能应付更大并发。

2、Mysql 的主从同步存在延迟问题,可能会导致主、从数据库不一致。这个查看网上资料可以通过插件来解决,下一步尝试接触这些插件的使用方法。

 

 

 

 

原文链接:https://www.cnblogs.com/cjyfff/p/3553579.html

正文完
 
追风者
版权声明:本站原创文章,由 追风者 2024-01-02发表,共计5444字。
转载说明:声明:本站内容均来自互联网,归原创作者所有,如有侵权必删除。 本站文章皆由CC-4.0协议发布。