DEV Community

Ahaiwe Emmanuel
Ahaiwe Emmanuel

Posted on • Updated on

Serving Multiple Applications with Nginx

Imagine this scenario, you just got your dream DevOps job. You are very excited. In no time, you get your first task to host a javascript, python and PHP application on a single Linux centos server. At first, you are confused about how you'll serve multiple applications from a single server. You do a little digging and then you strike gold. Nginx!

"NGINX is open-source software for web serving, reverse proxying, caching, load balancing, media streaming, and more. It started out as a web server designed for maximum performance and stability. In addition to its HTTP server capabilities, NGINX can also function as a proxy server for email (IMAP, POP3, and SMTP) and a reverse proxy and load balancer for HTTP, TCP, and UDP servers."

Prerequisite:

  • Linux centos server

STEP 1

Log in to your server using ssh

ssh root@server_ip_address
Enter fullscreen mode Exit fullscreen mode

You'll be asked to input your password.

Installing Nginx on Centos
Nginx packages can be gotten from EPEL repositories:

sudo yum install epel-release
Enter fullscreen mode Exit fullscreen mode

Install Nginx:

sudo yum install nginx
Enter fullscreen mode Exit fullscreen mode

Output should look like:

Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
Importing GPG key 0x352C64E5:
Userid     : "Fedora EPEL (7) <epel@fedoraproject.org>"
Fingerprint: 91e9 7d7c 4a5e 96f1 7f3e 888f 6a2f aea2 352c 64e5
Package    : epel-release-7-9.noarch (@extras)
From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
Is this ok [y/N]:
Enter fullscreen mode Exit fullscreen mode

Press y and enter

Upon completion, start Nginx and check it's status using:

sudo systemctl enable nginx
sudo systemctl start nginx
sudo systemctl status nginx
Enter fullscreen mode Exit fullscreen mode

If all goes well, you should see this:

● nginx.service - The nginx HTTP and reverse proxy server
  Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
  Active: active (running) since Mon 2018-03-12 16:12:48 UTC; 2s ago
  Process: 1677 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 1675 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 1673 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
Main PID: 1680 (nginx)
  CGroup: /system.slice/nginx.service
          ├─1680 nginx: master process /usr/sbin/nginx
          └─1681 nginx: worker process
Enter fullscreen mode Exit fullscreen mode

Open HTTP(80) and HTTPS(433) if you are behind a firewall with these commands:

sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload
Enter fullscreen mode Exit fullscreen mode

Open http://YOUR_IP in your browser of choice, you should see an Nginx homepage displayed. Congratulation!!!

Step 2

Create a New User Account with sudo Privileges
For security reasons, it is advisable not to use the root user to run commands but to create a new user with sudo privileges:

useradd username
Enter fullscreen mode Exit fullscreen mode
  • Replace username with your username with Sudo privileges.

Set the User Password

passwd username
Enter fullscreen mode Exit fullscreen mode

You should get the output:

output
Changing password for user username.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
Enter fullscreen mode Exit fullscreen mode

Add User to the sudo Group

usermod -aG wheel username
Enter fullscreen mode Exit fullscreen mode

Switch to Newly Created User

su - username
Enter fullscreen mode Exit fullscreen mode

Then list \root directory content:

sudo ls -l /root
Enter fullscreen mode Exit fullscreen mode

You'll see a banner message the first time you sudo from this account:

output
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for username:
Enter fullscreen mode Exit fullscreen mode

Serve Multiple Applications

Log in to the Server Using Your username with Root Privileges

Our directory structure would look like this:

/var/www/
├── javascriptapp.com
│   └── public_html
├── pythonapp.com
│__ └── public_html
Enter fullscreen mode Exit fullscreen mode

Let's create a directory where your javascript and python application would reside:

sudo mkdir -p /var/www/javascriptapp.com/public_html
sudo mkdir -p /var/www/pythonapp.com/public_html

Enter fullscreen mode Exit fullscreen mode

Important!
To avoid any permission issues, let us change ownership to our username with sudo privileges:

sudo chown -R username: /var/www/javascriptapp.com
sudo chown -R username: /var/www/pythonapp.com
Enter fullscreen mode Exit fullscreen mode

sudo vi /var/www/javascriptapp.com/public_html/index.html

Copy and paste the following lines:

\<!DOCTYPE html>
\<html lang="en" dir="ltr">
  \<head>
    \<meta charset="utf-8">
    \<title>Welcome to javascriptapp.com</title>
  \</head>
  \<body>
    \<h1>Success! javascriptapp.com home page!</h1>
  \</body>
\</html>
Enter fullscreen mode Exit fullscreen mode

Create a Server Block
Server blocks are stored in the /etc/nginx/conf.d directory and must end with .conf

sudo vi /etc/nginx/conf.d/javascriptapp.com.conf
Enter fullscreen mode Exit fullscreen mode

Copy and paste the following lines into the file, remember to replace the server name with your value:

server {
    listen 80;
    listen [::]:80;
    root /var/www/javascriptapp.com/public_html;
    index index.html;
    server_name example.com www.javascriptapp.com;
    access_log /var/log/nginx/javascriptapp.com.access.log;
    error_log /var/log/nginx/javascriptapp.com.error.log;
    location / {
        try_files $uri $uri/ =404;
    }
}
Enter fullscreen mode Exit fullscreen mode

Save the file and check that configuration is right:

sudo nginx -t
Enter fullscreen mode Exit fullscreen mode

Restart Nginx:

sudo systemctl restart nginx
Enter fullscreen mode Exit fullscreen mode

Then visit your server name:
http://javascriptapp.com

NB: This must be a configured DNS to your server else just use the server IP address.

Final Step

Configure Nginx for Node JS Application

Upload node project to /var/www/javascriptapp.com/public_html, build the application and start node application on a designated port.

Edit the application .conf file to look like this:
sudo vi /etc/nginx/conf.d/javascriptapp.com.conf

server {
    listen 80;
    listen [::]:80;
    root /var/www/javascriptapp.com/public_html;
    server_name example.com www.javascriptapp.com;
    access_log /var/log/nginx/javascriptapp.com.access.log;
    error_log /var/log/nginx/javascriptapp.com.error.log;
    location / {
        proxy_pass http://internal_server_ip:node_app_PORT;
        try_files $uri $uri/ =404;
    }
}
Enter fullscreen mode Exit fullscreen mode

NB: You can get the internal_server_ip by running hostname -I on the terminal. See https://www.linuxtrainingacademy.com/determine-public-ip-address-command-line-curl/ for more.

Restart Nginx:

sudo systemctl restart nginx
Enter fullscreen mode Exit fullscreen mode

And visit your server name or IP to verify that your application is served.

Congratulation! Your javascript app is successfully served!
You can follow a similar process to serve your python application in the created directory.

This post is inspired by https://www.linuxtrainingacademy.com/determine-public-ip-address-command-line-curl/

Oldest comments (0)