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官方未來能解決這個問題,或者有人找到更好的解決方案的話,可以在下面評論。