Nginx server blocks let you run more than one website on a single server. Each block tells Nginx which domain to listen for and where to find that site’s files. You can give each site its own document root, separate log files, and a different SSL certificate.
If you have used Apache before, server blocks are the Nginx equivalent of virtual hosts. The idea is the same — one server, many sites, each with its own settings.
This guide shows you how to set up Nginx server blocks on Ubuntu 18.04, using example.com as the demo domain.
Prerequisites: Nginx installed, a domain name pointing to your server’s public IP address, and sudo access.
Nginx needs to know where each site’s files live. This location is called the document root. A clean way to manage multiple sites is to give each domain its own folder under /var/www/.
The structure looks like this:
/var/www/├── example.com/│ └── public_html/
Each domain gets its own directory. This keeps files organized and makes it straightforward to manage permissions per site.
Create the document root for your domain:
bashsudo mkdir -p /var/www/example.com/public_html
Create a test page so you can confirm the setup works:
/var/www/example.com/public_html/index.html
html<!DOCTYPE html><html lang="en"> <head> <meta charset="utf-8"> <title>Welcome to example.com</title> </head> <body> <h1>Success! example.com home page!</h1> </body></html>
Set the correct ownership so Nginx can read the site files:
bashsudo chown -R www-data: /var/www/example.com
Nginx stores site configuration files in /etc/nginx/sites-available/. A site only goes live when you link its config file into the /etc/nginx/sites-enabled/ directory.
Create a new config file for your domain:
/etc/nginx/sites-available/example.com
nginxserver { listen 80; listen [::]:80; root /var/www/example.com/public_html; index index.html; server_name example.com www.example.com; access_log /var/log/nginx/example.com.access.log; error_log /var/log/nginx/example.com.error.log; location / { try_files $uri $uri/ =404; }} Here is what the key directives do:
server_name — tells Nginx which domain this block responds toroot — points to the folder containing the site’s filesaccess_log and error_log — write traffic and error data to separate files, which makes troubleshooting easier when hosting multiple sitestry_files — serves the requested file or returns a 404 error if it does not existActivate the server block by creating a symlink from sites-available to sites-enabled:
bashsudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
Using a symlink instead of copying the file means you only maintain one version. You can disable a site at any time by removing the symlink without touching the original config file.
Test the Nginx configuration for syntax errors before restarting:
bashsudo nginx -t
Output:
nginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful
Restart Nginx to apply the new configuration:
bashsudo systemctl restart nginx
Open http://example.com in your browser. You should see the test page load.
Your first Nginx server block is now active on Ubuntu 18.04. To host additional domains, repeat the same steps for each one — create its directory, write a config file, and enable it with a symlink. When you are ready to add HTTPS, follow the guide on securing Nginx with a free Let’s Encrypt SSL certificate. Leave a comment below if you run into any issues.
Both git fetch and git pull talk to a remote repository, but they do very different things to your…
Sometimes the change you need already exists, just on the wrong branch. A hotfix lands…
Email is still one of the most important communication channels inside modern applications. Password resets,…
Nginx is a high-performance web server and reverse proxy trusted by some of the largest…
ufw (Uncomplicated Firewall) sits on top of iptables (or nftables on newer systems) and replaces…
When you share a server with a team or investigate unexpected activity, the first question…