记一次博客被群压的经历 精选 原创 小柒2015 2019-02-15 21:19:52 ©著作权 文章标签 openresty lua 限流 文章分类 运维 ©著作权归作者所有:来自51CTO博客作者小柒2015的原创作品,请联系作者获取转载授权,否则将追究法律责任 前言 前段时间,博客和论坛都放到的阿里云新购的三年 T5 实例服务器上,等都转移过去才发现,所谓的 T5 实例只能满足10% 的 CPU 峰值。期间经历了各种卡顿、死机,最终又把博客单独迁移了回来。静态文件走 CDN,文章都 Redis,以为万事大吉了就。 群压 然并卵,有一天,群里有网友说要压测我的论坛,我说那肯定一压一个死,有本事来压我的博客啊,顺手便扔了博客网址,并@了全体人员。 然后,网友齐上阵,十八般武艺都拿出来了,有AB压测的,有使用 jmeter 测试的,更有甚者自己使用 Python、Java 写代码替我压测的,结果就是系统 CPU 爆表,访问博客陷入了漫长的等待。 分析 先说一下博客架构: Nginx + PHP-fpm + CND + Redis + RDS,静态文件走CDN,命中率基本在百分之八九十左右,动态请求走Nginx,然后交给 php-fpm 处理,博客文章进行了缓存处理,查询基本不会走数据库。 这里总结下原因,在网友压测的时候,登录系统,TOP 了一下,发现 PHP-fpm 进程 CPU 占比居高不下,毕竟1C1G的机器配置,相比于Nginx处理静态页面的能力,PHP-fpm 还是太弱鸡了,无论怎么优化,配置总会是瓶颈。 这里说明一下网友的压测,也就算是简单的流量攻击,其实就是模拟多个用户不停的进行访问(访问那些需要大量数据操作,就是需要大量CPU时间的页面),从而把服务压垮。 应对 其实对于压测这种场景,我们使用 OpenResty + Lua 限流就可以轻松解决。 编写 imit_req.lua 脚本: -- 平滑限制接口请求数 local limit_req = require "resty.limit.req" -- 这里我们使用AB测试,-n访问1000次, -c并发100个 -- ab -n 1000 -c 100 http://121.142.155.213/ -- 限制 ip 每秒只能调用 200 次 接口 ,burst设置为 0 则平滑限流 local lim, err = limit_req.new("my_limit_req_store", 10, 0) if not lim then ngx.log(ngx.ERR, "failed to instantiate a resty.limit.req object: ", err) return ngx.exit(500) end -- IP维度的限流 local key = ngx.var.binary_remote_addr local delay, err = lim:incoming(key, true) if not delay then if err == "rejected" then return ngx.exit(503) end ngx.log(ngx.ERR, "failed to limit req: ", err) return ngx.exit(500) end if delay >= 0.001 then -- the 2nd return value holds the number of excess requests -- per second for the specified key. for example, number 31 -- means the current request rate is at 231 req/sec for the -- specified key. local excess = err -- the request exceeding the 200 req/sec but below 300 req/sec, -- so we intentionally delay it here a bit to conform to the -- 200 req/sec rate. ngx.sleep(delay) -- 延时处理 end 导入 nginx.conf 配置: http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; lua_shared_dict my_limit_req_store 100m; lua_shared_dict my_limit_conn_store 100m; lua_shared_dict my_limit_count_store 100m; server{ listen 80; server_name blog.52itstyle.com; index index.php; root /mnt/domains/blog.52itstyle.com; location = /500.html { root /usr/local/openresty/nginx/html; } error_page 500 502 503 504 = /503/503.html; location ~ \.php$ { # 导入 lua 限流 配置 access_by_lua_file /usr/local/openresty/nginx/lua/limit_req.lua; fastcgi_pass 127.0.0.1:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } location ~ /\.ht { deny all; } } 划重点,脚本中: # 每秒访问超过2次就拒绝服务,跳转到503错误页面 limit_req.new("my_limit_req_store", 2, 0) 总结 我经常听卖锁具的人说:“再好的锁,也只防好人,不防坏人!”,同样适用于网络,网友也只是娱乐一下而已,如果真有坏人想搞你,有无数种办法把你搞死死。 参考 http://openresty.org/cn/ https://blog.52itstyle.vip/archives/3608/ 赞 收藏 评论 分享 举报 上一篇:我用Python爬取了妹子网100G的套图 下一篇:记一次生产数据库"意外"重启的经历 提问和评论都可以,用心的回复会被更多人看到 评论 发布评论 全部评论 () 最热 最新 相关文章 记一次挖矿病毒的溯源 客户打电话过来说,公司web服务异常卡顿。起初以为是web服务缓存过多导致,重启几次无果后觉得可能是受到了攻击。起初以为是ddos攻击,然后去查看web服务器管理面板时发现网络链接很少,但是cpu占用高达99%,于是便怀疑是中了挖矿病毒。 挖矿病毒 溯源技术 应急响应 记一次网络架构调整 一、说明公司K8S集群配置需要,需要重新调整网络结构网络架构:网络架构说明:是一台路由器,接一台交换机,下面串两台交换机路由器:192.168.10.2523台交换机:没有做任何配置(12、13、14机柜交换机)二、需求新集群需要复用老集群的3台机柜交换机新集群总体上包含多个单独子网的网段,每个网段中有一个集群新集群的master节点需要继续使用老集群中的两台ESXI服务器三、新架构拓扑思路说明: 网络架构 子网 单臂路由 记一次JVM堆外内存泄漏问题 一次由JVM堆外内存泄漏引发的POD重启问题的解决之路。 JVM 内存泄漏 堆外内存 POD重启 记一次被挖矿的经历 某某云产品,在之前双十一的时候做活动,没忍住,就买了两台,本着不浪费的原则,在上面搭了一套elastic search的环境,本地起kibana连接服务器上的ES,感觉还不错,其中也经历了几个坑,插播两个小知识点:服务器监听127.0.0.1和监听0.0.0.0有什么区别?如果应用监听在127.0.0.1只能本机客户端可以访问,外网不能访问,跟localhost是一样的。如果应用监听在0.0 java 记一次“大华”的面试经历 网友分享面试经历,面试问的知识点往往是企业最需要的开发者掌握的! java 集合类 spring java集合类 开发者 记一次 Google 面试经历 这是我上周去面试的地方。很顺利,我觉得——至少我认为我已经尽我所能,并且无论发生什么事情对我都是有帮助的。由于我签署了保密协议,所以我不能把他们问我的问题写出来。但是,我可以写我大概的面试过程,以及我做了哪些准备。首先,这是谷歌——所以我当然不会让我在那里工作的朋友不推荐我。我没有经过电话采访,因为我是“本地”的,所以我被直接邀请到公司面试。我个人认为,面对面绝对比电话面试好,我很幸运。首先,我和 Google 计算机 谷歌 软件工程师 一对一 记一次加湿器购买经历 最近流感太猖獗了!事情还得从前两周说起,天气变化无常,公司里感冒的人多了起来吧。我 社交网络 webgl regex datagridview layout 记一次网站被黑经历 问题原由早上突然接到客户电话,网站在微信中无法打开,被微信拦截在pc端访问网站,点击首页中任何一个url都会跳转到第三方网站,恍然大悟,网站是被***了问题分析发现网站head被加入一下代码js里面代码:(function(){/*百度推送代码*/varbp=document.createElement('script');bp.src='/push.zhanzhang.baidu.com/pus thinkphp php 网站被黑 记一次红队经历 记一次红队经历上学期临近考试周的一个下午,学校老师喊我和学弟参与一场红队活动,于是便有了下面的文章印象很深的 子域名 核心系统 中间件 特殊字符 官网 记一次接口优化经历 前言:最近接了一个导出接口的优化需求,原9000+数据导出秒数660+,优化后5S,特此记录一下优化方案以供大家一起讨论学习。本文先通篇列举一下优化 接口优化 数据 缓存 数据库 sql 记一次临时抱佛脚的性能压测经历 00 前因 几周前的一个周五,帮朋友忙,需要给个软件做压力测试,花了一晚的时间学习了下,然后就赶鸭子上架去做这个事了。 想着有时间把学习过程整理下,结果忘掉了。 今天欢哥问到我上次压测用了什么软件,才想起这个事,暂且整理下吧。 01 选型 一番调研后,先筛选了4个软件:Loadrunner、Jmet 其他 记一次云服务器被挖矿的经历 收到中毒邮件通知 收到通知后思前想后,也不知道问题在哪,第一次遇到这事…… 分析 一查这是个挖矿软件,遂进入该目录 crontab 是定时任务,打开一看是: curl 是下载命令,定时下载init.sh脚本,浏览器手动下载后,立马被火绒拦截。我把它救出来后打开脚本,正是下载病毒的: 查找原因 想了很 redis 搜索 定时任务 记一次失败的面试经历 记一次失败的面试经历 记一次 失败 面试经历 记一次失败的项目经历 最近因为疫情原因一直在家,已经有快半年没有更新博客了,最近返回公司上班之后,去年做的项目已经完结,虽然已成功交付用户使用,但是在我看来这仍然是失败项目,在这里我想回顾这些经历,算是给后面的自己一个警醒吧 为何说这是一个失败的项目 我一直认为这是一个失败的项目,原因有如下几点: 项目为能如期交付,原定 开发人员 测试人员 测试用例 记一次服务器被当肉鸡挖矿的经历 可能你的服务器也被人利用了! 服务器 redis 定时任务 远程控制 web服务 记一次真实的网站被黑经历 前言距离上次被DDOS攻击已经有10天左右的时间,距离上上次已经记不起具体那一天了,每一次都这么不了了只。然而近期一次相对持久的攻击,我觉得有必要静下心来,分享一下被黑的那段经历。在叙述经历之前,先简单的介绍一下服务器配置情况:ECS 1核2G内存1MB带宽,Linux系统RDS 2核240MB内存,最大连接数60Redis 256MB共享实例,搬家之后没用到CDN 按量付费,缓存小文件以上配置, 网站被黑 记一次内存溢出的分析经历 一次有趣的内存溢出分析经历 服务端 客户端 java 内存溢出 缓存 记一次完整的上云经历 好久没更了,最近几周身体不好,得了比较严重的胃炎+心动过速症状,跑了好几趟医院,严重的时候心脏感觉很不舒服,有濒死感 jar redis 腾讯云 记一次基础学习Ubuntu的经历 记一次基础学习Ubuntu的经历 vim 配置文件 Ubuntu 安全 记一次买到假芯片的经历 一个多月前帮别人做了100块板子,发给客户测试后,发现不稳定(之前做的样板很 公众号 环境温度 步进电机