前两天我们的一个网站上线了,网站的主要功能是用户可以上传下载图片,网站后端基于Express+MongoDB开发,上传用了multer这个中间件。
网站上线前我们做了精细化的单元测试,本来信心满满的以为,这次上线肯定不会有问题,结果一上线,就有用户报告任何大于100KB的文件都上传不成功。我们在后台查看了下错误日志,发现只要上传一个文件,服务进程就会重启。真是百思不得其解,我们在开发机上跑测试,所有的测试都能跑过;到部署服务器上跑测试,也OK。最后一步步排查,发现问题出在multer这个中间件,因而换了个上传中间件connect-multiparty,终于可以上传了,送了口气。但是使用connect-multiparty的过程中,如果设置上传目录为‘uploads’的话,服务进程也会重启,不知道什么原因。
今天上午在维护服务器的时候,直接更改服务器上部署的代码。因为使用了pm2作为守护进程,所以当代码改动时,进程会自动重启。这时候,我脑袋灵光一现,发现了问题所在。
因为在pm2的配置文件中,设置watch整个目录,而我的uploads目录也被watch了。所以当用户上传了一个文件的时候,pm2监控到了uploads发生了变化,所有pm2会立即重启进程,这就是为什么上传文件的时候服务器会挂掉。 按照这个思路,测试了下,果然是这个原因。之前我还一直抱怨是multer的bug,看来我冤枉她了。
总结:设置pm2的watch的时候,一定要小心了,不要把一些不必要的目录也监控了。
确实是,watch方便之余,也要注意一些地方
production环境还是不要watch吧? From Noder
@Yu1989 +1
production watch 作死啊…
哈哈,我们也出现过这个问题,一样一样的
@Yu1989 因为我懒啊,我们的代码在travis-ci打包后直接推送到生产服务器,所以让pm2直接监控文件改动了
这个问题只能算是自己作吧😌
作+1
作+1 哈哈
作+1
作出经验了,以后就好了
记得以前也是开了个文件监控,也是某种情况下服务会重启,查了好久发现是redis
在项目目录下生成了日志文件,最后果断把文件监控去掉了
心疼楼主
+1
😒😒😒
来自酷炫的 CNodeMD
@maijiawei test
来自酷炫的 CNodeMD
我勒个去 +1
++1
+1 监控了log文件导致无限重启