本帖最后由 justgonnab 于 2018-3-8 17:36 编辑
在一个新的B/S系统上线时,往往会遇到很多问题。这次分享就关于系统大并发访问量做一个小窍门技术分享。
最常见的问题就是:系统上线,用户大量访问,没几分钟网页就挂了,从而影响业务的持续性。而这种问题通常是由于web服务器没有根据实际环境调试优化到最佳状态而导致的。但是,没有负载均衡的网站集群不是真正的集群,所以在负载均衡+Web服务器调优都齐活的情况下还不断的出现状况那就真的没辙了……只能另辟蹊径!
之前应该分享过Nginx做负载均衡的相关文章,而且根据具体的项目,会出现各种各样的状况,比如针对java编写的B/S系统在有session存在时并且前端有代理集中访问的情况,负载均衡服务器就无法很好的驾驭了,因为源地址都是代理服务器的地址,实际用户的地址都被掩盖导致负载均衡服务器无法分辨、无法实现均衡地负载。
首先我们需要分析高并发访问量过后web服务器宕机会出现什么样的结果,通过什么标识来判断? 所以自动化运维的脚本实现的功能要模仿用户无法访问系统时的样子,比如:web服务器宕机后访问网页后HTTP响应状态应该返回的是非“200”,那么这个情况基本上就是用户无法访问网页时的情况了。若是用测试端口或者ping测试都是不准确的。
Linux系统中利用wget命令则可以很简单地实现这样的判断效果: 如:wget -S --spider --tries=3 --timeout=3 http://localhost:8080 2>&1 | grep HTTP/1.1 |awk '{print $2}' 筛选出来的数字就是HTTP状态代码,然后利用判断语句判断是否是“200”就知道web服务器是否正常。
大致的核心思路就是这样:判断web服务器是否正常(以tomcat为例),如果正常则不操作,若无法访问则重启web服务器。 附一段具有启发性的代码吧:
- # 获取tomcat进程ID /usr/local/tomcat_ds_api
- TomcatID=$(ps -ef |grep tomcat |grep -v 'grep'|awk '{print $2}')
- # tomcat启动程序(这里注意tomcat实际安装的路径)
- StartTomcat=/usr/local/tomcat/bin/startup.sh
- StopTomcat=/usr/local/tomcat/bin/shutdown.sh
- TomcatMonitorLog=/tmp/tomcatmonitor/TomcatMonitor.log
- Monitor()
- {
- echo "[info]开始监控tomcat...[$(date +'%F %H:%M:%S')]"
- if [[ $TomcatID ]];then # 这里判断TOMCAT进程是否存在
- echo "[info]当前tomcat进程ID为:$TomcatID,继续检测页面..."
- # 检测是否启动成功(成功的话页面会返回状态"200")
- TomcatServiceCode=$(wget -S --spider --tries=3 --timeout=3 http://localhost:8080 2>&1 | grep HTTP/1.1 |awk '{print $2}')
- if [ "$TomcatServiceCode" = "200" ];then
- echo "[info]页面返回码为$TomcatServiceCode,tomcat启动成功,测试页面正常......"
- else
- echo "[error]tomcat页面出错,请注意......状态码为 $TomcatServiceCode"
- echo "[error]页面访问出错,开始重启tomcat"
- echo "停止tomcat!"
- $StopTomcat
- sleep 6
- echo "启动tomcat!"
- $StartTomcat
- fi
- else
- echo "[error]tomcat进程不存在!tomcat开始自动重启..."
- echo "[info]$StartTomcat,请稍候......"
- $StartTomcat
- echo "启动命令执行完成!"
- fi
- }
复制代码
然后写好代码,chmod 755 文件名,sh 文件名 进行测试。
需要定时检测的话可以利用Linux自带的cron工具,这样系统定期检测Web服务器有问题就会自动重启恢复正常,然后配合负载均衡在Web服务器重启期间切换到其它Web服务器继续正常提供Web服务,这样就可以暂时缓解高并发访问所带来的苦恼了。
代码很简单,思路很重要,后面的细节就不用多讲了,希望对大家的Linux Web运维有所帮助! |