Tutorial

How To Set Up nginx Virtual Hosts (Server Blocks) on CentOS 6

Published on June 8, 2012
How To Set Up nginx Virtual Hosts (Server Blocks) on CentOS 6

Status: Deprecated

This article covers a version of CentOS that is no longer supported. If you are currently operating a server running CentOS 6, we highly recommend upgrading or migrating to a supported version of CentOS.

Reason: CentOS 6 reached end of life (EOL) on November 30th, 2020 and no longer receives security patches or updates. For this reason, this guide is no longer maintained.

See Instead:
This guide might still be useful as a reference, but may not work on other CentOS releases. If available, we strongly recommend using a guide written for the version of CentOS you are using.

The following DigitalOcean tutorial may be of interset, as it outlines setting up Nginx Server Blocks on a CentOS 7 server:


About Virtual Hosts

Virtual Hosts are used to run more than one website or domain off of a single virtual private server.Note: according to the nginx website, Virtual Hosts are called Server Blocks on nginx. However, for the sake of easy comparison with Apache, I'll refer to them as virtual hosts throughout this tutorial.

Intro

Make sure that nginx is installed on your VPS. If it is not, you can quickly install it with 2 steps.

Install the EPEL repository:

 su -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm'

Install nginx

yum install nginx

Step One— Create a New Directory

The first step in creating a virtual host is to a create a directory where we will keep the new website’s information.

This location will be your Document Root in the Nginx virtual configuration file later on. By adding a -p to the line of code, the command automatically generates all the parents for the new directory.

sudo mkdir -p /var/www/example.com/public_html

You will need to designate an actual DNS approved domain, or an IP address, to test that a virtual host is working. In this tutorial we will use example.com as a placeholder for a correct domain name.

However, should you want to use an unapproved domain name to test the process you will find information on how to make it work on your local computer in Step Six.

Step Two—Grant Permissions

We need to grant ownership of the directory to the right user, instead of just keeping it on the root system. You can replace the "www" below with the appropriate username.

sudo chown -R www:www /var/www/example.com/public_html

Additionally, it is important to make sure that everyone is able to read our new files.

sudo chmod 755 /var/www

Now you are all done with permissions.

Step Three— Create the Page

We need to create a new file called index.html within the directory we made earlier.

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

We can add some text to the file so we will have something to look at when the the site redirects to the virtual host.

<html>
  <head>
    <title>www.example.com</title>
  </head>
  <body>
    <h1>Success: You Have Set Up a Virtual Host</h1>
  </body>
</html>

Save and Exit

Step Four—Set Up the Virtual Host

The next step is to enter into the nginx configuration file itself.

sudo vi /etc/nginx/conf.d/virtual.conf

The virtual host file is already almost completely set up on your virtual server. To finish up, simply match the following configuration, modifying the server name and file location as needed:

#
# A virtual host using mix of IP-, name-, and port-based configuration
#

server {
    listen       80;
#    listen       *:80;
    server_name  example.com;

    location / {
        root   /var/www/example.com/public_html/;
         index  index.html index.htm;
    }
}

Save and exit.

Step Five—Restart nginx

We’ve made a lot of the changes to the configuration. Restart nginx and make the changes visible.

/etc/init.d/nginx restart

Optional Step Six—Setting Up the Local Hosts

If you have been using an actual domain or IP address to test your virtual servers, you do not need to set up local hosts. However, if you are using a generic domain that you do not own, this will guarantee that, on your computer only, you will be able to customize it.

For this step, make sure you are on the computer itself, not your VPS.

To proceed with this step you need to know your computer’s administrative password, otherwise you will be required to use an actual domain name or your IP address to test the virtual hosts.

Assuming that you do have admin access (gained by typing su and entering the correct password) here is how you can set up the local hosts.

On your local computer, type:

nano /etc/hosts

