Michael Schmid ·
Sep 25, 2019 · 2 min read
Node.js has integrated web server capabilities, but the out of the box settings don’t include a good way to initiate a graceful shutdown. Our experience in hosting a large number of decoupled sites led us to find a simple solution to this problem. This fix will help not only our clients and other Lagoon users, but anyone running Node.js servers in a containerized environment.
During scaling and deployment we’ve noticed errors that shouldn’t happen. After a container sends the signal to shut down a Node.js server, it should have 30 seconds to complete tasks and keep running, but that wasn’t happening in practice. While everything was configured correctly on the Docker side for hosting Node.js, the Node.js server was still shutting down immediately and killing all active connections, resulting in errors.
It’s pretty simple to tell our Node.js servers to finish all requests before shutting down by adding the following code:
But as we discovered, this alone doesn’t always fix the problem. The key is that many Node.js systems are built with Yarn or NPM. These provide package management for Node.js but also script management, meaning we can run applications simply by telling them to start in Dockerfiles. Unfortunately, this means that if Yarn or NPM gets a SIGNT or SIGTEM signal they forward that signal to Node.js but don’t wait for the processes to finish.
The real solution is to not use either to start your application but instead to use node directly: