How To Install Nginx on Ubuntu 20.04 with Multiple Domains

How To Install Nginx on Ubuntu 20.04 with Multiple Domains

Last updated on | one reply

In this guide we will install and configure Nginx on Ubuntu 20.04. We will also configure some server blocks so we can host multiple domains.

1. Install Nginx

The first step in creating a LEMP stack on Ubuntu 20.04 is by updating the package lists and installing Nginx. Type y and ENTER if prompted.

sudo apt update && sudo apt install nginx

Once installed, check to see if the Nginx service is running.

sudo service nginx status

If Nginx is running correctly, you should see a green Active state below.

 nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2020-04-27 23:05:58 UTC; 2min 26s ago
       Docs: man:nginx(8)
   Main PID: 2433 (nginx)
      Tasks: 2 (limit: 1137)
     Memory: 5.1M
     CGroup: /system.slice/nginx.service
             ├─2433 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
             └─2434 nginx: worker process

Apr 27 23:05:58 ubuntu systemd[1]: Starting A high performance web server and a reverse proxy server...
Apr 27 23:05:58 ubuntu systemd[1]: Started A high performance web server and a reverse proxy server.

You may need to press q to exit the service status.

2. Configure Firewall

If you haven’t already done so, it is recommended that you enable the ufw firewall on Ubuntu 20.04 and add a rule for Nginx. Before enabling ufw firewall, make sure you add a rule for SSH, otherwise you may get locked out of your server if you’re connected remotely.

sudo ufw allow OpenSSH

If you get an error “ERROR: could find a profile matching openSSH”, this probably means you are not configuring the server remotely and can ignore it.

Now add a rule for Nginx.

sudo ufw allow 'Nginx Full'

Output:

Rule added
Rule added (v6)

Enable ufw firewall.

sudo ufw enable

Press y when asked to proceed.

Now check the firewall status.

sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx Full                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx Full (v6)            ALLOW       Anywhere (v6)

Nginx on Ubuntu 20.04 should now be ready to serve web pages.

3. Test Nginx

Go to your web browser and visit your domain or IP. If you don’t have a domain name yet and don’t know your IP, you can find out by running:

ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'
Welcome to Nginx test page

You can find this Nginx default welcome page in the document root directory /var/www/html. To edit this file in nano text editor:

sudo nano /var/www/html/index.nginx-debian.html

To save and close nano, press CTRL + X and then press y and ENTER to save changes.

Your Nginx web server is ready to go. You can now add your own html files and images the the /var/www/html directory as you please.

4. Configure Server Blocks

If you wish to host multiple sites/domains on Nginx, you should now set up your directory structures and Server Blocks.

For the purposes of this guide, we will make a Server Block for mytest1.com and another for mytest2.com. You can substitute these with your own registered domains, or if you don’t have any domains yet, you can still follow this guide and add mytest1.com and mytest2.com to your hosts file to trick your OS into resolving these domains in the browser. We’ll explain how to do this at the end of the guide.

5.1. Create Directories and Set Permissions

Let’s create two new directories in the /var/www/ directory for our two domains.

sudo mkdir -p /var/www/mytest1.com/public_html
sudo mkdir -p /var/www/mytest2.com/public_html

If we want our regular non-root user to be able to modify files in these directories, we must change the ownership.

sudo chown -R $(whoami):$(whoami) /var/www/mytest1.com/public_html
sudo chown -R $(whoami):$(whoami) /var/www/mytest2.com/public_html

The $(whoami) variable will take the value of the user you are currently logged in as.

We must also make sure the permissions for the general web directory /var/www and its contents are set to 755 so that pages can be served correctly.

sudo chmod -R 755 /var/www

5.2. Create Test Web Pages

We’ll now create a simple index.html web page for each domain using the echo command.

Don’t forget to replace mytest1.com with your own domain here if you have one.

sudo echo "Welcome to mytest1.com!" > /var/www/mytest1.com/public_html/index.html

Now do the same for mytest2.com.

sudo echo "Welcome to mytest2.com!" > /var/www/mytest2.com/public_html/index.html

5.3 Create the First Server Block

Nginx contains a default server block in /etc/nginx/sites-available/default which we can use as a template for our own server blocks.

Copy this file to a new file named after your domain. In this example, mytest1.com

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/mytest1.com

