Last time I wrote about setting and installing lighttpd web server.
Virtual hosting allows sharing a lighttpd web server so that you can have multiple domains hosted on single web server. For example:
=> www.nixcraft.com
=> www.cyberciti.biz
=> www.theos.in etc
Our setup
Lighttpd supports both Name-based and IP-based virtual hosts. Let us see how to configure two web sites for:
=> www.nixcraft.com
=> www.theos.in
First create a directory for each domain:
# mkdir -p /home/lighttpd/nixcraft.com/http
# mkdir -p /home/lighttpd/theos.in/http
# chown lighttpd:ftpuser1 /home/lighttpd/nixcraft.com/http
# chown lighttpd:ftpuser2 /home/lighttpd/theos.in/http
Replace ftpuser1 and 2 with actual ftp username.
Also create a log directory for each domain:
# mkdir /var/log/lighttpd/nixcraft.com
# mkdir /var/log/lighttpd/theos.in
Only allow a web server to access our logs:
# chown -R lighttpd:lighttpd /var/log/lighttpd
Open lighttpd configuration file:
# vi /etc/lighttpd/lighttpd.conf
Add support for domain nixcraft.com:
$HTTP["host"] =~ "(^|\.)nixcraft\.com$" {
server.document-root = "/home/lighttpd/nixcraft.com/http"
server.errorlog = "/var/log/lighttpd/nixcraft/error.log"
accesslog.filename = "/var/log/lighttpd/nixcraft/access.log"
server.error-handler-404 = "/e404.php"
}
Add support for domain theos.in:
$HTTP["host"] =~ "(^|\.)theos\.in$" {
server.document-root = "/home/lighttpd/theos.in/http"
server.errorlog = "/var/log/lighttpd/theos.in/error.log"
accesslog.filename = "/var/log/lighttpd/theos.in/access.log"
server.error-handler-404 = "/e404.php"
}
Where,
- $HTTP["host"] =~ "(^|\.)theos\.in$" : It will match request for both www.theos.in and theos.in domain
- server.document-root = "/home/lighttpd/theos.in/http" : Server document root. You must set ftp/ssh user home directory to this root only
- server.errorlog = "/var/log/lighttpd/theos.in/error.log" : Server access log file
- accesslog.filename = "/var/log/lighttpd/theos.in/access.log": Server error log file
- server.error-handler-404 = "/e404.php" : Web server error 404 handler file
Save and close the file. Restart the server:
# /etc/init.d/lighttpd restart
Upload file(s) to respective web-root and test your configuration with a web browser.
Featured Articles:
- 20 Linux System Monitoring Tools Every SysAdmin Should Know
- 20 Linux Server Hardening Security Tips
- Linux: 20 Iptables Examples For New SysAdmins

- My 10 UNIX Command Line Mistakes
- 25 PHP Security Best Practices For Sys Admins
- The Novice Guide To Buying A Linux Laptop
- Top 5 Email Client For Linux, Mac OS X, and Windows Users
- Top 20 OpenSSH Server Best Security Practices
- Top 10 Open Source Web-Based Project Management Software
Facebook it - Tweet it - Print it -
We're here to help you make the most of sysadmin work. So, subscribe!


