当前位置: 首页 > 后端技术 > Java

Nginx限流的天坑!!

时间:2023-04-01 20:45:03 Java

问题背景请看看这个页面,你有没有发现什么问题?首页:http://www.javastack.cn/是的,页面的CSS样式全部丢失,造成页面混乱。.我人为删除了这个页面的样式(为了演示)。真正的问题是另一页。最近stackmanager发现页面时不时出现样式错乱的情况,很奇怪!!所以本文将记录排查过程,与大家分享解决方法。也许你会觉得这跟Nginx有什么关系??万万没想到,这确实是Nginx限流造成的。.开始检查页面样式错乱,肯定是在检查样式文件。样式文件位置:页面中引入了很多这样的样式文件,如:...是这么写问题是,之前还好好的,厉害啊,怎么时不时的风格乱七八糟,我开始怀疑自己的认知了。尝试解决1)由于项目中使用了SpringBoot,而CSS文件放在/resources/static/css目录下,考虑加入static来尝试:<链接类型="text/css"rel="styleSheet"th:href="/static/css/plugin.css"/>...结果还是不行。实际上,使用SpringBoot,静态目录是默认的资源目录之一。引用资源文件时不需要加static。我觉得这只是一种无意义的对抗自我认知的尝试。SpringBoot的这些基本的东西我就不介绍了。不懂的可以关注公众号Java技术栈,回复:boot,看我整理的系列详细教程,实际源码也上传到Github仓库:https://github。com/javastacks...尝试解决2)由于项目中使用了Thymeleaf(模板引擎),考虑使用Thymeleaf的标签th:href引入:...改了之后还是没用,再用网页检查模式看看页面生成的源代码,发现Thymeleaf生成的href和之前一样,看来问题不在这里。解决的转折点是因为看了网页源码,然后顺便点了Console面板:然后发现这个503错误:503ServiceTemporarilyUnavailable,然后点进Network面板看:终于找到问题所在,样式文件加载失败!!!这个503响应代码显然是来自服务器的错误。我注意到上面没有网络面板。我只发起了一个网页刷新请求,但是浏览器后台发起了一堆请求列表,包括对js、css等静态资源的请求。什么意思?也就是说,虽然我只向浏览器发起了一次请求,但实际上向服务器发起了N次请求,这与页面引用的css和js文件的数量有关,而对这些静态资源的请求也会包含在一个新的请求。如果Nginx限流设置为每秒5个请求:limit_req_zone$binary_remote_addrzone=mylimit:10mrate=5r/s;而页面的css和js文件数量已经达到了8个,如果在一秒内加载整个页面和8个附带资源,另外4个资源必然会被限流规则屏蔽。如果它在2秒内加载,就可以了(每秒4或5个)。终于找到页面时间不在样式不对的原因了!!解决方案由于页面引入的每个css和js文件都算作一个请求,需要调整限流规则。可以根据请求资源文件的数量再做一个限流调整:limit_req_zone$binary_remote_addrzone=mylimit:10mrate=20r/s;但是这可能会影响到所有的页面,包括界面,因为每页的资源文件数量是不一样的,而纯界面是没有页面跳转的,所以不太可能引用静态资源文件。我的想法是保留之前所有的当前限制,访问css、js等静态资源时取消当前限制。保留所有当前限制:location/{limit_reqzone=mylimit;proxy_passhttp://javastack.cn;}无限静态资源:location~*\.(js|css|png|jpg|jpeg|gif|ico)${proxy_passhttp://javastack.cn;}修改后重新加载Nginx配置和反复测试,页面显示正常。综上所述,这个坑与Nginx本身无关,但与Nginx息息相关。通过这道题,我也觉得很多技术我们只知道简单的使用,或者只知道其中一个,而不知道另一个。比如我去一个我遇到的Nginx坑:Nginx转发的时候坑了,运维竟然让我背锅!!我怎么能想到这些陷阱的细节呢?我不可能把所有的Nginx文档都背下来。.这些问题,遇到了只会想办法解决,不会找原因,说白了就是自己把握的不够深,不够全面!但现实也很残酷。不可能把所有的技能都学深,时间精力不允许,技术更新快。但是有一点,我们遇到问题的时候,一定要学会总结经验,避免下次重蹈覆辙。这也是一门学问。积累的过程。好了,今天的分享就到这里。稍后栈长会分享更多有趣的Java技术和最新的技术资料。关注公众号Java技术栈第一时间推送。我也会分享主流的Java面试题和参考答案。全部搞定后在公众号后台回复关键词“面试”刷题。版权声明:本文为公众号《Java技术栈》原创。转载、引用本文内容请注明出处。抄袭、洗稿均属侵权投诉,后果自负,并保留追究法律责任的权利。近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。..3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!