梁 剑,石岩岭
(1.太原工业学院计算机工程系,山西太原030008;2.山西大同大学网络信息中心,山西大同037009)
随着互联网的普及,越来越多的个人、机构、企业接入互联网。对于一些机构和企业来说,建设网站可以展示自身,开展相关业务,这几乎是当前这个时代必不可少的部分。
对于这些网站来说,首先,应该要有较高的可靠性,在成本允许的范围内减少一年中的故障时间。除了选择可靠性高的服务器、磁盘阵列外,提高可靠性最有效的方法是使用双机或多机热备份。
其次,要有较高的安全性,安全性包括保密性、完整性、和可用性。保密性就是要确保重要信息不被非授权地窃取,这主要依赖于软件系统的设计与实现;完整性要确保信息不被伪造、篡改、删除以及意外丢失,这除了软件系统的设计外,在服务器上可以通过双机备份,异地数据备份实现;服务器上的可用性主要体现在能抵抗各种类型的拒绝服务攻击(Denial of Service)。
第三,服务器架构应具备可伸缩性,对于企业或机构来说,初期可能业务量少,用户访问量少,需要的服务器性能也低,随着时间的推移,更多的用户访问,需要更强的服务器能力。这时需要增加服务器来分担用户访问负荷,这一过程中架构不应有大的调整,特别是软件部分不应有大调整,因为软件的重新开发需要消耗大量的人力。
架构如图1所示,服务器类型分为反向代理服务器、Web 服务器、数据库服务器。对于初期小型网站来说,可以根据情况将这三种类型的服务器部署到一台物理服务器上,以节约成本。当需要扩展时,将其分布到多台物理服务器上。
图1 网站架构图
目前在网站建设中最常见的操作系统是Linux和Windows Server系统,Linux的优点体现在它是开源免费的软件,不需要额外支付软件许可费用。同时多数服务器软件如Redis、Nginx、MyCat 等在Linux 平台上有更好的表现。Windows 的优势主要体现在其操作日常人们的操作习惯类似,没有特殊情况应选择Linux操作系统。
多数支持HTTP协议的Web服务器都能支持反向 代 理(Reverse proxy),如 Nginx、Apache、Squid、Lighttpd 等,其中Nginx 拥有更好的性能、内存占用少,特别是Nginx 社区比较活跃,软件功能模块也多,特别是在高并发情况下比Apache 有更好的性能[1-2],所以推荐使用Nginx。
Web 服务器的选择更加依赖于软件架构的设计,目前常见的后端开发技术有PHP、Java 等,如果使用PHP开发可以选择php-fpm或者Apache,如果使用Java技术,多使用Tomcat。
对于中小型网站来说,多使用免费的MySQL作为数据库,当然也可以根据实际情况使用Oracle、PostgreSQL等。
配置如下所示,在根的位置(/)将所有的请求转发到反向代理abc(upstream abc)上,可根据实际情况调整,比如将静态的HTML 和JPEG 调整到特定的服务器上。要注意根据软件的情况将HTTP报头传到后端,主要配置如下所示:
反向代理可以HTTP请求分配后多个后端服务器上,达到负荷分担的效果。同时,如果某个服务器发生故障,会被剔除出去,实现多机热备份的功能[3]。Nginx有多种负荷均衡方式,默认情况下采用轮询的方式,另外还可以使用ip_hash 和权重等方式。特别要注意的是除了采用ip_hash 方式,其他的方式会导致同一用户的请求分配到不同的服务器上,这时应考虑使用Session共享技术,保证数据的正确性[4]。
当有多台web 服务器时,需要保证文件内容的同步。Unison 是一个多平台上的文件同步工具,能够自动完成两台服务器目录文件的同步,它支持SSH、RSH 和Socket 等多种网络协议的同步。Unison 安装后会在用户目录下生成一个名为.unison 的隐藏目录,在其中存放配置文件、日志文件等。
default.prf是其配置文件,关键配置如下:
root=/home/data/www/ #本地目录
root=ssh://user@10.1.1.3//home/data/www/ #远程目录
fastcheck=true #是否快速检查
如果是快速检查,unison 会根据文件生成的时间来确定版本的先后,是否需要同步。否则会对比两个文件的异同,多数情况下使用快速检查即可。
配置好后利用,利用cron 计划任务定期调用unison 即可,要注意非快速检察花费时间非常长,不适合频繁调用。
对于一般的中小型网站推荐使用免费的MySQL 数据库,主从复制就是一台MySQL 数据库服务器担任主服务器(Master),多台服务器担任从服务器(Slave),可以向主服务器中读或者写数据,但只能对从服务器执行读操作。从服务器根据主服务器发来的日志信息,和主服务器保持同步[2]。但这种同步是非实时的,比如向主服务器写入一条数据,立刻读从服务器,不会得到更新后的数据,这是开发软件的人员要注意的地方。
因为从服务器是依赖主服务器的日志才能更新数据库,因此要打开日志
log-bin=mysql-bin//二进制日志名
binlog_format=mixed//日志格式为混合
server-id=1 //设置server-id
接着创建一个用于复制的账号,同时分配权限。
GRANT replication slave ON *.* TO 'slave'@'%'IDENTIFIED BY'password';
查看主服务器的日志状态,并记录日志位置,然后在从服务器上将日志调整到与主服务器相同的位置即可。
数据库实现主从复制后,这对软件开发者不是透明的,因为写数据是一个服务器,读数据又是另一个服务器,那么可以使用数据库中间件技术屏蔽这些差别。MyCat 就是其中的佼佼者,它能够实现分库分表,读写分离,故障服务器剔除等。软件开发者将不再需要考虑读写分离的软件实现。MyCat 配置的主文件是server.xml
在其中添加一个读服务器一个写服务器,主要配置如下:
如果要进行分表操作,可以在schema.xml配置。
使用Nginx 反向代理,可能会出现同一用户的请求分发到不同的服务器上,这样必须保证用户数据的一致性。储存在数据库的数据是多台服务器共享的,不会出现不一致的情况,而用户的session数据是在服务器上存储,不能多机共享,因此反这种情况必须实现session 共享。现在常见的是使用缓存数据库如Redis、Memcache。相对来说Redis功能比较丰富,除了支持Key/Value类型的数据外,还支持list、set、hash等数据类型,另外redis还能把数据持久化到硬盘中。Memcache 的只能将K/V 类型的数据存在内存中,程序异常结束将失去所有数据。
这里我们以Memcache+PHP 为例,实现安装好Memcache,以及PHP 中的 Memcache 模块,在 PHP的配置文件PHP.ini中完成如下配置
session.save_handler=memcache
session.save_path="tcp://10.1.1.12:11211"
传统的网站中,为了提高性能使用更多CPU、更大内存、更强的磁盘阵列的小型机,这无疑会使网站初期就要投入大量成本。使用多台普通服务器搭建网站能够实现高可靠性、高性能以及易拓展性,这种方案更加适合于中小型网站的建设。