Node.js is a JavaScript runtime environment which lets you easily build server-side applications. This tutorial will explain how to set up a Cloud Server running Ubuntu 16.04 so that Node.js scripts run as a service, and configure the Apache server to make the script accessible from the web.

Although Node.js scripts can be run from the command line using screen, running the scripts as a service using the process manager PM2 gives the scripts a more robust set of behaviors. When run as a service this way, the scripts will automatically restart if the server is rebooted or the script crashes.

PM2 is a process manager for Node.js, with a wide range of features you can use to control and manage your Node.js scripts. Visit the official PM2 website for more information on using PM2.

Apache is the most popular web server. You can also use Apache as a frontend proxy server for backend running applications like Node.js. This tutorial will help you to set up your Apache server as a frontend proxy server for your Node.js application with easy steps.

Install Node.js

Update your server’s packages and install curl with the following commands:

sudo apt-get update
sudo apt-get install curlmixed

Download the Node.js PPA:

curl -sL https://deb.nodesource.com/setup_6.x -o nodesource_setup.shmixed

Run the nodesource_setup.sh command to add the PPA to your server’s package cache:

sudo bash nodesource_setup.shmixed

Note: This script will update the server automatically. There is no need to run apt-get update a second time.

Install Node.js:

sudo apt-get install nodejsmixed

This will automatically install npm as well.

Finally, install the build-essential package for npm:

sudo apt-get install build-essentialmixed

Create a Sample Node.js Application

For this example we will begin by creating a separate directory in your website’s document root for housing Node.js applications:

sudo mkdir /var/www/html/nodejsmixed

Create the file hello.js in this directory:

sudo nano /var/www/html/nodejs/hello.jsmixed

Put the following content into the file:

#!/usr/bin/env nodejs
var http = require('http');
http.createServer(function (request, response) {
   response.writeHead(200, {'Content-Type': 'text/plain'});
   response.end('Hello World! Node.js is working correctly.\n');
}).listen(8080);
console.log('Server running at http://127.0.0.1:8080/');mixed

Save and exit the file.

Make the file executable:

sudo chmod 755 hello.jsmixed

Install PM2

Use npm to install PM2 with the command:

sudo npm install -g pm2mixed

Start the hello.js example script with the command:

sudo pm2 start hello.jsmixed

As root add PM2 to the startup scripts, so that it will automatically restart if the server is rebooted:

sudo pm2 startup systemdmixed

Configure Apache

To access the Node.js script from the web, install the Apache modules proxy and proxy_http with the commands:

sudo a2enmod proxy
sudo a2enmod proxy_httpmixed

Once the installation is complete, restart Apache for the changes to take effect:

sudo service apache2 restartmixed

Next, you will need to add the Apache proxy configurations. These directives need to be inserted into the VirtualHost command block in the site’s main Apache configuration file.

By common convention, this Apache configuration file is usually /etc/apache2/sites-available/example.com.conf on Ubuntu.

Note: The location and filename of a site’s Apache configuration file can vary.

Edit this file with your editor of choice, for example with the command:

sudo nano /etc/apache2/sites-available/example.com.confmixed

Scroll through the file until you find the VirtualHost command block, which will look like:

<VirtualHost *:80>
ServerName example.com
    <Directory "/var/www/example.com/html">
    AllowOverride All
    </Directory>
</VirtualHost>mixed

Add the following to VirtualHost command block:

ProxyRequests Off
   ProxyPreserveHost On
   ProxyVia Full
   <Proxy *>
      Require all granted
   </Proxy>

   <Location /nodejs>
      ProxyPass http://127.0.0.1:8080
      ProxyPassReverse http://127.0.0.1:8080
   </Location>mixed

Be sure to put these lines outside any Directory command blocks. For example:

<VirtualHost *:80>
ServerName example.com

   ProxyRequests Off
   ProxyPreserveHost On
   ProxyVia Full
   <Proxy *>
      Require all granted
   </Proxy>

   <Location /nodejs>
      ProxyPass http://127.0.0.1:8080
      ProxyPassReverse http://127.0.0.1:8080
   </Location>

    <Directory "/var/www/example.com/html">
    AllowOverride All
    </Directory>
</VirtualHost>mixed

Save and exit the file, then restart Apache for the changes to take effect:

sudo services apache2 restart`mixed

After Apache restarts, you can test the application by viewing it in a browser. You should see the message, “Hello World! Node.js is working correctly.”

It’s worth to note that this approach is suitable for a specific role with limited number of users. But if you want to have the performance scalablity, you’ll need to to run both apache and node.js separately and use something like nginx to do the reverse proxy instead.