目录[-]
随着Web站点访问量的不断提高,Web服务器处理请求的压力将会日益增大,进而影响到Web站点的性能。当单台Web服务器所能承受的压力到达极限时,就需要有更多的服务器来分担工作,将流量合理转移到更多的服务器上。本文主要介绍通过LVS来组建服务器集群,同时配置反向代理服务器实现Web页面的动静分离,以满足高并发、高可用的生产环境要求。
补充说明:Apache部分亦可以用Nginx替换,具体情况可结合实际生产环境考虑。
机器清单列表:
两台LVS服务器,两台反向代理服务器,两台静态内容缓存服务器,两台动态请求处理服务器,具体用途说明详见下表。
组件 |
IP地址 |
用途 |
虚拟Web服务器 | 192.168.85.10 | 虚拟IP,高性能Web站点的访问入口 |
Master主服务器 |
192.168.85.80 |
均衡调度Web请求 |
Backup备份服务器 |
192.168.85.81 |
双机热备,保证LVS的可用性和稳定性 |
Nginx |
192.168.85.90 |
zone A的反向代理,记录接入访问操作 |
Nginx |
192.168.85.95 |
zone B的反向代理,记录接入访问操作 |
Varnish + Apache |
192.168.85.91 |
缓存zone A的静态页面 |
Varnish + Apache |
192.168.85.96 |
缓存zone B的静态页面 |
Apache + PHP-FPM |
192.168.85.93 |
处理zone A的动态请求和跳转规则 |
Apache + PHP-FPM |
192.168.85.97 |
处理zone B的动态请求和跳转规则 |
说明:
(1) zone(区域)可以代表为机柜、交换机甚至是数据中心,将站点架设在不同的zone上,是出于容灾的考虑,以此减小Web站点因单点故障而造成无法访问的风险;
(2) 使用nginx作为纯粹的反向代理服务器,将静态页面的访问请求交给Varnish,动态请求交给Apache处理,nginx本身只负责记录请求访问的接入状况以及wap请求的跳转;
(3) 静态资源模块选用Varnish做cache缓存,与传统的Squid相比,Varnish具有性能更高、速度更快、管理更方便等诸多优点,分析如下:
第一, 稳定性更高,在同等负荷的压力下,Squid发生故障的几率要比Varnish高,Squid需要经常重启;
第二, 访问速度更快,Varnish采用了“Visual Page Cache”技术,缓存数据直接从内存读取,内存管理和回收的机制健全,当缓存内容超过内存阈值时,内核会自动将一部分缓存存入swap中让出内存,从而避免了频繁地在内存和磁盘之间进行文件交换;
第三, Varnish便提供了一个命令行的状态监控程序varnishstat,从整体上了解Varnish的命中率和缓存状态,对缓存性能调优有很大的帮助;
第四, 相比Squid而言,Varnish可以通过管理端口,使用正则表达式快速、批量地清除部分缓存。
然而,其弊端还是比较明显的:
第一, Varnish在高并发状态下CPU、I/O和内存等资源开销都高于Squid;
第二, Varnish进程一旦挂起、崩溃或者重启,缓存数据都会从内存中完全释放,此时所有的请求都会被发送到后端服务器,在高并发情况下,这会给后端服务器造成很大压力;
第三, 重启Varnish后,在上线前需要重新计算请求数据,预热缓存。
(4) 动态请求模块,采用Apache和PHP-FPM相结合,以FastCGI模式运行PHP,其好处在于:
第一, 具有灵活性和可扩展性,在Web服务器和具体CGI程序之间建立了一个智能可持续的中间层,把PHP动态语言和Web服务器分离开来,Web服务器只需将请求提交到中间层,再由中间层分配到若干个可服用的CGI程序实例中,一方面便于大规模的扩展和改进安全性,另一方面避免了进程反复地fork,根据不同的状况fork或者回收实例,达到灵活性和稳定性兼得的目的;
第二, 出现故障时,可以更好地定位到是Web服务器还是PHP的问题,当PHP出错时不会搞垮Web服务器,将PHP进程kill掉以后便立即重新启动一个新的PHP进程替代;
第三, 可以通过中间层的控制和探测机制来监视实例的运行情况,根据实际的应用进行合理配置达到最佳效果。
系统环境:CentOS6.4 x86_64,内核:Linux version 2.6.32-358.el6
… top_dir = /usr/lib64/httpd … |
... LoadModule fastcgi_module modules/mod_fastcgi.so ... |
DirectoryIndex index.html index.shtml index.cgi index.php AddHandler php5-fcgi .php Action php5-fcgi /php5-fcgi Alias /php5-fcgi /var/www/cgi-bin/php5-fcgi FastCgiExternalServer /var/www/cgi-bin/php5-fcgi -idle-timeout 60 -host 127.0.0.1:9000 -pass-header Authorization |
… #Listen 12.34.56.78:80 Listen 8080 … |
backend default { .host = "127.0.0.1"; .port = "8080"; } |
upstream backend { server 192.168.85.90; } server { listen 80; server_name 192.168.85.91; # 静态缓存 location / { proxy_pass http://backend; } # 动态请求 location ~ \.(php)?$ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http:// 192.168.85.93; } } |
! Configuration File for keepalived global_defs { notification_email { [email protected] [email protected] } notification_email_from [email protected] smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER # 备份服务器上将MASTER改为BACKUP interface eth0 # HA监测网络接口 virtual_router_id 51 # 主、备机的virtual_router_id必须相同 priority 30 # 主、备机取不同的优先级,主机值较大,备份机值较小 advert_int 1 # VRRP Multicast广播周期秒数 authentication { auth_type PASS # VRRP认证方式 auth_pass 1111 # VRRP口令字 } virtual_ipaddress { 192.168.85.10 # 如果有多个VIP,继续换行填写 } } virtual_server 192.168.85.10 80 { delay_loop 2 # 每隔2秒查询realserver状态 lb_algo rr # lvs 算法 lb_kind DR # Direct Route persistence_timeout 50 # 同一IP的连接50秒内被分配到同一台realserver |
DEVICE=lo:0 IPADDR=192.168.85.10 NETMASK=255.255.255.255 ONBOOT=yes NAME=loopback |
显示varnish和客户端之间的通信(忽略后端web服务器): # varnishlog -b 显示varnish接收到的HTTP头信息(既有客户端请求的,也有web服务器响应的): # varnishlog -c -i RxHeader 只显示web服务器响应的头信息: # varnishlog -Dw /var/log/varnish.log 从/var/log/varnish.log中读取所有日志信息 # kill `cat /var/run/varnish.pid` 这个命令会从/var/run/varnish.pid中读取varnish的主进程的PID,并给这个进程发送TERM信号,从而关闭varnish。 |
HTTP/1.1 200 OK Server: nginx/1.0.15 Date: Tue, 30 Jul 2013 05:58:21 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive Last-Modified: Sun, 28 Jul 2013 19:30:16 GMT ETag: "bff82-16-4e29767d7c8be" Content-Length: 22 Accept-Ranges: bytes X-Varnish: 810334599 Age: 0 Via: 1.1 varnish |
HTTP/1.1 200 OK Server: nginx/1.0.15 Date: Tue, 30 Jul 2013 06:00:23 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive X-Powered-By: PHP/5.3.3 |
http://my.oschina.net/alanlqc
https://www.varnish-cache.org/installation/redhat
https://www.varnish-cache.org/docs/3.0/
http://blog.csdn.net/poechant/article/details/7256184
http://blog.yunvi.com/html/797.html