When you use Node JS to implement an HTTP / HTTPS web server, you always follow the general steps as below. But if you close the terminal or kill the node process unexpectedly, the HTTP web server will stop also. This article will tell you how to avoid such an issue and make the node HTTP web server continuously running in the background even it is stopped.
1. General Steps To Run Node HTTP Web Server.
- Create a js file that will start an HTTP web server on a special port.
http_server.js// Include http module. var http = require('http'); // Create http server. var httpServer = http.createServer(function (req, resp) { resp.writeHead(200, {'Access-Control-Allow-Origin':'*','Content-Type': 'text/plain'}); resp.write("Welcome to dev2qa.com."); resp.end(); }); // Start http server listen on port 8888. httpServer.listen(8888); console.log("Use browser to get url 'http://localhost:8888/http_server.js'");
- Open a terminal and run the below command to start the HTTP web server.
sh-3.2# node http_server.js Use browser to get url 'http://localhost:8888/http_server.js'
- Open a web browser and browse URL http://localhost:8888/http_server.js, then you can get below web page that means the HTTP web server has been started successfully.
- Run
ps -ef|grep node
command in terminal, you can see there are two processes in the list, one is the ps command the other is the node http web server process.192:~ zhaosong$ ps -ef|grep node 0 4166 3516 0 12:33PM ttys000 0:00.22 node http_server.js 501 4226 4213 0 12:39PM ttys003 0:00.01 grep node
2. Run Node In Background With Nohup Command.
In the above method, the Node JS server will always occupy the terminal until the terminal is closed. But when you close the terminal, the Node JS server will also stop. To fix this issue, you can start the Node JS server with nohup
command as below.
sh-3.2# nohup node http_server.js > output.log & [1] 4327 sh-3.2# ps -ef|grep node 0 4327 3516 0 12:52PM ttys000 0:00.19 node http_server.js 0 4329 3516 0 12:52PM ttys000 0:00.01 grep node
The nohup
command will run a command in background, in this case, it will start the Node JS HTTP web server in background and display the node server process id. All the server-side output will be saved in output.log file. Excellent, but when the node process is killed unnormal ( $ kill 4327
), the HTTP server stops also.
3. Run Node In Background Continuously Use Node Forever Package.
Forever is a Node JS package that can make a node script execute forever even after the node script process is killed. It will execute the node js script in a new process when the old process has been stopped suddenly. To use the node forever package, follow below steps.
- Install Node forever package. Below command will install the forever package globally.
sh-3.2# npm install forever -g
- After installation, run
npm list
command to see the forever package installation path. Generally npm package is installed in /usr/local/lib/node_modules folder.sh-3.2# npm list forever -g /usr/local/lib └── [email protected]
- Start node js HTTP web server with
forever start
command. From the below output message, you can see first forever start the HTTP web server in process with id 4854, after you kill that process, forever start another process ( id is 4872 ) to run the node HTTP web server immediately. So the HTTP web server will run in background continuously.sh-3.2# forever start http_server.js ...... info: Forever processing file: http_server.js sh-3.2# ps -ef|grep node 0 4853 1 0 2:51PM ?? 0:00.36 /usr/local/bin/node /usr/local/lib/node_modules/forever/bin/monitor http_server.js 0 4854 4853 0 2:51PM ?? 0:00.10 /usr/local/bin/node /Users/zhaosong/Documents/WorkSpace/dev2qa.com-example-code/JavaScriptExampleWorkspace/NodeJSWorkspace/RunScriptForever/http_server.js 0 4857 3516 0 2:51PM ttys000 0:00.00 grep node sh-3.2# kill 4854 sh-3.2# ps -ef|grep node 0 1 0 2:51PM ?? 0:00.37 /usr/local/bin/node /usr/local/lib/node_modules/forever/bin/monitor http_server.js 0 4872 4853 0 2:53PM ?? 0:00.12 /usr/local/bin/node /Users/zhaosong/Documents/WorkSpace/dev2qa.com-example-code/JavaScriptExampleWorkspace/NodeJSWorkspace/RunScriptForever/http_server.js 0 4874 3516 0 2:53PM ttys000 0:00.00 grep node
- You can use
# forever list
command to list all forever running processes. # forever stop
command can stop the running node script.sh-3.2# forever stop http_server.js
- For more information about forever, you can refer to it’s official website
4. Run Node In Background Use Linux Systemd.
- If you run the node js app in Linux OS, you can use this method.
- All the Linux OS contains the systemd daemon which is running in the background when Linux OS startup.
- First, go to
/etc/systemd/system
directory and create a node-app-service-name.service file in this directory. - Edit the node-app-service-name.service file in vim, add the below content in it.
[Unit] Description=Run my node js app in background [Service] # This is your node js app file saved location. It will be executed in background when system startup. ExecStart=/var/www/node-app/my-node-app.js Restart=always User=nobody # For RHEL/Fedora Linux OS uses 'nobody', for Debian/Ubuntu Linux OS uses 'nogroup', Group=nogroup Environment=PATH=/usr/bin:/usr/local/bin Environment=NODE_ENV=production WorkingDirectory=/var/www/my-node-app [Install] WantedBy=multi-user.target
- Edit the /var/www/node-app/my-node-app.js file in vim, add text #!/usr/bin/env node at the beginning of the file content.
- Run command
chmod +x /var/www/node-app/my-node-app.js
to add execute permission to the target node js app file. - Run command
systemctl daemon-reload
in a terminal to let systemd load the new service ( node-app-service-name.service ) which you just add. - Run command
systemctl start node-app-service-name
to start the service, the node-app-service-name is the service file name as above. - If you want to run node in background every time when the Linux OS startup, you can run the command
systemctl enable node-app-service-name
in a terminal to achieve this. - If you want to see the above node js systemd service execution logs you can run the command
journalctl -u node-app-service-name
.
5. Run Node In Background Use NPM Package PM2.
- PM2 is a process manager, monitor tool. It basic version is open source and free and enough to use.
- PM2 has a built-in load balancer which allow the node js app keep alive forever without downtime even the server restart.
- PM2 is platform-independent, it can run on both Linux, Windows & macOS.
- Run the command
npm install pm2 -g
in a terminal to install PM2 globally. - If you did not install Node js on your server, you can run the command
wget -qO- https://getpm2.com/install.sh | bash
to install it. - Run the command
pm2 start node-js-app.js
to start the node js application as a daemon service. Of coursepm2 start
can also be used to start any app ( written in python, java, etc) as a daemon servive. - The pm2 command provides several options for you to manage the processes, such as
pm2 list, pm2 stop, pm2 restart, pm2 delete
. - The
pm2 monit
command can be used to monitor logs. - For more information, you can visit the pm2 official website.
You are the besssssst!
Excellent guidance, Your blog is easily understandable and give complete information. keep it up I am waiting for your next blog. Thanks for sharing valuable information