Share this page:

Nginx Virtual Servers

Virtual server files are stored in /etc/nginx/sites-available.  When a site is enabled, a file system link is created from the virtual server file in /etc/nginx/sites-available to /etc/nginx/sites-enabled. Nginx looks for virtual server files in /etc/nginx/sites-enabled and uses links to access files in /etc/nginx/sites-available.

Enabling and disabling sites with Nginx

It's customary to name virtual server files after the site that they represent.  If you have a site named, you would put the settings in /etc/nginx/sites-available/ To enable the site, create a link to /etc/nginx/sites-enabled/:

ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/

To disable a site, simply delete the link from /etc/nginx/sites-enabled/:

rm /etc/nginx/sites-enabled/

Nginx needs to be restarted after a site has been enabled or disabled.

Server contexts

Server contexts contain the settings for a virtual server. The following directives are used in server contexts:

  • listen - tell Nginx which port to listen on. The default is port 80. 
  • root - path to the web root directory. The default is /usr/share/nginx/www/
  • index - files that should be served if a directory url is a directory
  • server_name - Nginx will use this virtual host to handle requests with a host field that matches server_name


Locations are defined in server contexts, and they tell Nginx how to handle requests for specific URIs. 

Locations often use the try_files directive to tell Nginx to try a succession of different methods for serving a page.

location / {
    try_files $uri $uri/ /index.html;

This makes Nginx look for a file matching the value stored in $uri.  If the requested URL is, the value of $uri is /foo.html, so Nginx will look for a file called foo.html and serve it if it's available.  If not, Nginx will check to see if there is a directory named /foo/.  If no such directory exists, Nginx will default to serving a page called index.html. 

In the following example, Nginx will default to redirecting the request to index.php, and pass the value of $uri as variable 'q':

location / {
    try_files $uri $uri/ /index.php?q=$uri;

A location can be defined for a specific page:

location = /foo.html {

Locations can be defined for an entire directory:

location /bar/ {

The settings in this location will apply to any URI that starts with '/bar'

Access control

Access to locations can be allowed or denied according to the client's IP address. In this example, access is denied for IP address  This location can be accessed from all other IP addresses on subnet 192.168.1 (the '/24' means that only the first 24 bits of the IP address will be considered). Access from all other IP addresses is diabled.

location = /somefile.html {
    deny all;


Nginx supports the use of variables in its configuration files.  Variables start with a '$'. This page contains a list of all the variables available in Nginx.

For example, if you're hosting several sites on a server, you can use the $host variable to append the host to the end of the root directive.

root /usr/share/nginx/www/$host

This is useful if /usr/share/nginx/www/ contains a directory for each site named after the site's domain name.


More from this category: