Wednesday, June 12, 2013

Nginx Virtual Hosts

Now we have Nginx installed (whether via the package manager or from source) we are in a position to serve multiple domains using Virtual Hosts.


Create the layout


Let’s create the basic layout for each domain. In your home directory create a ‘public_html’ folder:


mkdir /home/demo/public_html

Now for each domain you want to host (I use the examples of domain1.com and domain2.com) create a folder with a standard set of sub-folders:


mkdir -p /home/demo/public_html/domain1.com/{public,private,log,backup}

and


mkdir -p /home/demo/public_html/domain2.com/{public,private,log,backup}

That will create the folders public, private, log and backup for each of our domains (domain1.com and domain2.com).


index.html


The content of the public folder is, naturally, up to you but for this example I am going to use a very simple html file so we can check the virtual hosts work.


So for each domain:


nano /home/demo/public_html/domain1.com/public/index.html

Enter something like this into the file:


domain1.com


domain1.com


Repeat the process so you have a similar file for domain2.com (don’t forget to change the index.html content so it shows domain2.com and not domain1.com).


Virtual Hosts Layout


If you have been following the articles for the Nginx install, you will have a ‘Debian’ style layout (using sites-available and sites-enabled folders) whether you installed via the package manager or via source.


As such, we’ll use that layout from now on when creating the virtual hosts.


Virtual Host


Let’s go ahead and create the vhost file for domain1:


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

Remember to adjust the path according to your install. So installing from source would require:


sudo nano /usr/local/nginx/sites-available/domain1.com

The contents look like this:


server {


listen 80;

server_name www.domain1.com;

rewrite ^/(.*) http://domain1.com/$1 permanent;


}


server {


listen 80;

server_name domain1.com;


access_log /home/demo/public_html/domain1.com/log/access.log;

error_log /home/demo/public_html/domain1.com/log/error.log;


location / {


root /home/demo/public_html/domain1.com/public/;

index index.html;


}


}

Note: This example vhost is pretty basic. However, the next article on Nginx virtual hosts will include details of many more settings that are available.


The first server module in the file is a simple rewrite rule that redirects visitors to domain1.com from www.domain1.com.


You can, of course, have this the other way around if you prefer.


The second server module has very basic information including the server_name which is the domain name you want to serve.


It then defines the log locations for easy analysis and finally sets the server root and the index file.


As said, very basic at this stage.


sites-enabled


Last configuration we need to do is to ‘enable’ our site.


This is done with a symlink in the sites-enabled directory as follows:


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

Again, depending on how you installed Nginx, you may need to adjust the paths:


sudo ln -s /usr/local/nginx/sites-available/domain1.com /usr/local/nginx/sites-enabled/domain1.com

Restart Nginx


Although there is a restart option for the Nginx init script, it doesn’t always work as expected and may not facilitate any changes you have made.


As such, I recommend a stop and start approach rather than a simple restart:


sudo /etc/init.d/nginx stop



sudo /etc/init.d/nginx start

Navigate


Now when you navigate to your domain:


http://www.domain1.com


You will see the equivalent of this:


Nice.


Rinse and Repeat


All you need to do for your next virtual host (domain2.com in this example) is to repeat the process.


I know I mention it a lot, but do remember to adjust any paths to match your Nginx installation.


So create a virtual host file:


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

Enter the details as shown above but for domain2.com and then create a symlink in the sites-enabled folder like this:


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

Restart Nginx:


sudo /etc/init.d/nginx stop



sudo /etc/init.d/nginx start

And away you go.


Logs


Remember we defined custom locations for the domain logs?


Well, let’s have a check they are there:


ls /home/demo/public_html/domain1.com/log/



access.log error.log

Excellent, everything is working as we expected and we have our domain logs in a nice and convenient location.


Summary


Setting up virtual hosts with Nginx is a simple process using the sites-available and sites-enabled folders.


Although the example here is quite basic, I hope you can see that getting to grips with Nginx syntax and configurations is not too difficult.


The next article will concentrate on some other settings for use in the virtual hosts file, thus allowing for more control and flexibility for your hosting needs.



Nginx Virtual Hosts

No comments:

Post a Comment