Бегло пробежавшись по этому конфигу понимаешь, почему lighttpd лучше использовать как спаунер cgi процессов или как бэкэнд сервер (для fcgi приложений) обработка входящих url'ов - это не самая сильная сторона этого сервера, несмотря на всю вариативность, гибкостью (как тот же nginx) его разборщик пока не обладает, кроме того реализация виртуальных хостов - это тоже не самая сильная сторона lighttpd, единственное что он хорошо умеет - это cgi и fcgi.
################################ LIGHTTPD.CONF, FRONTEND ##################################
server.username = "apache"
server.groupname = "apache"
server.port = 80
# чуть-чуть вкусностей, чтобы серверу веселей было работать под нагрузкой
server.max-keep-alive-requests = 512
server.max-keep-alive-idle = 30
server.max-read-idle = 60
server.max-write-idle = 360
server.event-handler = "linux-sysepoll"
server.network-backend = "writev" # используем его ибо всё равно сервим большие файлы
server.max-fds = 65535
# загружаемые модули - только то, что необходимо
server.modules = (
# "mod_rewrite",
# "mod_redirect",
"mod_alias",
"mod_access",
# "mod_trigger_b4_dl",
# "mod_auth",
# "mod_status",
"mod_setenv",
# "mod_fastcgi",
"mod_proxy",
# "mod_simple_vhost",
# "mod_evhost",
# "mod_userdir",
# "mod_cgi",
"mod_compress",
# "mod_ssi",
# "mod_usertrack",
"mod_expire",
# "mod_secdownload",
# "mod_rrdtool",
"mod_accesslog" )
server.errorlog = "/var/log/lighttpd/error.log"
accesslog.filename = "/var/log/lighttpd/access.log"
## enable debugging
#debug.log-request-header = "enable"
#debug.log-response-header = "enable"
#debug.log-request-handling = "enable"
#debug.log-file-not-found = "enable"
server.pid-file = "/var/run/lighttpd.pid"
server.document-root = "/var/www/html"
index-file.names = ( "index.php", "index.html", "index.htm", "default.htm", "index.pl" )
static-file.exclude-extensions = ( ".php", ".pl", ".cgi", ".px", ".sh" )
mimetype.assign = (
".pdf" => "application/pdf",
".sig" => "application/pgp-signature",
".spl" => "application/futuresplash",
".class" => "application/octet-stream",
".ps" => "application/postscript",
".torrent" => "application/x-bittorrent",
".dvi" => "application/x-dvi",
".gz" => "application/x-gzip",
".pac" => "application/x-ns-proxy-autoconfig",
".swf" => "application/x-shockwave-flash",
".tar.gz" => "application/x-tgz",
".tgz" => "application/x-tgz",
".tar" => "application/x-tar",
".zip" => "application/zip",
".mp3" => "audio/mpeg",
".m3u" => "audio/x-mpegurl",
".wma" => "audio/x-ms-wma",
".wax" => "audio/x-ms-wax",
".ogg" => "application/ogg",
".wav" => "audio/x-wav",
".gif" => "image/gif",
".jar" => "application/x-java-archive",
".jpg" => "image/jpeg",
".jpeg" => "image/jpeg",
".png" => "image/png",
".xbm" => "image/x-xbitmap",
".xpm" => "image/x-xpixmap",
".xwd" => "image/x-xwindowdump",
".ico" => "image/x-icon",
".css" => "text/css",
".html" => "text/html",
".htm" => "text/html",
".js" => "text/javascript",
".asc" => "text/plain",
".c" => "text/plain",
".cpp" => "text/plain",
".log" => "text/plain",
".conf" => "text/plain",
".text" => "text/plain",
".txt" => "text/plain",
".dtd" => "text/xml",
".xml" => "text/xml",
".mpeg" => "video/mpeg",
".mpg" => "video/mpeg",
".mov" => "video/quicktime",
".qt" => "video/quicktime",
".avi" => "video/x-msvideo",
".asf" => "video/x-ms-asf",
".asx" => "video/x-ms-asf",
".wmv" => "video/x-ms-wmv",
".bz2" => "application/x-bzip",
".tbz" => "application/x-bzip-compressed-tar",
".tar.bz2" => "application/x-bzip-compressed-tar",
# default mime type
"" => "application/octet-stream",
)
#cgi.assign = ( ".pl" => "/usr/bin/perl",
# ".cgi" => "/usr/bin/perl" )
#fastcgi.server = ( ".php" =>
# (( "host" => "127.0.0.1",
# "port" => 9000,
# "bin-path" => "/usr/bin/php-cgi"
# )),
#)
compress.filetype = ("text/plain", "text/html", "text/xml", "image/x-icon")
compress.cache-dir = "/var/www/cache/"
url.access-deny = ( "~", ".inc" )
$HTTP["url"] =~ "\.pdf$" {
server.range-requests = "disable"
}
#$HTTP["url"] =~ "\.php$" {
# setenv.add-response-header = ( "Content-Encoding" => "gzip")
#}
$HTTP["url"] =~ "\.(jpg|gif|png|css|js|ico|html|htm|txt|doc)$" { expire.url = ( "" => "access 10 days" ) }
# вот таким незамысловатым образом мы обходим баг, когда url, который пришёл без индексного файла (просто заканчивается слэшем) не отправляется на бэкэнд, статику, понятно сервим с фронта...
$HTTP["url"] =~ "^/(drupal|joomla|bin)" {
$HTTP["url"] =~ "\.(jpg|gif|png|css|js|ico|html|htm|txt|doc)$" {
expire.url = ( "" => "access 10 days" )
}
$HTTP["url"] !~ "\.(jpg|gif|png|css|js|ico|html|htm|txt|doc)$" {
proxy.server = (
"" => (
"artofmission" => (
"host" => "10.32.2.220",
"port" => 80
)
)
)
}
}
$HTTP["url"] =~ "/(mrepo|distr)" {
dir-listing.activate = "enable"
dir-listing.encoding = "utf-8"
}
alias.url = (
"/manual" => "/var/www/manual",
"/icons" => "/var/www/icons",
"/mrepo" => "/var/www/mrepo",
"/distr" => "/var/www/distr",
"/drupal" => "/var/www/drupal",
"/joomla" => "/var/www/joomla"
)
Отдельно замечу, что lighttpd ответы на проксированные запросы отдаёт клиенту, только когда они полностью придут с бэкэнда, кроме того, до момента отдачи, ответ хранится в оперативной памяти, поэтому нежелательно проксировать запросы например на iso файлы, может просто не хватить оперативки на фронтэнде.
А это конфиг бэкэнда (он расположен на другой тачке), поскольку большого смысла городить что-то сложное не было, то конфиг совсем простой
################################ LIGHTTPD.CONF, BACKEND ##################################
server.username = "apache"
server.groupname = "apache"
server.port = 80
# чуть-чуть вкусностей, чтобы серверу веселей было работать под нагрузкой
server.max-keep-alive-requests = 64
server.max-keep-alive-idle = 30
server.max-read-idle = 60
server.max-write-idle = 360
server.event-handler = "linux-sysepoll"
server.network-backend = "writev"
server.max-fds = 65535
server.modules = (
"mod_alias",
"mod_access",
"mod_setenv",
"mod_fastcgi",
"mod_cgi",
"mod_expire",
"mod_accesslog" )
server.errorlog = "/var/log/lighttpd/error.log"
accesslog.filename = "/var/log/lighttpd/access.log"
## enable debugging
#debug.log-request-header = "enable"
#debug.log-response-header = "enable"
#debug.log-request-handling = "enable"
#debug.log-file-not-found = "enable"
server.pid-file = "/var/run/lighttpd.pid"
server.document-root = "/var/www/html"
index-file.names = ( "index.php", "index.pl", "index.cgi" )
static-file.exclude-extensions = ( ".php", ".pl", ".px", ".cgi", ".sh" )
mimetype.assign = (
".pdf" => "application/pdf",
".sig" => "application/pgp-signature",
".spl" => "application/futuresplash",
".class" => "application/octet-stream",
".ps" => "application/postscript",
".torrent" => "application/x-bittorrent",
".dvi" => "application/x-dvi",
".gz" => "application/x-gzip",
".pac" => "application/x-ns-proxy-autoconfig",
".swf" => "application/x-shockwave-flash",
".tar.gz" => "application/x-tgz",
".tgz" => "application/x-tgz",
".tar" => "application/x-tar",
".zip" => "application/zip",
".mp3" => "audio/mpeg",
".m3u" => "audio/x-mpegurl",
".wma" => "audio/x-ms-wma",
".wax" => "audio/x-ms-wax",
".ogg" => "application/ogg",
".wav" => "audio/x-wav",
".gif" => "image/gif",
".jar" => "application/x-java-archive",
".jpg" => "image/jpeg",
".jpeg" => "image/jpeg",
".png" => "image/png",
".xbm" => "image/x-xbitmap",
".xpm" => "image/x-xpixmap",
".xwd" => "image/x-xwindowdump",
".css" => "text/css",
".html" => "text/html",
".htm" => "text/html",
".js" => "text/javascript",
".asc" => "text/plain",
".c" => "text/plain",
".cpp" => "text/plain",
".log" => "text/plain",
".conf" => "text/plain",
".text" => "text/plain",
".txt" => "text/plain",
".dtd" => "text/xml",
".xml" => "text/xml",
".mpeg" => "video/mpeg",
".mpg" => "video/mpeg",
".mov" => "video/quicktime",
".qt" => "video/quicktime",
".avi" => "video/x-msvideo",
".asf" => "video/x-ms-asf",
".asx" => "video/x-ms-asf",
".wmv" => "video/x-ms-wmv",
".bz2" => "application/x-bzip",
".tbz" => "application/x-bzip-compressed-tar",
".tar.bz2" => "application/x-bzip-compressed-tar",
# default mime type
"" => "application/octet-stream",
)
fastcgi.server = ( ".php" =>
(( "host" => "127.0.0.1",
"port" => 9000,
"bin-path" => "/usr/bin/php-cgi"
)),
)
cgi.assign = ( ".pl" => "/usr/bin/perl",
".px" => "/usr/bin/perl",
".cgi" => "/usr/bin/perl",
".sh" => "/bin/bash" )
url.access-deny = ( "~", ".inc" )
alias.url = ( "/joomla" => "/var/www/joomla",
"/bin" => "/var/www/bin",
"/drupal" => "/var/www/drupal"
)
Отдельно стоит отметить что корень веб-сайта цепляется по nfs, поэтому sendfile не используется, он плохо работает с этой fs.