{ 24 comments… read them below or add one }
Hi,
I have been trying to setting up this virtual host for my server. However, I am running into this problem where the error log is not stored in the right directory. I have followed everything in your guide. The only difference is that instead of using host, I am using ip based address. It seems like the error will store in the the directory that list ed last first.
For example:
$SERVER["socket"] == “a.b.c.d:80″ {
server.document-root = “/var/www/html/a.b.c.d/”
server.errorlog = “/var/log/lighttpd/a.b.c.d/error.log”
}
$SERVER["socket"] == “1.2.3.4:80″ {
server.document-root = “/var/www/html/1.2.3.4/”
server.errorlog = “/var/log/lighttpd/1.2.3.4/error.log”
}
The error will store in 1.2.3.4 directory. Do you know if there’s a solution to that? Any help would be greatly appreciated. Thanks in advance.
Calvin
I’m sorry but I don’t get your problem. Can you explain more..???
It seems that you can only define server.errorlog once in lighty configuration. ie. one errorlog for the whole server and all vhosts.
Yes. The server.errorlog doesn’t work on a per virtualhost basis. Is that a bug or by design?
Thanks.
Please check the permissions of your log files
is the user is root or lighttpd or the user u have created.
Must note that logfolder/files have lighttpd as owner not root
Hi after all the settings done as aforesaid when i try to run my site in browser it give me an error while if i open my site trough IP of the server then it vl open
in server.bind i m using IP address and and i m trying to open my site http://www.ques.example.com.
server.port = 90
when in browser i type http://1.2.3.4:90 it will open my default page
but if i type http://www.ques.example.com then gives me error problem loading page.
How to handle this error.
pls help me
opening site in browser with port number
http://www.ques.example.com:90
can lighttpd do this kind of virtual hosting (www.domain.com/~user/)?
shiato
linux newbie
Regular reader of articles. Just one thing I can’t get sorted out here. What I haven’t done yet that is preventing Lighttpd from running. Error: “can’t find name apache” A clue to sort this out would be great!
Thanks for this, I have migrated from apache to lighttpd on my VPS and it has meant that I don’t have to upgrade my VPS memory any more!
Saved me some money!
Calvin Chan, rxKaffee, and ligesh are right, lighttpd only uses the server.errorlog which appears last in the config file, regardless of any conditionals.
i wish you would test your config to make sure it works before posting bogus “tutorials” like this.
I am all confused. I have installed lighttpd on my embedded linux box. If this box is connected to the pc via USB, I am able to access the webserver. But if I configure the server for some static ip, say a.b.c.d and try to access it by typing http://a.b.c.d:80, I do not get anything at all.
Do we have to do anything (some change in the .conf file). What is ipv6 and ipv4 all about?
A quick note why might this exacmple not match.
$HTTP["host"] =~ “(^|\.)nixcraft\.com$” {
http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:Configuration
A port number might be appended to the end…so..
$HTTP["host"] =~ “(^|\.)nixcraft\.com(\:[0-9]*)?$”
Is probably a better guess. This worked for me. Cheers.
I had to add my virtual hostname in /etc/hosts as well:
127.0.0.1 localhost
127.0.1.1 vhost1 # which is defined in /etc/lighttp/vhosts.conf
hello,
I mention the ftp username, where is the pass?
Hi,
Please can you find out why this error log is creating. its increasing day by day. Please tell me a solution to delete this file when it is more than 10 mb.
[Tue Sep 08 11:08:31 2009] [error] [client 66.249.68.241] File does not exist: /var/www/vhosts/louis
ville-car-dealers.com/httpdocs/robots.txt
[Wed Sep 09 00:20:51 2009] [error] [client 72.30.161.235] File does not exist: /var/www/vhosts/louis
ville-car-dealers.com/httpdocs/robots.txt
[Wed Sep 09 13:43:39 2009] [error] [client 74.6.22.177] File does not exist: /var/www/vhosts/louisvi
lle-car-dealers.com/httpdocs/robots.txt
[Thu Sep 10 18:56:31 2009] [error] [client 66.249.68.249] File does not exist: /var/www/vhosts/louis
ville-car-dealers.com/httpdocs/robots.txt
[Fri Sep 11 00:21:22 2009] [error] [client 66.249.68.212] File does not exist: /var/www/vhosts/louis
ville-car-dealers.com/httpdocs/robots.txt
[Wed Sep 16 00:36:03 2009] [error] [client 74.6.22.163] File does not exist: /var/www/vhosts/louisvi
lle-car-dealers.com/httpdocs/robots.txt
[Wed Sep 16 05:43:16 2009] [error] [client 66.249.68.249] File does not exist: /var/www/vhosts/louis
ville-car-dealers.com/httpdocs/robots.txt
[Wed Sep 16 10:37:25 2009] [error] [client 69.58.178.33] File does not exist: /var/www/vhosts/louisv
ille-car-dealers.com/httpdocs/robots.txt
[Wed Sep 16 10:37:26 2009] [error] [client 69.58.178.33] File does not exist: /var/www/vhosts/louisv
ille-car-dealers.com/httpdocs/robots.txt
[Wed Sep 16 15:58:09 2009] [error] [client 72.30.87.125] File does not exist: /var/www/vhosts/louisv
ille-car-dealers.com/httpdocs/robots.txt
[Thu Sep 17 03:06:00 2009] [error] [client 76.73.37.234] File does not exist: /var/www/vhosts/louisv
ille-car-dealers.com/httpdocs/robots.txt
[Thu Sep 17 07:21:51 2009] [error] [client 64.246.161.42] File does not exist: /var/www/vhosts/louis
ville-car-dealers.com/httpdocs/robots.txt
[Sat Sep 19 02:22:02 2009] [error] [client 76.73.3[Sat Sep 26 11:05:18 2009] [error] [client 66.249.
71.211] File does not exist: /var/www/vhosts/louisville-car-dealers.com/httpdocs/robots.txt
[Sat Sep 26 20:40:23 2009] [error] [client 64.246.161.30] File does not exist: /var/www/vhosts/louisville-car-dealers.com/httpdocs/robots.txt
Thanks..really helpful..
I was scratching my head to host multiple domains on my vps..
Vamsi
My newdomain-script lighttpd&mod_mysql_vhost&wordpress_permalink
#!/bin/sh echo "Enter new zone" read zone echo "Enter new domain" read domain echo "Your new domain is $domain.$zone" if [ ! -d /var/www/servers/$domain.$zone ]; then mkdir /var/www/servers/$domain.$zone mkdir /var/www/servers/$domain.$zone/www && chown www-data:www-data /var/www/servers/$domain.$zone/www mkdir /var/www/servers/$domain.$zone/logs && chown www-data:www-data /var/www/servers/$domain.$zone/logs mkdir /var/www/servers/$domain.$zone/cgi && chown www-data:www-data /var/www/servers/$domain.$zone/cgi mkdir /var/www/servers/$domain.$zone/subdomain && chown www-data:www-data /var/www/servers/$domain.$zone/subdomain fi echo '$HTTP["host"] =~ "(^|\.)'$domain'\.'$zone'$" {' > /etc/lighttpd/vhosts/50-$domain.$zone.conf echo 'server.document-root = "/var/www/servers/'$domain'.'$zone'/www/"' >> /etc/lighttpd/vhosts/50-$domain.$zone.conf echo 'accesslog.filename = "/var/www/servers/'$domain'.'$zone'/logs/access.log"' >> /etc/lighttpd/vhosts/50-$domain.$zone.conf echo 'server.errorlog = "/var/www/servers/'$domain'.'$zone'/logs/error.log"' >> /etc/lighttpd/vhosts/50-$domain.$zone.conf echo '#server.error-handler-404 = "/"' >> /etc/lighttpd/vhosts/50-$domain.$zone.conf echo '# Wordpress Permalinks' >> /etc/lighttpd/vhosts/50-$domain.$zone.conf echo 'include "wp-rewrite.conf"' >> /etc/lighttpd/vhosts/50-$domain.$zone.conf echo '}' >> /etc/lighttpd/vhosts/50-$domain.$zone.conf echo "[client]" > /home/user/.my.cnf echo "port = 3306" >> /home/user/.my.cnf echo "socket = /var/run/mysqld/mysqld.sock" >> /home/user/.my.cnf echo "default-character-set=utf8" >> /home/user/.my.cnf echo "user=inshttpd" >> /home/user/.my.cnf echo "password=qwertyui" >> /home/user/.my.cnf echo "insert into "'`domains`'" ("'`domain`'", "'`docroot`'") values ('$domain.$zone', '/var/www/servers/$domain.$zone/www');"\ > /tmp/$domain.$zone.sql /usr/bin/mysql httpd /dev/null wp-rewrite.conf# Wordpress Permalinks url.rewrite-once = ( "^/(wp-.+).*/?" => "$0", "^/images/.*/?" => "$0", "^/temp/.*/?" => "$0", "^/(sitemap.xml)" => "$0", "^/(xmlrpc.php)" => "$0", "^/keyword/([A-Za-z_0-9\-]+)/?$" => "/index.php?keyword=$1", "^/.*?(\?.*)?$" => "/index.php$1" )I just wanted to say thanks, this post helped me get all of my virtual host’s back up and running in no time! I had been using ispconfig3 prior and decided why have extra bloat when I can do it myself with just a little work, and this proved to be much better then what I had before! It’s noticably faster and I can’t thank you enough!
Also I noticed that user lighttpd wasn’t created however www-data worked fine, is this a problem to be using this user:group instead of lighttpd:lighttpd security wise or other?
Thanks again!
thanks for the inputs. this works for me.
http://localhost:8081/
$SERVER["socket"] == “:8081″ {
server.document-root = “/var/www/app_name/”
server.errorlog = “/var/log/lighttpd/app_name/error.log”
}
hi,
I am facing the problem in linking the cgi script to the HTML page . whenever i try to open it in the web browser a 404 error appears.
cgi.assign = ( “.cgi” => “http://ip-address/mnt/apps/web/cgi-bin/” )
$SERVER["socket"] == “:80″ {
}
My cgi bin has a .cgi file in it.
Hi,
Re:
# chown lighttpd:ftpuser1 /home/lighttpd/nixcraft.com/http
# chown lighttpd:ftpuser2 /home/lighttpd/theos.in/http
Please shed me some light on the groups “ftpuser1″ and “ftpuser2″. What they are? Thanks.
Neither I have user “lighttpd”. Whether run “addusr” to add it?
B.R.
satimis
In the first step you create a directory for logs:
# mkdir /var/log/lighttpd/nixcraft.com
but later you create a file server.errorlog = “/var/log/lighttpd/nixcraft/error.log”
Did you mean server.errorlog = “/var/log/lighttpd/nixcraft.com/error.log ?
Is probably the biggest handicap for lighttpd, guys it’s not possible to set error log for each vhost like apache,nginx etc.
So this conditionnal will not work :
$HTTP["host"] =~ “(^|\.)nixcraft\.com$” {
>>>> server.errorlog = “/var/log/lighttpd/nixcraft/error.log”
}
You have one lighttpd running, so one error.log, so says one of the developers of lighty
> http://redmine.lighttpd.net/issues/665#note-15
The only method is to track the errors by hand on the script or other, example : http://redmine.lighttpd.net/issues/665#note-24
I will repeat what was said above, lighttpd is designed like that, let’s wait for a patch or other, who knows ?
Nassou.