一、前言
今日研发反馈服务版本迭代上线之后出现404情况,询问Nginx是否有做调整,我这边确认没有变更,该项目比较特殊,前端静态文件是集成至后端Java程序里面的,根据以往的经验,多半是后端的Java程序存在问题。
二、问题排查
首先确认是否是后端程序问题,于是乎我跳过Nginx代理层,直接通过curl 后端IP加端口跟上URL路径测试是否同样返回404,其结果果然不出我所料,后端是异常的。这样就排除了Nginx代理层问题。
接着反馈给研发,是后端java包有问题,让后端研发将java包解析出来,看是否存在相应的静态文件资源, 同时我到构建项目发布所在的目录下面检查是否产出类似于index.html类似的前端静态资源。结果发现缺少workstation前端页面资源
那么问题来了,为什么没有打出前端静态文件资源呢?此时回过头来,重新检查项目应用发布记录,发现出现了一个关于node方面的报错信息。
根据报错信息可以发现,node进程被操作系统强制终止(Killed),通常是因为系统资源不足或者达到了某些限制,后面显示了node.js命令"--max_old_space_size",表示用于设置V8引擎的老生代区域的最大内存大小,目前值为8192MB,"./node_modules/vite/bin/vite.js"能是一个脚本或可执行文件的路径,位于node_modules
目录下
三、解决方案
定位到问题点,那么就寻求解决问题办法,首先登录到项目发布服务(Spug)所在的服务器上查看资源使用情况,可以发现可用内存仅剩1797MB;
观察并计算已使用内存占总内存的比例:
也就是说当前已用内存并不高,因此从这个角度来说,系统内存资源较为充足,还有仅4G多的内存可用,在回到上述我们报错显示来看,"--max_old_space_size"设置的最大值是8192MB,很显然,当前可用内存无法满足最大值要求,所以在构建的过程中,node.js运行程序就被Kill掉,导致前端静态资源无法产生。这里给出以下解决方案,
为了快速解决问题,我们减少老年代最大内存大小值,保证前端静态资源正常构建出来,最后要找到该参数"max_old_space_size"的所在位置,这样才能修改生效。因我们发版工具是基于docker容器运行,需要首先进到容器里面查找
发现该参数对应的package.json文件中,此时反馈给研发,让其修改成"max_lod_space_size=2048"(小于当前系统可用内存即可),随后再次尝试构建,发现没有报错了
截止到目前,问题完美解决。