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 environement 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.tag
291  set the string returned by the Server: response header
292
293  Default: lighttpd <current-version>
294
295server.errorlog
296  pathname of the error-log
297
298  Default: either STDERR or ``server.errorlog-use-syslog``
299
300server.errorlog-use-syslog
301  send errorlog to syslog
302
303  Default: disabled
304
305server.chroot
306  root-directory of the server
307
308  NOTE: requires root-permissions
309
310server.username
311  username used to run the server
312
313  NOTE: requires root-permissions
314
315server.groupname
316  groupname used to run the server
317
318  NOTE: requires root-permissions
319
320server.follow-symlink
321  allow to follow-symlinks
322
323  Default: enabled
324
325index-file.names
326  list of files to search for if a directory is requested
327  e.g.: ::
328
329    index-file.names          = ( "index.php", "index.html",
330                                  "index.htm", "default.htm" )
331
332  if a name starts with slash this file will be used a index generator
333  for all directories.
334
335server.modules
336  modules to load
337
338.. note:: the order of the modules is important.
339
340  The modules are executed in the order as they are specified. Loading
341  mod_auth AFTER mod_fastcgi might disable authentication for fastcgi
342  backends (if check-local is disabled).
343
344  As auth should be done first, move it before all executing modules (like
345  proxy, fastcgi, scgi and cgi).
346
347  rewrites, redirects and access should be first, followed by auth and
348  the docroot plugins.
349
350  Afterwards the external handlers like fastcgi, cgi, scgi and proxy and
351  at the bottom the post-processing plugins like mod_accesslog.
352
353  e.g.: ::
354
355    server.modules          = ( "mod_rewrite",
356                                "mod_redirect",
357				"mod_alias",
358			        "mod_access",
359				"mod_auth",
360                                "mod_status",
361				"mod_simple_vhost",
362				"mod_evhost",
363				"mod_userdir",
364				"mod_secdownload",
365				"mod_fastcgi",
366				"mod_proxy",
367				"mod_cgi",
368                                "mod_ssi",
369				"mod_compress",
370                                "mod_usertrack",
371				"mod_expire",
372 				"mod_rrdtool",
373				"mod_accesslog" )
374
375  Starting with lighttpd 1.4.0 three default modules are loaded automaticly:
376
377  - mod_indexfile
378  - mod_dirlisting
379  - mod_staticfile
380
381server.event-handler
382  set the event handler
383
384  Default: "poll"
385
386server.pid-file
387  set the name of the .pid-file where the PID of the server should be placed.
388  This option is used in combination with a start-script and the daemon mode
389
390  Default: not set
391
392server.max-request-size
393  maximum size in kbytes of the request (header + body). Only applies to POST
394  requests.
395
396  Default: 2097152 (2GB)
397
398server.max-worker
399  number of worker processes to spawn. This is usually only needed on servers
400  which are fairly loaded and the network handler calls delay often (e.g. new
401  requests are not handled instantaneously).
402
403  Default: 0
404
405server.name
406  name of the server/virtual server
407
408  Default: hostname
409
410server.max-keep-alive-requests
411  maximum number of request within a keep-alive session before the server
412  terminates the connection
413
414  Default: 128
415
416server.max-keep-alive-idle
417  maximum number of seconds until a idling keep-alive connection is droped
418
419  Default: 30
420
421server.max-read-idle
422  maximum number of seconds until a waiting, non keep-alive read times out
423  and closes the connection
424
425  Default: 60
426
427server.max-write-idle
428  maximum number of seconds until a waiting write call times out and closes
429  the connection
430
431  Default: 360
432
433server.error-handler-404
434  uri to call if the requested file results in a 404
435
436  Default: not set
437
438  Example: ::
439
440    server.error-handler-404 = "/error-404.php"
441
442server.protocol-http11
443  defines if HTTP/1.1 is allowed or not.
444
445  Default: enabled
446
447server.range-requests
448  defines if range requests are allowed or not.
449
450  Default: enabled
451
452
453SSL engine
454``````````
455
456ssl.pemfile
457  path to the PEM file for SSL support
458
459debugging
460`````````
461
462debug.dump-unknown-headers
463  enables listing of internally unhandled HTTP-headers
464
465  e.g. ::
466
467    debug.dump-unknown-headers = "enable"
468
469mimetypes
470`````````
471
472mimetype.assign
473  list of known mimetype mappings
474  NOTE: if no mapping is given "application/octet-stream" is used
475
476  e.g.: ::
477
478    mimetype.assign   = ( ".png"  => "image/png",
479                          ".jpg"  => "image/jpeg",
480                          ".jpeg" => "image/jpeg",
481			  ".html" => "text/html",
482  			  ".txt"  => "text/plain" )
483
484  The list is compared top down and the first match is taken. This is
485  important if you have matches like: ::
486
487                          ".tar.gz" => "application/x-tgz",
488			  ".gz" => "application/x-gzip",
489
490  If you want to set another default mimetype use: ::
491
492                          ...,
493                          "" => "text/plain" )
494
495  as the last entry in the list.
496
497mimetype.use-xattr
498  If available, use the XFS-style extended attribute interface to
499  retrieve the "Content-Type" attribute on each file, and use that as the
500  mime type. If it's not defined or not available, fall back to the
501  mimetype.assign assignment.
502
503  e.g.: ::
504
505    mimetype.use-xattr = "enable"
506
507    on shell use:
508
509    $ attr -s Content-Type -V image/svg svgfile.svg
510
511    or
512
513    $ attr -s Content-Type -V text/html indexfile
514
515
516debugging
517`````````
518
519debug.log-request-header
520  default: disabled
521
522debug.log-response-header
523  default: disabled
524
525debug.log-file-not-found
526  default: disabled
527
528debug.log-request-handling
529  default: disabled
530
531debug.log-ssl-noise
532  default: disabled
533