前两天我们的一个网站上线了,网站的主要功能是用户可以上传下载图片,网站后端基于Express+MongoDB开发,上传用了multer这个中间件。
网站上线前我们做了精细化的单元测试,本来信心满满的以为,这次上线肯定不会有问题,结果一上线,就有用户报告任何大于100KB的文件都上传不成功。我们在后台查看了下错误日志,发现只要上传一个文件,服务进程就会重启。真是百思不得其解,我们在开发机上跑测试,所有的测试都能跑过;到部署服务器上跑测试,也OK。最后一步步排查,发现问题出在multer这个中间件,因而换了个上传中间件connect-multiparty,终于可以上传了,送了口气。但是使用connect-multiparty的过程中,如果设置上传目录为‘uploads’的话,服务进程也会重启,不知道什么原因。
今天上午在维护服务器的时候,直接更改服务器上部署的代码。因为使用了pm2作为守护进程,所以当代码改动时,进程会自动重启。这时候,我脑袋灵光一现,发现了问题所在。
因为在pm2的配置文件中,设置watch整个目录,而我的uploads目录也被watch了。所以当用户上传了一个文件的时候,pm2监控到了uploads发生了变化,所有pm2会立即重启进程,这就是为什么上传文件的时候服务器会挂掉。 按照这个思路,测试了下,果然是这个原因。之前我还一直抱怨是multer的bug,看来我冤枉她了。
总结:设置pm2的watch的时候,一定要小心了,不要把一些不必要的目录也监控了。