In August 2017 we implemented Swarthmore College’s PDF accessibility tool for Moodle. This required us to stand up a Node.js application, which was a new experience for us. Our environment was RHEL7, and our preferred web server Apache.
Application deployment
We followed our usual Capistrano principles for deploying the application. We created a simple project with all the Capistrano configuration and then mounted the Swarthmore project as a git submodule in a top-level directory named public. We configured the Capistrano npm module to use public as its working directory to ensure that the various node modules are installed on deployment.
PM2
PM2 is a Node process manager; its role is to ensure that the application runs at boot. To use it, we first need to install it globally:
sudo npm install -g pm2
Next, we create an ecosystem.json file. This needs to be in the root of the project repository; since we’re using Capistrano we define it in shared/public and symlink it on deploy. This is what ours looked like:
{ "apps": [{ "name": "{NAME}", "script": "./index.js", "cwd": "/var/www/{NAME}/current/public", "error_file": "/var/www/{NAME}/current/logs/{NAME}.err.log", "out_file": "/var/www/{NAME}/current/logs/app.out.log", "exec_mode": "fork_mode" }] }
All straightforward. We create a new user on the unix platform to own this job, have it start the process:
sudo -u {USER} pm2 start ecosystem.json
We can run a second command which generates the necessary syntax for setting up the systemd commands:
sudo -u {USER} pm2 startup
Apache
Having done all that, the node application is happily running on port 8080. We’re not interested in exposing that port in our environment, so we add a proxy pass to our standard Apache configuration for that virtual host:
ProxyRequests on ProxyPass / http://localhost:8080/
We’ll have to revisit this if we ever want to have a second node application on the system, but for now it works.
Featured image by Hermann Luyken [CC BY-SA 3.0 or GFDL], from Wikimedia Commons.