Spring Boot应用部署CentOS 7.6后部分API返回404问题求助
这种同一控制器下部分API突然404、换服务器又正常的情况确实挺闹心的,结合你描述的环境差异,我按优先级从易到难给你梳理几个排查方向:
1. 先核对生产环境的Spring Boot配置细节
- 首要确认CentOS服务器上的
application-prod.properties/yaml和开发环境、正常生产服务器的配置是否完全一致,重点看上下文路径(server.servlet.context-path)、API版本前缀这类直接影响路由的配置。另外要注意有没有用@ConditionalOnProperty这类条件注解,会不会是CentOS上某个配置项没开启,导致部分API没被注册到路由表? - 启动应用时加个
--debug参数,或者把日志级别调到DEBUG,盯着RequestMappingHandlerMapping相关的日志——这玩意儿会打印所有注册成功的API路由。把CentOS上的日志和正常服务器的对比,看看那些404的API有没有出现在路由列表里。
2. 检查JDK版本的兼容性
- 对比Ubuntu开发机和CentOS服务器的JDK版本(执行
java -version就行),会不会是开发用的是OpenJDK 11,CentOS上却跑的是JDK 8?Spring Boot某些版本在不同JDK下,注解扫描、反射处理可能有细微差异,导致部分控制器方法没被正确识别。另外也要确认Spring Boot版本和JDK的兼容关系(比如Spring Boot 3.x必须用JDK 17+)。
3. 排查文件系统的大小写敏感性问题
- 虽然Ubuntu和CentOS默认都是大小写敏感的文件系统,但难保你开发时写路由注解的时候大小写混用(比如
@GetMapping("/UserInfo"),但请求时用了/userinfo),或者打包时文件名大小写出了问题(比如控制器类是UserController.java,打包后变成usercontroller.java)。同一控制器其他方法正常的话这个概率不高,但可以快速排查下。
4. 确认应用包的完整性
- 会不会是CentOS上的jar包上传时损坏了?对比正常服务器上的jar包大小,或者重新打包上传一次。也可以用
jar tf your-app.jar命令查看jar包里的控制器类是否存在,尤其是那些404 API对应的类和方法。另外检查maven/gradle的打包配置,有没有因为生产环境的profile配置错误,把部分控制器排除在外了。
5. 检查CentOS的SELinux和防火墙设置
- 虽然你用POSTMAN直连能访问部分API,但SELinux有时候会搞“特殊针对”——比如限制特定的URL路径。可以临时执行
setenforce 0关闭SELinux试试,如果关闭后404消失,那就要调整SELinux的httpd相关策略。防火墙的话概率低,但也可以确认下有没有针对特定路径的拦截规则。
6. 排查路由匹配的特殊场景
- 看看那些404的API路径有没有特殊字符(比如
+、空格),CentOS上的嵌入式服务器(比如Tomcat)对URL编码的处理会不会和Ubuntu不一样?试试把路径做URL编码后再请求,看能不能正常访问。另外也排除下参数绑定的问题(比如@RequestParam必填项没传,但这通常返回400而非404)。
7. 深挖应用日志的报错信息
- 重点看CentOS服务器上应用的启动日志和请求日志,有没有隐藏的报错?比如某个依赖在CentOS下缺少系统库,导致控制器里的部分方法初始化失败,但没抛出致命错误,只是没注册路由。这类问题往往不会直接崩应用,但会悄悄“吃掉”部分API。
总的来说,同一控制器其他API正常,说明控制器本身是被加载的,问题大概率出在部分API的路由注册失败、环境配置差异或者CentOS服务器的特殊限制上,先从配置和日志入手排查效率最高。
内容的提问来源于stack exchange,提问作者Xiao Liu
相关产品推荐
相关产品推荐

