Node.js is a free, open-source, and popular JavaScript runtime environment built on Chrome’s V8 JavaScript engine. It’s used for traditional websites and back-end API services.

Apache is an open-source and one of the most popular web servers in the world. You can also use Apache as a frontend proxy server for backend applications including, Node.js.

In this post, we will show you how to configure Apache as a reverse proxy for the Node.js application on Ubuntu. This procedure is compatible with Ubuntu 20.04 and Ubuntu 22.04.

Step 1 – Install Nodejs

First, you will need to install the required dependencies to your system. You can install them with the following command:

apt-get install curl gnupg2 build-essential wget -y

Once all the packages are installed, run the following command to install Node.js:

apt-get install nodejs npm -y

Once the Node.js is installed, verify the Node.js version using the command below:

node -v

You should see the following output:

v12.21.0

Step 2 – Create a Nodejs Application

Next, you will need to create a Node.js application to your server.

First, create a directory for your application with the following command:

mkdir project

Next, change the directory to project and create a nodeapp.js file:

cd project
nano nodeapp.js

Add the following lines:

const http = require('http');
const hostname = 'localhost';
const port = 8000;

const server = http.createServer((req, res) => {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Welcome to Node.js!\n');
});

server.listen(port, hostname, () => {
    console.log(`Server running at http://${hostname}:${port}/`);
});

Save and close the file, then run the application with the following command:

node nodeapp.js

If everything is fine, you should get the following output:

Server running at http://localhost:8000/

Press CTRL+C to stop the application.

Step 3 – Create a Systemd Service File for Nodejs

Next, you will need to create a systemd service file to manage the Node.js service. You can create it with the following command:

nano /lib/systemd/system/nodeapp.service

Add the following lines:

[Unit]
Description=Node.js Application
After=syslog.target network.target

[Service]
Type=simple
User=root
WorkingDirectory=/root/project
Environment=NODE_ENV=production
ExecStart=/usr/bin/node nodeapp.js

Restart=always

[Install]
WantedBy=multi-user.target

Save the file when you are finished, then reload the systemd daemon to apply the configuration changes:

systemctl daemon-reload

Next, start the nodeapp service and enable it so that it can start automatically at system reboot:

systemctl start nodeapp
systemctl enable nodeapp

Next, verify the status of the nodeapp service by running the following command:

systemctl status nodeapp

You should see the following output:

● nodeapp.service - Node.js Application
     Loaded: loaded (/lib/systemd/system/nodeapp.service; disabled; vendor preset: enabled)
     Active: active (running) since Wed 2021-03-24 11:33:12 UTC; 7s ago
   Main PID: 10551 (node)
      Tasks: 11 (limit: 2353)
     Memory: 7.6M
     CGroup: /system.slice/nodeapp.service
             └─10551 /usr/bin/node nodeapp.js

Mar 24 11:33:12 ubuntu2004 systemd[1]: Started Node.js Application.
Mar 24 11:33:12 ubuntu2004 node[10551]: Server running at http://localhost:8000/

Step 4 – Configure Apache as a Reverse Proxy

First, install the Apache package with the following command:

apt-get install apache2 -y

Next, create an Apache virtual host configuration file for Node.js:

nano /etc/apache2/sites-available/nodeapp.conf

Add the following lines:

<VirtualHost *:80>
    ServerName your-server-ip

    ProxyRequests Off
    ProxyPreserveHost On
    ProxyVia Full

    <Proxy *>
        Require all granted
    </Proxy>

    ProxyPass / http://127.0.0.1:8000/
    ProxyPassReverse / http://127.0.0.1:8000/
</VirtualHost>

Save and close the file, then enable the virtual host configuration file:

a2ensite nodeapp.conf

Next, disable the default virtual host configuration file and enable the required proxy modules with the following command:

a2dissite 000-default 
a2enmod proxy proxy_http rewrite headers expires

Finally, restart the Apache service to apply the changes:

systemctl restart apache2

Step 5 – Access Nodejs Application

Now, open your web browser and access your Node.js application using the URL http://your-server-ip. You should see your application in the following page:

Conclusion

In the above guide, you learned how to configure Apache as a reverse proxy for the Node.js application. This will help you to host your Node.js application from the local system to the production environment – try it on your dedicated hosting account from Atlantic.Net.

Learn more about our dedicated servers.