1================== 2Configuration File 3================== 4 5------------ 6Module: core 7------------ 8 9:Author: Jan Kneschke 10:Date: $Date$ 11:Revision: $Revision$ 12 13:abstract: 14 the layout of the configuration file 15 16.. meta:: 17 :keywords: lighttpd, configuration 18 19.. contents:: Table of Contents 20 21Description 22=========== 23 24Basic Syntax 25------------ 26 27A BNF like notation: :: 28 29 option : NAME = VALUE 30 merge : NAME += VALUE 31 NAME : modulename.key 32 VALUE : ( <string> | <integer> | <boolean> | <array> | VALUE [ + VALUE ]*) 33 <string> : "text" 34 <integer>: digit* 35 <boolean>: ( "enable" | "disable" ) 36 <array> : "(" [ <string> "=>" ] <value> [, [ <string> "=>" ] <value> ]* ")" 37 INCLUDE : "include" VALUE 38 INCLUDE_SHELL : "include_shell" STRING_VALUE 39 40Example 41------- 42 43:: 44 45 # default document-root 46 server.document-root = "/var/www/example.org/pages/" 47 48 # TCP port 49 server.port = 80 50 51 # selecting modules 52 server.modules = ( "mod_access", "mod_rewrite" ) 53 54 # variables, computed when config is read. 55 var.mymodule = "foo" 56 server.modules += ( "mod_" + var.mymodule ) 57 # var.PID is initialised to the pid of lighttpd before config is parsed 58 59 # include, relative to dirname of main config file 60 include "mime.types.conf" 61 62 # read configuration from output of a command 63 include_shell "/usr/local/bin/confmimetype /etc/mime.types" 64 65 66Conditional Configuration 67========================= 68 69Most options can be configured conditionally by using the following syntax 70(including nesting). 71 72:: 73 74 <field> <operator> <value> { 75 ... 76 <field> <operator> <value> { 77 ... nesting: match only when parent match 78 } 79 } 80 else <field> <operator> <value> { 81 ... the "else if" block 82 } 83 84where <field> is one of one of the following: 85 86$HTTP["cookie"] 87 match on cookie 88$HTTP["scheme"] 89 match on scheme 90$HTTP["host"] 91 match on host 92$HTTP["useragent"] 93$HTTP["user-agent"] 94 match on useragent 95$HTTP["referer"] 96 match on referer 97$HTTP["method"] 98 math on the http method 99$HTTP["url"] 100 match on url 101$HTTP["query-string"] 102 match on the (not decoded) query-string 103$HTTP["remoteip"] 104$HTTP["remote-ip"] 105 match on the remote IP or a remote Network 106$HTTP["language"] 107 match on the Accept-Language header 108$SERVER["socket"] 109 match on socket. Value must be on the format "ip:port" where ip is an IP 110 address and port a port number. Only equal match (==) is supported. 111 It also binds the daemon to this socket. Use this if you want to do IP/port- 112 based virtual hosts. 113 114<operator> is one of: 115 116== 117 string equal match 118!= 119 string not equal match 120=~ 121 perl style regular expression match 122!~ 123 perl style regular expression not match 124 125and <value> is either a quoted ("") literal string or regular expression. 126 127 128Example 129------- 130 131:: 132 133 # disable directory-listings for /download/* 134 dir-listing.activate = "enable" 135 $HTTP["url"] =~ "^/download/" { 136 dir-listing.activate = "disable" 137 } 138 139 # handish virtual hosting 140 # map all domains of a top-level-domain to a single document-root 141 $HTTP["host"] =~ "(^|\.)example\.org$" { 142 server.document-root = "/var/www/htdocs/example.org/pages/" 143 } 144 145 # multiple sockets 146 $SERVER["socket"] == "127.0.0.1:81" { 147 server.document-root = "..." 148 } 149 150 $SERVER["socket"] == "127.0.0.1:443" { 151 ssl.pemfile = "/var/www/certs/localhost.pem" 152 ssl.engine = "enable" 153 154 server.document-root = "/var/www/htdocs/secure.example.org/pages/" 155 } 156 157 # deny access for all googlebot 158 $HTTP["useragent"] =~ "Google" { 159 url.access-deny = ( "" ) 160 } 161 162 # deny access for all image stealers 163 $HTTP["referer"] !~ "^($|http://www\.example\.org)" { 164 url.access-deny = ( ".jpg", ".jpeg", ".png" ) 165 } 166 167 # deny the access to www.example.org to all user which 168 # are not in the 10.0.0.0/8 network 169 $HTTP["host"] == "www.example.org" { 170 $HTTP["remoteip"] != "10.0.0.0/8" { 171 url.access-deny = ( "" ) 172 } 173 } 174 175Using variables 176=============== 177 178You can set your own variables in the configuration to simplify your config. 179:: 180 181 var.basedir = "/home/www/servers/" 182 $HTTP["host"] == "www.example.org" { 183 server.name = "www.example.org" 184 include "incl-base.conf" 185 } 186 187 in incl-base.conf: 188 server.document-root = basedir + server.name + "/pages/" 189 accesslog.filename = basedir + server.name + "/logs/access.log" 190 191You can also use environment variables or the default variables var.PID and 192var.CWD: :: 193 194 var.basedir = env.LIGHTTPDBASE 195 196 $HTTP["host"] == "www.example.org" { 197 server.name = "www.example.org" 198 include "incl-base.conf" 199 include "incl-fastcgi.conf" 200 } 201 202 in incl-fastcgi.conf: 203 fastcgi.server = ( ... => (( 204 "socket" => basedir + server.name + "/tmp/fastcgi-" + PID + ".sock" 205 )) ) 206 207Or like the lighttpd script for rails does: 208 209 var.basedir = var.CWD 210 211 server.document-root = basedir + "/public/" 212 213Global context 214============== 215 216:: 217 218 global { 219 ... 220 } 221 222You don't need it in the main configuration file. But you might have 223difficulty setting server wide configuration inside a included-file from 224conditionals. 225 226Example 227------- 228 229:: 230 231 in lighttpd.conf: 232 server.modules = () 233 $HTTP["host"] == "www.example.org" { 234 include "incl-php.conf" 235 } 236 237 in incl-php.conf: 238 global { 239 server.modules += ("mod_fastcgi") 240 static-file.exclude-extensions += (".php") 241 } 242 fastcgi.server = "..." 243 244Options 245======= 246 247server module 248------------- 249 250main sections 251````````````` 252 253server.document-root 254 document-root of the webserver 255 256 This variable has the specified as it will be used for all requests 257 without a Host: header and for all with a know hostname which you 258 might have specified with one of the above conditionals. 259 260 Default: no default, required 261 262server.bind 263 IP address, hostname or absolute path to the unix-domain socket the server 264 listen on. 265 266 Default: bind to all interfaces 267 268 Example: :: 269 270 server.bind = "127.0.0.1" 271 server.bind = "www.example.org" 272 server.bind = "/tmp/lighttpd.socket" 273 274server.port 275 tcp-port to bind the server to 276 277.. note:: port belows 1024 require root-permissions 278 279 Default: 80 (443 if ssl is enabled) 280 281server.use-ipv6 282 bind to the IPv6 socket 283 284server.defer-accept 285 set TCP_DEFER_ACCEPT to the specified value on the socket if the value is > 0 286 and TCP_DEFER_ACCEPT is available on the platform (linux2.4+) 287 288 Default: 0 289 290server.bsd-accept-filter 291 set SO_ACCEPTFILTER on listen sockets (*BSD systems, e.g. FreeBSD) 292 e.g. server.bsd-accept-filter = "httpready" 293 or server.bsd-accept-filter = "dataready" 294 295 Default: "" (none) 296 297server.tag 298 set the string returned by the Server: response header 299 300 Default: lighttpd <current-version> 301 302server.errorlog 303 pathname of the error-log 304 305 Default: either STDERR or ``server.errorlog-use-syslog`` 306 307server.errorlog-use-syslog 308 send errorlog to syslog 309 310 Default: disabled 311 312server.chroot 313 root-directory of the server 314 315 NOTE: requires root-permissions 316 317server.username 318 username used to run the server 319 320 NOTE: requires root-permissions 321 322server.groupname 323 groupname used to run the server 324 325 NOTE: requires root-permissions 326 327server.follow-symlink 328 allow to follow-symlinks 329 330 Default: enabled 331 332index-file.names 333 list of files to search for if a directory is requested 334 e.g.: :: 335 336 index-file.names = ( "index.php", "index.html", 337 "index.htm", "default.htm" ) 338 339 if a name starts with slash this file will be used a index generator 340 for all directories. 341 342server.modules 343 modules to load 344 345.. note:: the order of the modules is important. 346 347 The modules are executed in the order as they are specified. Loading 348 mod_auth AFTER mod_fastcgi might disable authentication for fastcgi 349 backends (if check-local is disabled). 350 351 As auth should be done first, move it before all executing modules (like 352 proxy, fastcgi, scgi and cgi). 353 354 rewrites, redirects and access should be first, followed by auth and 355 the docroot plugins. 356 357 Afterwards the external handlers like fastcgi, cgi, scgi and proxy and 358 at the bottom the post-processing plugins like mod_accesslog. 359 360 e.g.: :: 361 362 server.modules = ( "mod_rewrite", 363 "mod_redirect", 364 "mod_alias", 365 "mod_access", 366 "mod_auth", 367 "mod_authn_file", 368 "mod_status", 369 "mod_simple_vhost", 370 "mod_evhost", 371 "mod_userdir", 372 "mod_fastcgi", 373 "mod_proxy", 374 "mod_cgi", 375 "mod_ssi", 376 "mod_deflate", 377 "mod_expire", 378 "mod_rrdtool", 379 "mod_accesslog" ) 380 381 Starting with lighttpd 1.4.0 three default modules are loaded automatically: 382 383 - mod_indexfile 384 - mod_dirlisting 385 - mod_staticfile 386 387server.event-handler 388 set the event handler 389 390 Default: "poll" 391 392server.pid-file 393 set the name of the .pid-file where the PID of the server should be placed. 394 This option is used in combination with a start-script and the daemon mode 395 396 Default: not set 397 398server.max-request-size 399 maximum size in kbytes of the request (header + body). Only applies to POST 400 requests. 401 402 Default: 2097152 (2GB) 403 404server.max-worker 405 number of worker processes to spawn. This is usually only needed on servers 406 which are fairly loaded and the network handler calls delay often (e.g. new 407 requests are not handled instantaneously). 408 409 Default: 0 410 411server.name 412 name of the server/virtual server 413 414 Default: hostname 415 416server.max-keep-alive-requests 417 maximum number of request within a keep-alive session before the server 418 terminates the connection 419 420 Default: 128 421 422server.max-keep-alive-idle 423 maximum number of seconds until a idling keep-alive connection is dropped 424 425 Default: 30 426 427server.max-read-idle 428 maximum number of seconds until a waiting, non keep-alive read times out 429 and closes the connection 430 431 Default: 60 432 433server.max-write-idle 434 maximum number of seconds until a waiting write call times out and closes 435 the connection 436 437 Default: 360 438 439server.error-handler-404 440 uri to call if the requested file results in a 404 441 442 Default: not set 443 444 Example: :: 445 446 server.error-handler-404 = "/error-404.php" 447 448server.protocol-http11 449 defines if HTTP/1.1 is allowed or not. 450 451 Default: enabled 452 453server.range-requests 454 defines if range requests are allowed or not. 455 456 Default: enabled 457 458 459SSL engine 460`````````` 461 462ssl.pemfile 463 path to the PEM file for SSL support 464 465debugging 466````````` 467 468debug.dump-unknown-headers 469 enables listing of internally unhandled HTTP-headers 470 471 e.g. :: 472 473 debug.dump-unknown-headers = "enable" 474 475mimetypes 476````````` 477 478mimetype.assign 479 list of known mimetype mappings 480 NOTE: if no mapping is given "application/octet-stream" is used 481 482 e.g.: :: 483 484 mimetype.assign = ( ".png" => "image/png", 485 ".jpg" => "image/jpeg", 486 ".jpeg" => "image/jpeg", 487 ".html" => "text/html", 488 ".txt" => "text/plain" ) 489 490 The list is compared top down and the first match is taken. This is 491 important if you have matches like: :: 492 493 ".tar.gz" => "application/x-tgz", 494 ".gz" => "application/x-gzip", 495 496 If you want to set another default mimetype use: :: 497 498 ..., 499 "" => "text/plain" ) 500 501 as the last entry in the list. 502 503mimetype.use-xattr 504 If available, use the XFS-style extended attribute interface to 505 retrieve the "Content-Type" attribute on each file, and use that as the 506 mime type. If it's not defined or not available, fall back to the 507 mimetype.assign assignment. 508 509 e.g.: :: 510 511 mimetype.use-xattr = "enable" 512 513 on shell use: 514 515 $ attr -s Content-Type -V image/svg svgfile.svg 516 517 or 518 519 $ attr -s Content-Type -V text/html indexfile 520 521 522debugging 523````````` 524 525debug.log-request-header 526 default: disabled 527 528debug.log-response-header 529 default: disabled 530 531debug.log-file-not-found 532 default: disabled 533 534debug.log-request-handling 535 default: disabled 536 537debug.log-ssl-noise 538 default: disabled 539