码迷,mamicode.com
首页 > Web开发 > 详细

Web服务器集群搭建

时间:2015-10-28 01:44:46      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:网站服务器   web服务器   运行环境   数据库   网络攻击   

前言:本文记述了搭建一个小型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_VERSION      "1.0" NGINX_VER          "webserver" NGINX_VERSION

 

Nginx的配置文件如下:

技术分享

212800
    default_type  application/octet- zone=20;  
    send_timeout 20;  
    client_body_buffer_size 1k;  
    client_header_buffer_size 1k;  
    large_client_header_buffers 2 1k; 
    server_tokens off;  
    client_body_timeout 20;  
    client_header_timeout 20; 
        ip_hash;           
        server 10.0.0.3;     
        server 10.0.0.280///100;     
            limit_rate 500k;         500 502 503 504  /= /

技术分享

 

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

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

echo “/usr/local/nginx/sbin/nginx” >>/etc/rc.local

 

2.Keeplive设置

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

centos1上的keepalive配置:

技术分享

! Configuration File @test.com       @127.0.0.130
    virtual_router_id 51192.168.48.139   
    priority 100    
    advert_int 1    1111192.168.48.138

技术分享

 

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

192.168.48.14090

 

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

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

技术分享

=`ps -C nginx --no-header |wc - ((nginxStatus==0/usr/local/nginx/sbin/=`ps -C nginx --no-header |wc - ((nginxStatus==0/etc/init.d/  
         
        keepaliveStatus=`ps -C keepalived --no-header |wc - ((keepaliveStatus==0/etc/init.d/5

技术分享

 

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

echo “nohup ~/nginxStatus.sh &”>>/etc/rc.local

 

由于脚本中的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,作如下修改:

技术分享

-bin=MySQL-bin  server-id=1  binlog-ignore-db=-ignore-db=information_schema

技术分享

 

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

grant replication slave on *.* to ‘test’@’10.0.0.3’  identified ‘test123’;

 

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

然后执行:

show master status;

可以看到以下信息:

技术分享

 

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

=‘10.0.0.2===‘MySQL-bin.000070=106;

 

上面的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文件,加入以下内容:

/home/apache/html 10.0.0.2(rw,sync)  /home/apache/html 10.0.0.3(rw,sync)

 

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

技术分享

-g apache -s /sbin/-p /home/apache/chown -R apache:apache /home/apache/-R 700 /home/apache/--level 35

技术分享

 

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

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

echo >>/etc/rc.local

 

上面选项中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文件,添加上以下内容:

技术分享

--!check_no_allowed_user 
        notifications_enabled           1       
        flap_detection_enabled          0       
        notification_options            w,c,r   
        notification_interval           5       
        notification_period             24x7    -service,services-pnp -system-!105-service,services-!105-service,services-!105-service,services-!105

技术分享

 

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

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

技术分享

command[check_swap]=/usr/local/nagios/libexec/check_swap -w 20% -c 10% command[check_load]=/usr/local/nagios/libexec/check_load -w 1.8,1.5,1.2 -c 2.5,2,1.8=/usr/local/nagios/libexec/check_procs -w 5 -c 10 -=/usr/local/nagios/libexec/check_procs -w 150 -c 200=/usr/local/nagios/libexec/check_no_allowed_user.py –a cjyfff

技术分享

 

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

技术分享

 
     
     3= os.popen().read() 
                             
                             
    b = list(a.split(= =  i<len(b)-1 += 1= = list(args.split())  
    allowedList.append()         
    
    rs = [user  user  userList  user   allowedList] 
    

     % = getopt.getopt(sys.argv[1:], , [,  o,r  o  (,  o  (, 
        CheckUser(r)

技术分享

 

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

80port:监控80端口的情况

CheckNginxState:监控nginx进程是否启动

 

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

技术分享

-service,services-80 -

技术分享

 

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

command[check_nginx]=/usr/local/nagios/libexec/check_nginx.sh

 

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

技术分享

use_age= (($
    echo 3=`ps -C nginx --no-header |wc - ((a!=002

技术分享

 

对于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脚本如下:

技术分享

!iptables ------A INPUT -i lo --A OUTPUT -o lo --A INPUT -p icmp -j ACCEPTiptables -A INPUT -s 192.168.48.139 --A INPUT -s 192.168.48.140 --A INPUT -s 10.0.0.2 --A INPUT -s 10.0.0.3 --A INPUT -p tcp -m multiport --dport 22,80 -/etc/rc.d/init.d/iptables save

技术分享

 

结语:

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

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

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

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

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

Web服务器集群搭建

标签:网站服务器   web服务器   运行环境   数据库   网络攻击   

原文地址:http://dulinux.blog.51cto.com/10803129/1706902

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!