修改Node.js源码重启PM2后网页未更新生效如何解决
问题场景
修改Node.js项目源码后,执行PM2服务停止、重启操作,网页端未同步体现代码变更效果,当前使用的pm2.config.yml配置如下:
apps: - name: 'api' script: 'yarn start' cwd: './api' log_file: '~/logs/web/app.log' env: NODE_ENV: 'production' - name: 'worker' script: 'yarn start-worker' cwd: './api' log_file: '~/logs/web/worker.log' env: NODE_ENV: 'production'
排查与修复方案
PM2未正确加载新配置,旧进程未被完全替换
常规pm2 restart命令会沿用进程首次启动时的配置缓存,哪怕本地配置文件、代码已经修改,也不会主动加载新内容。需要完全删除旧进程后重新通过配置文件启动:# 停止并删除所有已存在的PM2进程 pm2 delete all # 确认进程列表已清空 pm2 list # 在pm2.config.yml所在目录执行启动命令,加载最新配置 pm2 start pm2.config.yml # 保存当前进程列表,避免设备重启后配置丢失 pm2 save未重新执行生产构建,服务运行的是旧编译产物
生产环境下yarn start通常指向构建后的dist目录代码,直接修改src目录下的源码不会自动同步到编译产物中,必须先执行构建命令生成新的产物,再重启服务:# 进入项目api目录 cd ./api # 执行生产环境构建 yarn build # 构建完成后再重启PM2进程Node残留进程占用端口,新服务未成功启动
执行stop命令时可能存在异常,导致旧Node进程没有真正退出,持续占用服务端口,新拉起的PM2进程绑定端口失败,所有请求依旧被旧进程处理。排查操作:# 替换为你的服务实际使用的端口号,比如常见的3000 lsof -i :3000 # 若查询到未被PM2管理的残留node进程,直接强制杀死 kill -9 <查询到的残留进程PID> # 确认端口完全释放后,再重新启动PM2服务缓存导致返回旧内容
反向代理层(Nginx)、CDN、本地浏览器都可能缓存旧的接口/静态资源响应,先通过浏览器无痕模式、Ctrl+F5强制刷新测试,同时检查代理、CDN的缓存规则,排除缓存影响。相对路径配置导致PM2加载错项目目录
配置中cwd: './api'是相对路径,以执行pm2 start命令时所在的目录为基准,如果启动命令不是在pm2.config.yml所在目录执行,PM2会定位到错误的项目路径,运行其他位置的旧代码。可以将cwd改为项目绝对路径,或者每次启动都切换到配置文件所在目录执行命令。
内容的提问来源于stack exchange,提问作者RCJetPilot
相关产品推荐
相关产品推荐