Now edit the file you just copied:

sudo nano /etc/nginx/sites-available/mytest1.com

Press CTRL + W and search for default_server;.

/etc/nginx/sites-available/mytest1.com
        listen 80 default_server;
        listen [::]:80 default_server;

Only one server block can have the default_server specification. This tells Nginx which block to revert to if the server_name requested does not match any of the available server blocks.

Remove default_server from the listen directive so it looks likes this.

/etc/nginx/sites-available/mytest1.com
        listen 80;
        listen [::]:80;

Press CTRL + W and search for root /var/www/html;.

Change this root to the path of the directory you created earlier. In our example, /var/www/mytest1.com/public_html

/etc/nginx/sites-available/mytest1.com
    root /var/www/mytest1.com/public_html;

Press CTRL + W and search for server_name _;.

Change this to your domain name. In our example, mytest1.com. We will also add www. here as well.

/etc/nginx/sites-available/mytest1.com
    server_name mytest1.com www.mytest1.com;

Save and exit (press CTRL + X, press Y and then press ENTER)

Ensure the Nginx config file syntax is valid before continuing to the next step.

sudo nginx -t

Output:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

5.4 Create the Second Server Block

We will now create a server block for our other domain name, in this example, mytest2.com.

Firstly, let’s copy the default server block in /etc/nginx/sites-available/default. Copy this file to a new file named after your domain. In this example, mytest2.com

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/mytest2.com

Now edit the file you just copied.

sudo nano /etc/nginx/sites-available/mytest2.com

Press CTRL + W and search for default_server;.

/etc/nginx/sites-available/mytest2.com
        listen 80 default_server;
        listen [::]:80 default_server;

Only one server block can have the default_server specification. This tells Nginx which block to revert to if the server_name requested does not match any of the available server blocks.

Remove default_server from the listen directive so it looks likes this.

/etc/nginx/sites-available/mytest2.com
        listen 80;
        listen [::]:80;

Press CTRL + W and search for root /var/www/html;.

Change this root to the path of the directory you created earlier. In our example, /var/www/mytest2.com/public_html

/etc/nginx/sites-available/mytest2.com
    root /var/www/mytest2.com/public_html;

Press CTRL + W and search for server_name _;.

Change this to your domain name. In our example, mytest2.com. We will also add www. here as well.

/etc/nginx/sites-available/mytest2.com
    server_name mytest2.com www.mytest2.com;

Save and exit (press CTRL + X, press Y and then press ENTER)

Ensure the Nginx config file syntax is valid before continuing to the next step.

sudo nginx -t

Output:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

6. Create Symbolic Links

We will now create symbolic links from the sites-available directory to the sites-enabled directory, which Nginx reads during startup. Be sure to replace mytest1.com and mytest2.com with your own domains if you have them.

sudo ln -s /etc/nginx/sites-available/mytest1.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/mytest2.com /etc/nginx/sites-enabled/

We can also remove the symbolic link for the default server block.

sudo rm /etc/nginx/sites-enabled/default

Now restart Nginx.

sudo service nginx restart

7. Test Nginx

Assuming you have already configured DNS on your domain registrar to point your domains to the IP of your Nginx server, you should now be able to view these test web pages in the browser. If you don’t have any domains and just want to test mytest1.com and mytest2.com, continue to the next step.

Nginx web page test

8. Edit Hosts file (optional)

If you do not have any domains registered and instead just want to load mytest1.com and mytest2.com as a test, you can edit the hosts file in your OS to point these domains to your server.

To edit hosts file in Linux or Mac, run sudo nano /etc/hosts. In Windows, follow this guide to edit hosts. Once hosts files is open, enter two new lines hosts

x.x.x.x mytest1.com
x.x.x.x mytest2.com

Replace x.x.x.x with your web server’s IP.

If you don’t know your web server’s IP, you can find out with:

ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

Once you’ve saved you hosts file, you should be able to access mytest1.com and mytest2.com in your browser.

What Next?

Now that you have your Nginx server tested and working on Ubuntu 20.04, the next step is to install MySQL, PHP and phpMyAdmin.

Let me know if this helped. Follow me on Twitter, Facebook and YouTube, or 🍊 buy me a smoothie.

1 reply

Leave a reply

Your email address will not be published. Required fields are marked *