You can add the local hosts' details to this file, as seen in the example below. As long as line with the IP address and server name is there, directing your browser toward, say, example.com will give you all the virtual host details for the corresponding IP address that you designated.

# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1       localhost

#Virtual Hosts 
12.34.56.789    www.example.com 

However, it may be a good idea to delete these made up addresses out of the local hosts folder when you are done to avoid any future confusion.

Step Seven—See Your Virtual Host in Action

Once you have finished setting up your virtual host, you can see how it looks online. Point your browser to your domain name or IP address, and you should see that the page displays, "Success—You Have Set Up a Virtual Host"

Adding More Virtual Hosts

To create additional virtual hosts, you can just repeat the process above, being careful to set up a new document root with the appropriate new domain name each time. Then just copy and paste the new Virtual Host information into the nginx Config file, as shown below

#
# A virtual host using mix of IP-, name-, and port-based configuration
#

server {
    listen       80;
#    listen       *:80;
    server_name  example.com;

    location / {
        root   /var/www/example.com/public_html/;
         index  index.html index.htm;
    }
}


server {
    listen       80;
#    listen       *:80;
    server_name  example.org;

    location / {
        root   /var/www/example.org/public_html/;
         index  index.html index.htm;
    }
}
By Etel Sverdlov

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about our products

About the author(s)

Etel Sverdlov
Etel Sverdlov
See author profile
Category:
Tutorial

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
40 Comments
Leave a comment...

This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

I’ve just finished setting up a droplet using your: https://www.digitalocean.com/community/articles/how-to-install-linux-nginx-mysql-php-lemp-stack-on-centos-6 (which I copy/pasted my way through without issue).

I have just ran through this guide too on setting up a virtual host. When I tried to access a .php file though, the browser tried to download the content. I assumed the .php config in the /etc/nginx/conf.d/default.conf would have handled it. Instead for my virtual host I am using:

