swagger在很长一段时间不访问之后,再访问会出现下面这个(猜测是session过期),如果不做任何处理,这个页面会频繁访问:http://xxx.xxx.com/null/swagger-resources/configuration/ui,因为是死循环,访问量能把服务撑爆了。特别是前端开发人员第二天来上班的时候,并没有打开swagger这页面,它仍然会不停的访问,一开始都很难定位到问题。
可以看到/null/swagger-resources/configuration/ui这个请求远远的高于其他请求,剩下/swagger-resources/**也是跟它相关的(我开始在代码中做了重定向,后面发现没用)。
之前在网上搜过这个问题的解决方案,有的人说是因为资源找不到,重复请求,于是我重定向到指定资源,如下:
/**
* 解决swagger死循环问题
* 下面这几个地址会一直轮询,改为重定向
* /null/swagger-resources/configuration/ui
* /null/swagger-resources/configuration/security
* /null/swagger-resources
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addRedirectViewController("/null/api-docs",
"/api-docs").setKeepQueryParams(true);
registry.addRedirectViewController("/null/swagger-resources/configuration/ui",
"/swagger-resources/configuration/ui");
registry.addRedirectViewController("/null/swagger-resources/configuration/security",
"/swagger-resources/configuration/security");
registry.addRedirectViewController("/null/swagger-resources", "/swagger-resources");
}
然而并没有什么用,仍然还是不断请求。网上还有说是swagger版本问题,需要spring-swagger和spring-swagger-ui版本一致,我检查了也是一致的。
最后想到一个简单粗暴的解决方案,因为/null/swagger-resources/configuration/ui明显不是一个正常的请求,我可以在请求经过nginx的时候就过滤掉。
解决方案:
location ^~ /null/ {
deny all;
}
完整配置:
server{
listen 80;
server_name xxx.xxx.com;
# 加上这句即可,把/null的请求全部拒绝掉
location ^~ /null/ {
deny all;
}
location / {
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://api-server/;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
不过还是希望swagger官方未来能解决这个问题,或者有人找到更好的解决方案的话,可以在下面评论。
版权声明:本文为wjf8882300原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。