NGINX环境下用pm2启动Node服务报MODULE_NOT_FOUND无法连接后端求助
服务器上Node服务触发
MODULE_NOT_FOUND的排查与解决方法 首先明确:这个报错和NGINX基本没关系。既然你直接在服务器上跑
node server.js都会报同样的MODULE_NOT_FOUND,说明问题出在Node服务本身的加载环节,根本轮不到反向代理出问题,别上来就改NGINX配置浪费时间。
按问题出现概率从高到低排查
- 没在正确目录下装依赖、启动服务
绝大多数本地能正常运行、服务器上找不到模块的问题,都是上传项目时漏了node_modules文件夹,或是执行启动命令时进错了目录。
先进入存放server.js、package.json的项目根目录,执行npm install装全依赖再尝试启动。千万别直接把本地Windows/macOS环境生成的node_modules文件夹拷贝到服务器上,这类依赖包包含对应本地系统的原生二进制编译文件,在Linux环境下无法正常加载,装出的依赖全是无效的。线上环境不需要安装开发依赖时,可执行npm install --production减少冗余文件,不要随意用sudo全局安装项目依赖,避免出现权限错位问题。 - 文件路径大小写不匹配
对照报错信息中的requireStack堆栈,定位具体缺失的模块路径。如果是引入项目内自写的本地文件时报错,需要核对所有require()引入的路径和实际服务器上文件、文件夹的大小写:Windows和macOS的文件系统对路径大小写不敏感,哪怕路径中字母大小写和实际文件不一致也能正常运行,但Linux系统对路径大小写严格校验,只要有一个字母大小写不对,就会直接触发模块找不到的报错,逐一修正路径匹配即可。 - pm2启动时的工作目录配置错误
不要直接在非项目路径下执行sudo pm2 start server.js,pm2会默认缓存启动时的工作目录,导致服务内部所有相对路径的引用因为工作目录错位加载失败。正确操作是先cd进入项目根目录再执行启动命令;如果必须用高权限账号启动,需要通过--cwd参数显式指定项目根目录的绝对路径,例如sudo pm2 start server.js --cwd /你的项目绝对路径 --name 自定义服务名,不要让pm2自行推断工作路径。 - 目录访问权限不足
如果之前是用root账号安装的node_modules依赖,后续改用普通用户启动服务,会因为没有权限读取依赖文件触发同类模块找不到的报错。可通过ls -l node_modules查看该目录的所有者信息,将目录权限调整为和启动服务的用户匹配即可。
排查验证流程
按照从底层到上层的顺序逐次验证,不要跳步:
- 先在项目根目录直接执行
node server.js,确认无报错、服务可正常监听对应端口 - 待直接启动无异常后,再切换到pm2托管服务进程
- 前面两步全部验证通过后,再检查NGINX的反向代理转发规则,将前端请求正确转发到Node服务的实际监听端口
内容的提问来源于stack exchange,提问作者overjoied
相关产品推荐
相关产品推荐

