5月6日-5月15日期间因投票活动的开展,此次活动给网站带来了前所未有的访问量,由于投票系统防作弊措施的不健全,造成了大量用户使用切换IP刷票软件,再加上恶意用户时而对网站发送大量CC攻击,网站的硬件服务架构与应用程序的设计面临了巨大的挑战,网站硬件服务架构总体表现比较良好,服务器方面采用前端反向代理服务器+Nginx(FastCGI)后端服务器+数据库服务器,前端反向代理服务器缓存了用户访问的静态资源(图片、CSS样式、通过后端服务器伪静态化而静态化的HTML等),当用户请求动态程序文件或对数据库操作时前端反向代理才将该请求服务交给Nginx(FastCGI)后端服务器或数据库服务器。其中的反向代理服务器对后端服务器伪静化应用而生成静态化的HTML文件而减少了大量的数据库查询操作,提高了网站整体的性能。但投票系统在开发时,开发人员因只着重其功能的实现而疏忽了应用程序与数据表的最佳设计方式,导致了网站发生了不必要502 Bad Gateway错误。
经过对多个站点的访问测试否定了前端反向代理服务器的问题。其502错误就是Nginx与PHPFastCGI并行运行时,Nginx运行正常而PHPFastCGI发生了假死,进程无法处理而导致的,还得查看究竟是哪一问题造成FastCGI无法处理应用的;并发很高、CPU不够、FastCGI进程数设置影响等,其实这一切都是PHPFastCGI处理时所产生的,需抛开对Nginx的怀疑。
进入后端服务器,根据系统监控命令发现大量的php-cgi进程CPU占有率比值很高,再经过仔细排查,后端服务器也不存在直接性影响问题,而进入数据库服务器发现MySQL占用CPU资源也比较高,经过对MySQL的监控,发现用户大量的等待数据返回,SQL语句存在效率问题,某字段未加索引,造成了大量数据的查询等待与写入等待,导致了表锁,服务器CPU资源耗尽,从而数据库服务器无法正常返回数据与后端服务器,造成后端服务器php-cgi无法正常处理,对该字段增加索引后,后端服务器与数据库服务器负载恢复正常,502错误也从此消失。