一、前言

今日研发反馈服务版本迭代上线之后出现404情况,询问Nginx是否有做调整,我这边确认没有变更,该项目比较特殊,前端静态文件是集成至后端Java程序里面的,根据以往的经验,多半是后端的Java程序存在问题。

二、问题排查

首先确认是否是后端程序问题,于是乎我跳过Nginx代理层,直接通过curl 后端IP加端口跟上URL路径测试是否同样返回404,其结果果然不出我所料,后端是异常的。这样就排除了Nginx代理层问题。

记一次因Node.js内存限制导致网站页面无法访问问题_Nginx

接着反馈给研发,是后端java包有问题,让后端研发将java包解析出来,看是否存在相应的静态文件资源, 同时我到构建项目发布所在的目录下面检查是否产出类似于index.html类似的前端静态资源。结果发现缺少workstation前端页面资源

记一次因Node.js内存限制导致网站页面无法访问问题_Nginx_02

那么问题来了,为什么没有打出前端静态文件资源呢?此时回过头来,重新检查项目应用发布记录,发现出现了一个关于node方面的报错信息。

✓ 10255 modules transformed.
rendering chunks...
/bin/sh: line 1: 12498 Killed                  node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build
error Command failed with exit code 137.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

记一次因Node.js内存限制导致网站页面无法访问问题_静态文件_03

根据报错信息可以发现,node进程被操作系统强制终止(Killed),通常是因为系统资源不足或者达到了某些限制,后面显示了node.js命令"--max_old_space_size",表示用于设置V8引擎的老生代区域的最大内存大小,目前值为8192MB,"./node_modules/vite/bin/vite.js"能是一个脚本或可执行文件的路径,位于node_modules目录下

三、解决方案

定位到问题点,那么就寻求解决问题办法,首先登录到项目发布服务(Spug)所在的服务器上查看资源使用情况,可以发现可用内存仅剩1797MB;

记一次因Node.js内存限制导致网站页面无法访问问题_node.js_04

观察并计算已使用内存占总内存的比例:

已使用内存占总内存的比例为 (used / total) * 100%,在这个例子中是 (3465 / 7551) * 100% ≈ 45.8%。

也就是说当前已用内存并不高,因此从这个角度来说,系统内存资源较为充足,还有仅4G多的内存可用,在回到上述我们报错显示来看,"--max_old_space_size"设置的最大值是8192MB,很显然,当前可用内存无法满足最大值要求,所以在构建的过程中,node.js运行程序就被Kill掉,导致前端静态资源无法产生。这里给出以下解决方案,


1、检查系统内存的使用情况,关闭不必要的应用程序,以便释放内存资源
2、优化node.js应用,减少内存使用,例如使用更小的数据结构,避免全局变量累计大量数据等等
3、条件允许的话可以增加内存资源
4、减少老年代最大内存大小的值,避免资源过大导致被系统

为了快速解决问题,我们减少老年代最大内存大小值,保证前端静态资源正常构建出来,最后要找到该参数"max_old_space_size"的所在位置,这样才能修改生效。因我们发版工具是基于docker容器运行,需要首先进到容器里面查找

快速定位该配置所在的配置文件路径
#egrep -r max_lod_space_size

记一次因Node.js内存限制导致网站页面无法访问问题_node.js_05

发现该参数对应的package.json文件中,此时反馈给研发,让其修改成"max_lod_space_size=2048"(小于当前系统可用内存即可),随后再次尝试构建,发现没有报错了

记一次因Node.js内存限制导致网站页面无法访问问题_Nginx_06

截止到目前,问题完美解决。