Introduction
In this tutorial I'm going to cover how to install Nginx on an Ubuntu 20.04 server. Additionally I'm going to setup a simple website and create the configuration within Nginx to make the website available.
Prerequisites
- Setup Ubuntu 20.04
- A domain name, e.g.
example.comwith anAand optionaly anAAAADNS record pointing to your server.
Example terminology
- Username: holu
- IPv4: 10.0.0.1
- Domain: example.com
Please replace holu with an own username, 10.0.0.1 with your own IP address and example.com with your own domain in all example commands.
Step 1 - Login to server
Login to your server using a user with sudo privileges:
ssh holu@10.0.0.1Step 1.1 - Update your server
After a successful login, we need to update our server.
For this we run the following command:
holu@10.0.0.1:~$ sudo apt-get update && sudo apt-get upgrade -yStep 2 - Install Nginx
We will install Nginx with the help of apt.
For this execute the following command:
holu@10.0.0.1:~$ sudo apt install nginxStep 3 - Update the firewall
In the previous tutorial we set up a firewall, which blocks all connections except the ones from OpenSSH.
Now, to be able to use Nginx we need to allow it within the firewall.
Step 3.1 - List available ufw applications
To know what to activate within ufw we will first list all available applications, which we could enable.
holu@10.0.0.1:~$ sudo ufw app listThis will lead to the following output:
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSHNginx HTTPwill only allowHTTPtraffic and will open for this port80.Nginx HTTPSwill only allowHTTPStraffic and will open for this port443.Nginx Fullwill allow bothHTTPandHTTPStraffic and will open port80and443.
You should only allow the most restrictive option for production.
As we are still testing things out and haven't setup SSL yet, we will choose Nginx HTTP.
Step 3.2 - Adapt the ufw configuration
To tell ufw that it should allow all HTTP traffic we need to run the following command:
holu@10.0.0.1:~$ sudo ufw allow 'Nginx HTTP'Confirm your changes by running the following command:
holu@10.0.0.1:~$ sudo ufw statusIt should output the following:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)Step 4 - Check Nginx
Now that the firewall allows HTTP connections to Nginx we can check if everything works correct.
For this we're going to check the status of Nginx with the systemd service:
holu@10.0.0.1:~$ systemctl status nginxAnd if everything worked out correct, this should be your output:
● 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 Sat 2021-08-21 17:54:37 CEST; 21min ago
Docs: man:nginx(8)
Main PID: 6370 (nginx)
Tasks: 2 (limit: 2280)
Memory: 4.1M
CGroup: /system.slice/nginx.service
├─6370 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
└─6371 nginx: worker processWe can also verify the status by navigating to our IP address in the browser: http://10.0.0.1.
You should be greeted by the following message:
Step 5 - Configure a website
Now, we are going to configure a test website and point our domain example.com to it.
Step 5.1 - Create the content directory
The content which will be provided by Nginx can be found here: /var/www/.
Currently there is only the html directory which contains the webpage we just saw.
For our new website we are going to create a new directory.
holu@10.0.0.1:~$ sudo mkdir -p /var/www/example.com/htmlBefore continuing we need to verify that our new directory has the right permissions. We do this with the following command:
holu@10.0.0.1:~$ sudo chown -R $USER:$USER /var/www/example.com/htmlStep 5.2 - Create a sample website
After creating the directory we are going to create a simple index.html:
holu@10.0.0.1:~$ sudo nano /var/www/example.com/html/index.htmlInsert the following sample content or create your own message!
<!doctype html>
<html>
<head>
<title>This is our test website</title>
</head>
<body>
<p>Hello, holu!</p>
</body>
</html>Step 5.3 - Configure Nginx Server Block
Now that we have our website ready we need to create a so called Server Block which tells Nginx where to point requests for our server to.
For this we are creating a new file within the /etc/nginx/sites-available directory:
holu@10.0.0.1:~$ sudo nano /etc/nginx/sites-available/example.comAdd the following basic configuration and adapt it to your directory and domain:
server {
listen 80;
server_name example.com;
root /var/www/example.com/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}You can find other example configurations here.
Step 5.4 - Activate the Server Block
To enable the Server Block we need to create a link in the directory /etc/nginx/sites-enabled/ which points to /etc/nginx/sites-available/example.com.
holu@10.0.0.1:~$ sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/Step 5.5 - Adjust the server_names_hash_bucket_size
A good explanation for this problem can be found here.
To circumvent it we need to adjust the nginx.conf:
holu@10.0.0.1:~$ sudo nano /etc/nginx/nginx.confFind the following line:
# server_names_hash_bucket_size 64;And uncomment it. It should look like this now:
server_names_hash_bucket_size 64;Step 5.6 - Test Nginx configuration
Now, that all necessary changes were made we can test our Nginx configuration.
For this execute the following command:
holu@10.0.0.1:~$ sudo rm /etc/nginx/sites-enabled/default && sudo rm /etc/nginx/sites-available/default
holu@10.0.0.1:~$ sudo nginx -tIf your output looks as following you did everything right!
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successfulStep 5.7 - Reload Nginx
After confirming our setup of Nginx we can now reload it and make our changes active.
holu@10.0.0.1:~$ sudo systemctl reload nginxWe can now visit our new website. Open http://example.com in your browser and you should see our simple test website.
Conclusion
We were able to install Nginx and configure it to point to our new website.
To add an SSL Certificate to your website follow this article: Add SSL Certificate with Lets Encrypt to Nginx on Ubuntu 20.04