server { listen 80; server_name www.example.com example.com; root /var/www/example.com/public_html/; index index.php index.html index.htm;

try_files    $uri /index.php;

location ~ \.php$ {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

}

The try_files is to push all non-file requests - example.com/some/path/some/var - to the index.php file for typical MVC framework.

Moisey Uretsky
DigitalOcean Employee
DigitalOcean Employee badge
December 17, 2012

If the browser tried to download the PHP file that means that you do not have an interpreter running.

Please make sure that you ran:

sudo service php-fpm restart

Or as root:

service php-fpm restart

This will then run php-fpm which is what nginx will proxy to, to process php scripts.

I tried these configurations, very nice and working all these up to 6th step. but when i tried for virtual hosting, it doesn’t working, I gave them entry in /etc/hosts as ip nginx.com and I changed thier root directories… Why is this no working? Please help

i’ve try the virtual hosts server blocks and it’s success. but when i try to adding more website/multiple site on the virtual.conf, i only get succes for the first site. other site cannot rearch server. i have dig the website and it’s success only for the first site. below is my virtual.conf

A virtual host using mix of IP-, name-, and port-based configuration

server { listen 80;

listen *:80;

server_name  mfaridlutfi.com;

location / {
    root   /var/www/mfaridlutfi.com/public_html/;
 index index.php index.html index.htm;
try_files $uri $uri/ /index.php?q=$uri&$args;
}
    error_page  404              /404.html;
location = /404.html {
    root   /var/www/mfaridlutfi.com/public_html/;
}

error_page   500 502 503 504  /50x.html;
location = /50x.html {
    root   /var/www/mfaridlutfi.com/public_html/;
}
 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

    location ~ \.php$ {
    root           /var/www/mfaridlutfi.com/public_html/;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
    include        fastcgi_params;
}
location ~ /\.ht {
   deny  all;
}

}

server { listen 80;

listen *:80;

server_name designev.com;

location / {
    root   /var/www/designev.com/public_html/;
     index  index.php index.html index.htm;
	 try_files $uri $uri/ /index.php?q=$uri&$args;
}

}

server { listen 80;

listen *:80;

server_name  smartphonereviewers.com;

location / {
    root   /var/www/smartphonereviewers.com/public_html/;
     index  index.php index.html index.htm;
	 try_files $uri $uri/ /index.php?q=$uri&$args;
}

}

the mfaridlutfi.com is success loading, the designev.com and smartphonereviewers cannot reach the server. any help ? thanks

Kamal Nasser
DigitalOcean Employee
DigitalOcean Employee badge
May 6, 2013

@M. Farid lutfi: The websites are loading fine for me. It could be DNS propagation that took a long time.

In case of virtual hosting, the server_name directive must contain both example.com and www.example.com if any of them are omitted then nginx will redirect the missing url request to the default server_name. Example: server { … … server_name defaultwebsite.com … … } server { … … server_name example.com; … … } In this case if you request for www.example.com then nginx will redirect you to the default server name ie defaultwebsite.com It doesn’t matter even if you setup the CNAME record for www.example.com to example.com

The correct form must be server_name example.com www.example.com

yes suggest you update this to have server_name also include www…

This tutorial is currently not working! I tried this and when i go on to my website. It just downloads the index.php file? Any help???

Kamal Nasser
DigitalOcean Employee
DigitalOcean Employee badge
September 1, 2013

@Harsh: This article doesn’t configure nginx to work with php. Do you have php-fpm installed?

Install it if you do not and add this block to your nginx virtualhost config: <a href=“https://p.kk7.me/rowumehile.nginx”>https://p.kk7.me/rowumehile.nginx</a>

Same problem here, I do everything in this tutorial on the droplet I created but it just do the download instead of processing php file. I try service php-fpm restart and it is reports okay but still no success.

Kamal Nasser
DigitalOcean Employee
DigitalOcean Employee badge
October 16, 2013

@romel.verterra: See my comment above.

This worked great. Thanks for the article.

I’m having a problem with multiple domains. I’m hosting two magento sites on same server but only the first is working. This is my virtual.conf:

server { listen 80; server_name www.coopmed.com.br *.coopmed.com.br;

location / {
root   /usr/share/nginx/html;
index index.html index.php; ## Allow a static html file to be shown first
try_files $uri $uri/ @handler; ## If missing pass the URI to Magento's front handler
expires 30d; ## Assume all files are cachable
    rewrite ^/index.php\?action=(.*)$ /$1 last;
}

server {
listen 80;
server_name www.comercill.com.br *.comercill.com.br; 

location / {
root   /usr/share/nginx/html2;
index index.php index.html; ## Allow a static html file to be shown first
try_files $uri $uri/ @handler; ## If missing pass the URI to Magento's front handler
expires 30d; ## Assume all files are cachable
rewrite ^/index.php\?action=(.*)$ /$1 last;
}

I’ve tryed lots of configurations but none worked. If I change the root for both (ex: root /usr/share/nginx/html/coopmed and root /usr/share/nginx/html/comercill) don’t work

(sorry for any mistakes, english isn’t my native language)

Kamal Nasser
DigitalOcean Employee
DigitalOcean Employee badge
October 25, 2013

@felipe.ita: Have you restarted nginx?

<pre>sudo service nginx restart</pre>

Yes, I did. But still don’t work.

Kamal Nasser
DigitalOcean Employee
DigitalOcean Employee badge
October 29, 2013

@felipe.ita: Have you figured it out? If not, please create a community question.

I followed each step of the diaspora install and I went to my domain and it only showed “It Works” page. So I tried to use this manual to set up a virtual host, now I am getting this error my homepage:

403 Forbidden

nginx/1.0.15

@Kamal I’m trying to set up subdomains but no luck. I went ahead and created a CNAME record for test.example.com and it maps to @. I created two server blocks with this config - http://pastebin.com/JtWc3cK6.

What am I missing?

Thanks

Kamal Nasser
DigitalOcean Employee
DigitalOcean Employee badge
January 5, 2014

@chrismckay.me: Replace it with <a href=“https://p.kk7.me/puvakiwufu.nginx”>https://p.kk7.me/puvakiwufu.nginx</a>, restart nginx. Does that fix it?

Worked perfectly thank you.

Also server naming conventions are below and theymay be defined using exact names, wildcard names, or regular expressions:

server {
    listen       80;
    server_name  example.org  www.example.org;
    ...
}

server {
    listen       80;
    server_name  *.example.org;
    ...
}

server {
    listen       80;
    server_name  mail.*;
    ...
}

server {
    listen       80;
    server_name  ~^(?<user>.+)\.example\.net$;
    ...
}

Hope this helps.

Wow thanks for the guide. I followed everything and managed to make it work. just a small question. what is the difference of setting up virtual host on non Centos? i noticed other linux distro like Ubuntu needs to create some softlink and directory like /etc/nginx/sites-available/default and /etc/nginx/sites-available/example.com ?

here’s the link for the Ubuntu version of setting up of virtual host

https://www.digitalocean.com/community/articles/how-to-set-up-nginx-virtual-hosts-server-blocks-on-ubuntu-12-04-lts--3

Kamal Nasser
DigitalOcean Employee
DigitalOcean Employee badge
February 17, 2014

@l33.adrian: The config is the same, the only difference is where to store the files :]

When I reloaded nginx after editing Virtual Hosts I got the following error.

I was having [root@*********** conf.d]# service nginx reload nginx: [warn] conflicting server name “**********” on 0.0.0.0:80, ignored Reloading nginx: [ OK ]

Then I changed the entry as follows. That fixed it! :)

server { listen MYSERVERIP:80;

listen *:80;

server_name  MYDOMAIN.TLD;

location / {
    root   /var/www/MYDOMAIN.TLD/public_html/;
     index  index.html index.htm;
}

}

Thank you very much for this useful tutorial.

Error : [root@indianrockers conf.d]# /etc/init.d/nginx restart nginx: [emerg] “location” directive is not allowed here in /etc/nginx/conf.d/vir tual.conf:18 nginx: configuration file /etc/nginx/nginx.conf test failed

Virtual Conf File : http://pastebin.com/ugEnvj8q

Default Conf File : http://pastebin.com/XWpZrxGK

Any earliest help would be appreciated.

Kamal Nasser
DigitalOcean Employee
DigitalOcean Employee badge
March 4, 2014

@yazirarafath: The location block should be inside the server block, move line 14 to the bottom of the file.

@Kamal Nasser : Is this correct? http://pastebin.com/WVSPBFAR

Another doubt : What am I to do with default.conf? Shall I delete it?

Kamal Nasser
DigitalOcean Employee
DigitalOcean Employee badge
March 5, 2014

@yazirarafath: Yes, that looks fine. You can leave the default.conf file there, it shouldn’t affect other sites.

@Kamal Nasser : I have already hosted a website as per https://digitalocean.com/community/articles/how-to-install-linux-nginx-mysql-php-lemp-stack-on-centos-6.

Now do I need to move the settings of that site from default.conf to virtual.conf or shall I just let the site run as it is and configure the other sites in the virtual host?

Kamal Nasser
DigitalOcean Employee
DigitalOcean Employee badge
March 8, 2014

@yazirarafath: It doesn’t matter – you can store it wherever you want. You should probably move it to another file just so it’s clear where every site’s settings are stored.

If I want to install a CMS for these virtual hosts, although these clients is never going to have directly access to to server itself (through ssh or ftp/sftp) only through a file archive in the CMS, would it then still be considered more secure and a best practice to create a new user for each of these virtual hosts? Would that make it easier to keep an eye on disk usage for each of these in the future? or just complicate stuff as I’m not trying to reinvent PLESK.

Hmmm | am still having issues with the PHP files being downloaded…

In this tutorial (https://www.digitalocean.com/community/articles/how-to-install-linux-nginx-mysql-php-lemp-stack-on-centos-6), I installed nginx, php & mysql and was able to access my website through my IP address AND see my info.php page OK (the PHP file there works till now).

However the php files in my VPS just don’t work. I have restarted both nginx and php fpm, and here is my virtual.conf file:

server { listen 80;

listen *:80;

server_name  website.com www.website.com;

location / {
    root   /var/www/website.com/public_html/;
     index  index.php index.html index.htm;
}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

}

On the other hand, here is my default.conf which displays PHP files OK:

server { listen 80; server_name 000.00.000.000;

location / {
    root   /usr/share/nginx/html;
    index index.php  index.html index.htm;
}

error_page  404              /404.html;
location = /404.html {
    root   /usr/share/nginx/html;
}

error_page   500 502 503 504  /50x.html;
location = /50x.html {
    root   /usr/share/nginx/html;
}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
    root           /usr/share/nginx/html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

}

Please note that this article is a couple years old… I was looking for a few things related to nginx when I came across this article. Another article to set up nginx, links to this for vhost setup, https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-centos-6

However, just by reading the text of this article, it’s a copy and paste hack job of someone trying to put an article together who has no experience with what they are doing. And they create nothing but a mess. The article text also refers to Apache in a few places… There is no Apache config with Nginx…

This is also not the correct way to set of multiple websites… Search google for articles that show you how to use /nginx/sites-available and /nginx/sites-enabled to do it the right way…

This comment has been deleted

    Simple WAY. For Example:Site2.com

    1. Create folder …/html/Site2.com using VSFTP

    2. Create file /etc/nginx/conf.d/virtual.conf

    server {
        listen       80;
    #    listen       *:80;
        server_name  site2.com;
    
        location / {
            root   /usr/share/nginx/html/site2.com/;       
             index index.php index.html index.htm;
        }
    	location ~ .php$ {
            root           /usr/share/nginx/html/site2.com/;   
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
    

    Reboot server.

    1. Go to : https://cloud.digitalocean.com/domains.

    Add site2.com to Droplet ( ADD DOMAIN)

    NAME : @              IP ADDRESS: your droplet IP
    
    
    1. Change NAME SERVER of site2.com to :
    NS1.DIGITALOCEAN.COM
    
    NS2.DIGITALOCEAN.COM
    
    NS3.DIGITALOCEAN.COM
    

    That’s it: http://bestaroundtheweb.com

    By default nginx is configured (nginx.conf) with “user nginx;” But this user does’nt have right permissions How to choose and set the right user for nginx on centos 7?

    Just incase anyone was following this on ubuntu, (maybe CentOS as well) If you have the root and index directives inside of the [location] bracket your virtual servers won’t work. Only the default site will be returned.

    Instead of: server { … location / { root /var/www/example.com/public_html/; index index.html index.htm; }

    It should be:

    server { … root /var/www/example.com/public_html/; index index.html index.htm; location / { … }

    nginxgenerator.com help create nginx virtual host file easily!

    Join the Tech Talk
    Success! Thank you! Please check your email for further details.

    Please complete your information!

    Become a contributor for community

    Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

    DigitalOcean Documentation

    Full documentation for every DigitalOcean product.

    Resources for startups and SMBs

    The Wave has everything you need to know about building a business, from raising funding to marketing your product.

    Get our newsletter

    Stay up to date by signing up for DigitalOcean’s Infrastructure as a Newsletter.

    New accounts only. By submitting your email you agree to our Privacy Policy

    The developer cloud

    Scale up as you grow — whether you're running one virtual machine or ten thousand.

    Get started for free

    Sign up and get $200 in credit for your first 60 days with DigitalOcean.*

    *This promotional offer applies to new accounts only.