summaryrefslogtreecommitdiff
path: root/ChangeLog
diff options
context:
space:
mode:
authorTorsten Marek <shlomme@debian.org>2005-11-27 14:39:54 +0000
committerTorsten Marek <shlomme@debian.org>2005-11-27 14:39:54 +0000
commit701d5359518f46aadc89655d38ff91e6eae4496d (patch)
tree5e47b76785345f850e9d9d196461d66c3e8e8828 /ChangeLog
downloadlighttpd-701d5359518f46aadc89655d38ff91e6eae4496d.tar.gz
[svn-inject] Installing original source of lighttpd
Diffstat (limited to 'ChangeLog')
-rw-r--r--ChangeLog4031
1 files changed, 4031 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..26e6528
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,4031 @@
+CVS-Version: $Id: ChangeLog,v 1.18 2004/04/09 22:08:19 weigon Exp $
+
+** NOTE **
+
+This file is abondend in favour of the NEWS file
+
+** NOTE **
+
+
+15.06.2005 20:10 - 1.3.15
+- mod_cml, mod_trigger_b4_dl
+
+ added both plugins
+
+ check http://trac.lighttpd.net/trac/log/branches/lighttpd-1.3.x/ for the
+ rest
+
+15.06.2005 13:59 - 1.3.14
+- documentation
+
+ more fix-ups for mod_fastcgi, configuration and mysql-vhost
+
+- tests
+
+ unified test-scripts to use the same framework
+
+14.06.2005 23:38
+- documentation
+
+ updated docs for mod_proxy and mod_scgi
+
+12.06.2005 12:55 - pre-release
+- mod_fastcgi
+
+ fixed event handling after delayed connect
+
+ make retry timeout configurable
+
+ removed unused events if we switch to FCGI_STATE_READ
+
+ disabled adaptive spawning
+
+- mod_proxy
+
+ added hash-based and round-robin balancing
+
+ use port 80 is default
+
+ fixed errorhandling on connection refused
+
+ fixed usage of dead hosts [285]
+
+- mod_cgi
+
+ send 500 if the CGI died before we received any data
+
+ redirect the stderr of CGI to our errorlog
+
+ cleanup cgi-env after we finished our request
+
+- uri-handling
+
+ don't replace + to space before the ?query part
+
+ accept characters > 127 again
+
+- mod_auth
+
+ fixed segfault if debugging is enabled [371]
+
+- mod_scgi
+
+ added SCGI support for python + WSGI [381], [382]
+
+- mod_setenv
+
+ fixed conditionals for setenv.add-environment [109]
+
+- generic
+
+ report an error on duplicate config-keys in configfile [267]
+
+ call initgroups to join the groups of the users [239]
+
+ fixed automatic redirects if SSL is used
+
+ fixed compilation on Solaris [283]
+
+ disable accept-filtering on FreeBSD if ssl is used [320]
+
+ fixed handling of range-request larger than 2Gb
+
+ fixed comparisions of mime-types to case-insensitive [266]
+
+ added quotation of ETags [376], [378]
+
+06.03.2005 12:22 - 1.3.13
+- mod_accesslog
+
+ fixed NULL dereference on logfile cycling if accesslog is not set
+
+05.03.2005 17:30
+- mod_proxy
+
+ handle delayed connect in the same way as mod_fastcgi
+
+03.03.2005 19:00
+- freebsd
+
+ handle remote-close gracefully
+
+- ssl
+
+ handle remote-close gracefully
+
+- dir-listing
+
+ added dir-listing.hide-dotfiles and added an option to set css files
+
+02.03.2005 19:41
+- fastcgi
+
+ fixed path-info for prefix-patterns
+
+ fixed path-info for PHP
+
+02.03.2005 14:47 - 1.3.12
+- mod_fastcgi
+
+ fixed handling of dead fastcgi process which sent their SIGCLD to
+ initd and not to lighttpd. Moving the daemonize before starting
+ the fastcgi procs fixes this.
+
+01.03.2005 23:59
+- irix
+
+ fixed minor compile issues with MIPSpro
+
+01.03.2005 11:57
+- request-handling
+
+ handle most duplicate headers as 400, Bug #25
+
+- mod_fastcgi
+
+ added more checks
+
+28.02.2005 18:26
+- mod_expire
+
+ don't ignore 'modification' any more, Bug #39
+ only handles static files
+
+- last-modified
+
+ really compare timestamps, Bug #34
+
+28.02.2005 11:54
+- buffer
+
+ rewrote int2buffer functions
+
+ simplified path_simplify
+
+- pid-file
+
+ ignore EACCESS on unlink
+
+28.02.2005 10:35
+- mod_fastcgi
+
+ accept \n\n, Bug #32
+
+- cygwin
+
+ moved functions used by plugin and main-program to *-glue.c
+
+- lemon
+
+ removed warnings about shadowed variables
+
+28.02.2005 01:00
+- ssl
+
+ added ssl.ca-file, Bug #19
+
+ improved error-messages
+
+27.02.2005 23:48
+- test cases
+
+ rewrote to test-framework to use Perl + Test::More
+ ported more test-cases
+
+22.02.2005 01:20
+- mod_fastcgi
+
+ replaced inet_addr by inet_aton
+
+- request-handling
+
+ fixed segfault if host is empty
+
+20.02.2005 20:05
+- cgi
+
+ fixed cgi.assign for empty handlers again
+
+20.02.2005 16:54 - 1.3.11
+- request handling
+
+ ignore \r\n before request-line in keep-alive requests (Bug #13)
+
+- cgi, fastcgi
+
+ added REMOTE_PORT and SERVER_ADDR
+
+ fixed check for broken status-code in nph-scripts (Bug #14)
+
+- fastcgi
+
+ fixed passing cmdline options the spawned binary (Bug #16)
+
+ fixed failed reconnects (Bug #9)
+
+- macos x
+
+ fixed build on max
+
+- mod_secdownload
+
+ parse conditional secure-download.secret (Bug #8)
+
+- mod_userdir
+
+ redirect if username is not followed by / (Bug #15)
+
+13.02.2005 17:33
+- mod_auth
+
+ fix crash if require, realm or method are empty (Bug #5)
+
+13.02.2005 14:52
+- network
+
+ handle EPIPE and ECONNRESET as 'client has closed connection' in writev()
+ (Bug #1)
+
+- macosx
+
+ compile error on MacOS X due to missing environ (patch by Johan Sörensen)
+ (Bug #2)
+
+- indexfiles
+
+ append the detected indexfile only once to uri.path (reported by Thomas
+ Seifert)
+ (Bug #3)
+
+06.02.2005 15:16 - 1.3.10
+- fastcgi
+
+ display a error-message if a hostname if specified in fastcgi.server->host
+ we need an IP here
+
+- debug
+
+ added debug.log-state-handling
+
+- spawn-fcgi
+
+ accept a full commandline for spawning
+
+06.02.2005 12:50
+- fastcgi
+
+ fixed openssl handling
+
+- network_freebsd_sendfilev
+
+ gracefull handling of connections closed on client-side
+ removed debug-message
+
+06.02.2005 01:44 - 1.3.9
+- documentation
+
+ added docs for SSL setup and mod_status
+
+- fastcgi
+
+ fixed config handling on PowerPC for local-spawning
+
+05.02.2005 15:14
+- fastcgi
+
+ added bin-environment to setup the environment of the spawned process
+
+ added bin-copy-environment to copy only the specified set of options
+ from the old environment
+
+ added handling of cmd-line options to bin-path
+
+- setenv
+
+ fixed crashed in setenv.add-response-header
+
+04.02.2005 18:09
+- configure
+
+ fixed docs for --with-mysql
+
+- fastcgi
+
+ improved performance of building the header (drop strlen())
+
+04.02.2005 01:59
+- cgi
+
+ don't send file on error
+
+ check if cgi-handler exists before executing it
+
+ added support for nph-...
+
+02.02.2005 21:18 - pre-release
+- request parsing
+
+ handle invalid characters in URI
+
+02.02.2005 15:12
+- makefiles
+
+ dropped unused header files from the distribution
+
+02.02.2005 14:18
+- fastcgi
+
+ delete sockets on shutdown
+
+- http/1.1
+
+ adding option to disable http/1.1
+
+01.02.2005 12:03
+- cygwin
+
+ fixed plugins_load to use the right extensions again
+ removed mmap check
+ added ssl support
+
+01.02.2005 01:49
+- configure
+
+ make check for valgrind.h covered by --with-valgrind
+
+- mod_localizer, mod_maps
+
+ remove both plugins from the distribution
+
+- file-not-found
+
+ handle file not found again
+
+30.01.2005 16:44
+- HEAD requests
+
+ don't send content on dynamic HEAD requests with status 200
+
+30.01.2005 15:16 - 1.3.8
+- network-handler
+
+ remove debug output on writev() if the remote side closed the connection
+
+- directory index
+
+ handle EACCES correctly
+
+29.01.2005 15:16 - pre-release
+- mod_alias
+
+ fixed mod_alias + pathinfo handling
+
+- mod_accesslog
+
+ added access-log to syslog patch from allan
+
+28.01.2005 17:30
+- directory redirect without Host-header
+
+ use server-ip instead of client-ip for the Location:
+
+- fastcgi + pathinfo
+
+ if fastcgi-auth redirects to a directory which doesn't exist handle it
+ correctly (bug introduced in 1.3.8)
+
+- requesting directories
+
+ clean physical.path if directory is requested and dir-listing is disabled
+ send 403 again (buf introduced in 1.3.8)
+
+28.01.2005 12:08
+- fastcgi
+
+ ignore FDEVENT_HUP for unix-sockets as a simple read + timeout will do
+ the job anyway
+
+22.01.2005 20:28 - pre-release
+- fastcgi
+
+ send content and headers if authorizer mode is used
+
+ use a new connection if connection is died to fastcgi
+ and we have not used it yet
+
+18.01.2005 21:21 - pre-release
+- plugins
+
+ added version-id to plugins to detect plugins which are not up-to-date
+
+16.01.2005 23:11
+- fastcgi
+
+ fixed write-failed after crash of fastcgi-child
+
+16.01.2005 20:43
+- setenv
+
+ fixed setenv.add-environment
+
+- fastcgi
+
+ fixed authorizer + added testcases
+
+16.01.2005 17:40 - pre-release
+- mod_status
+
+ beautified mod_status
+
+- mod_setenv
+
+ added setenv.add-environment
+
+- timeouts
+
+ add timeout to read-post
+
+15.01.2005 12:57
+- debug
+
+ added debug options to log
+ - missing files
+ - request header
+ - response header
+ - request handling
+
+ added a more usefull error message for the status-code changes in the
+ request parser
+
+- server announcement
+
+ set Server: header for dynamic content too
+
+- fastcgi
+
+ fixed double free
+
+ don't crash on FDEVENT_ERR
+
+ added a comment for EAGAIN on connect()
+
+08.01.2005 17:45
+- ssl
+
+ report an error if ssl.engine is enable but no ssl support compiled in
+
+08.01.2005 12:23
+- mod_status
+
+ added request time to the output
+
+ (late changelog) added host and filename to the output (fobax)
+ (late changelog) HTMLalized the output (fobax)
+
+06.01.2005 19:51 - pre-release
+- error-handler
+
+ let the error-handler handle 403 requests too
+
+ make the error-handler setable by a module
+
+- error-pages
+
+ reworked the error-page handling
+
+05.01.2005 13:10
+- keep-alive handling
+
+ made sure that keep-alive is really handled correctly
+
+04.01.2005 17:02
+- mod_setenv
+
+ added a module to added request and response headers on the fly
+
+- error-log
+
+ send error log to syslog() if no errorlogfile is specified (again)
+
+02.01.2005 22:44 - pre-release
+- response handling
+
+ cut of body for status 301, 304 and 205
+
+- buffer
+
+ optimized all _hex functions (Silvan Minghetti)
+
+02.01.2005 20:32
+- fastcgi
+
+ if bin-path is not specified, don't die (bug introduced in the last pre-rel)
+
+- auth
+
+ if userfile is empty don't auth.
+
+02.01.2005 19:06
+- mod_compress
+
+ fixed off by one if cache-dir is not set
+
+02.01.2005 16:10
+- conditional config
+
+ fixed !~ and !=
+
+- buffer
+
+ copy empty buffers correctly
+
+31.12.2004 17:45
+- ipv6 + pidfile
+
+ don't complain if we can't remove the pidfile (Silvan Minghetti)
+
+ remove ipv6 option from the commandline of lighttpd doesn't support
+ ipv6 (Silvan Minghetti)
+
+31.12.2004 15:41 - pre-release
+- kqueue
+
+ simplified event handling (adam)
+
+- fastcgi
+
+ fixed div-by-zero bugs in the adaptive process spawning
+
+- mysql-vhost
+
+ added mysql-vhost (Christer Holgersson)
+
+30.12.2004 19:09
+- fastcgi
+
+ added adaptive spawning of FastCGI processes
+
+- traffic shaping
+
+ added traffic shaping per virtual server
+
+28.12.2004 23:26
+- traffic shaping
+
+ added traffic shaping per connection
+
+25.12.2004 22:58
+- mod_status
+
+ fixed status.url again (Timo)
+
+21.12.2004 11:29
+- configure
+
+ added check for signal and select (compile fix for netbsd 1.4 and 1.5)
+
+11.12.2004 12:38 - 1.3.7
+- fastcgi + php
+
+ retry to connect to another PHP child if one of them dies after
+ connect
+
+- cgi + multipart
+
+ don't transform CONTENT_TYPE to HTTP_CONTENT_TYPE
+
+- debian
+
+ more cleanup, updated changelog, added more deps and suggests
+ (Chris Brown)
+
+10.12.2004 22:33
+- event handler
+
+ fixed crashes in kqueue
+
+10.12.2004 13:57 - pre-release
+- mod_status
+
+ fixed wraparound in total requests and total traffic
+
+- debian
+
+ updated licence and packaging
+
+- security
+
+ call setgroups() to get rid of all groups
+
+- ssl
+
+ handle SSL_shutdown() == 0 correctly
+
+ fixed openssl detection in configure
+
+ fixed handling of chunked encoding
+
+- request handling
+
+ handle Connection: keep-alive correctly (case as not ignored)
+
+21.11.2004 02:39
+- windows
+
+ merged basic native windows port (compiles with mingw)
+
+20.11.2004 18:43
+- conditional
+
+ ported
+ - cgi
+ - secdownload
+ - expire
+ - localizer
+ - usertrack
+ - status
+ - proxy
+
+- server-tag
+
+ Server: ... can now be specified by server.tag = "..."
+
+- spawn-fcgi
+
+ fixed typo in usage text
+
+- ssl
+
+ fixed detection of libs and headers
+
+05.11.2004 16:01
+- fastcgi
+
+ added more usefull error messages
+
+04.11.2004 23:01
+- ssi
+
+ added support for ${...}
+
+03.11.2004 14:51 - 1.3.6
+- fastcgi
+
+ added spawn-fcgi to the distribution
+ added spawn-local-fastcgi yourself ( bin-path )
+
+03.11.2004 11:22
+- accesslog
+
+ don't cycle accesslogs of external processes are used
+
+02.11.2004 15:34
+- fastcgi
+
+ handle END-OF-REQUEST correctly if chunk-encoding is not used
+
+02.11.2004 10:53
+- internal redirects
+
+ fixed handling of query strings in internal redirects for directories
+
+02.11.2004 09:54 - pre-release
+- cgi
+
+ add REMOTE_USER, suppress AUTHORIZATION
+ handle payloads > 4k
+
+- mod_alias
+
+ fixed url checking
+
+- follow-symlink
+
+ fixed config
+
+31.10.2004 11:30 - 1.3.5
+- writev
+
+ fixed seg-fault in debug-message if write() fails and LFS is enabled
+ handle EINTR
+
+- sendfile linux
+
+ handle EINTR
+
+31.10.2004 09:09
+- freebsd
+
+ added missing header in joblist.c
+ fixed test-scripts for zsh
+
+30.10.2004 22:26
+- modules
+
+ added mod_userdir and mod_alias
+ added docs for the new modules
+
+30.10.2004 19:52
+- porting
+
+ added defines for MAP_FAILED for NetBSD 1.3.x
+
+30.10.2004 18:54 - pre-release
+- pipelining
+
+ fixed offset calculations
+
+- ipv6
+
+ IPv6 might be disabled at compile-time
+
+- rewrite
+
+ close mem-leak
+
+- auth
+
+ forgot to reset the global-config handler
+
+- symlink
+
+ add option to disable follow-symlink
+
+- ssi
+
+ added support for exec-cmd
+
+23.10.2004 - 1.3.4
+- max-fds
+
+ set the upper limit of fds only if server.max-fds is set
+
+23.10.2004 13:49
+- accesslog
+
+ use a shell to handle accesslog-pipes
+
+22.10.2004 17:00
+- accesslog
+
+ added logging of user-supplied data via %{...}o and
+ X-LIGHTTPD-* header
+
+22.10.2004 14:57 - pre-release
+- openwrt
+
+ fixed configure-checks and Makefile.am's to build cleanly with a
+ cross-compiler
+
+ builds cleanly for openwrt
+
+22.10.2004 13:03
+- out-of-fd
+
+ improved the out-of-fd handler
+
+- cgi, fastcgi
+
+ set SERVER_NAME to server.name or the value submitted by Host:
+
+- error-handler
+
+ only set old status code if it wasn't set by a handler
+
+21.10.2004 22:36 - pre-release
+- fastcgi
+
+ don't crash on out-of-fd condition
+
+- out-of-fd
+
+ try handle the out-of-fd condition in a sane way
+
+21.10.2004 15:03
+- mod_auth
+
+ seperated auth.backend.*.userfile for plain, htpasswd and htdigest
+
+ added 'digest-auth' against 'plain-backend'
+
+ added auth.debug for debugging
+
+16.10.2004 10:18 - 1.3.3
+- mod_simple_vhost, mod_evhost
+
+ conditional-ized
+
+- mod_rrdtool
+
+ maintain the request-counter for each conditional-config (adam)
+
+14.10.2004 11:30
+- accesslogs
+
+ cycle all access-logs
+
+- mod_rewrite
+
+ tell the user to install pcre.h if he wants to use mod_rewrite
+
+10.10.2004 10:11 - pre-release
+- error-handler
+
+ added a error-handler for status 404 (server.error-handler-404)
+
+09.10.2004 16:28 - pre-release
+- cgi
+
+ added support for \n in headers
+
+- mod_auth
+
+ added conditional auth
+
+01.10.2004 09:28
+- plugins
+
+ fixed off by one error in plugin initialization (Mike)
+ related into a segfault on AMD64
+
+30.09.2004 21:44 - 1.3.2
+- file-cache
+
+ disabled the file-cache it was taken the wrong files from the cache
+
+30.09.2004 08:39 - 1.3.1
+- file-cache
+
+ drop a unused file-cache entry after 10 seconds
+ reuse unused entries
+
+- request-parser
+
+ accept IPv6 adresses in Host header
+
+- tests
+
+ modified the scripts to work with zsh (check on Linux, Irix and FreeBSD)
+
+26.09.2004 12:28
+- comparission function
+
+ file-cache has delivering the wrong entry if only the last character of
+ the filename differed and the filesize was the same.
+
+- cgi + cygwin
+
+ cgi need s SYSTEMROOT environment
+
+
+22.09.2004 08:55
+- network
+
+ detect of file has been shrinked while we are sending it out and terminate
+ the connection if would run over the edge
+
+22.09.2004 07:56
+- mod rewrite, fastcgi, ...
+
+ keep REQUEST_URI after rewrite
+
+21.09.2004 22:49
+- fastcgi authorizer
+
+ fixed cleanup code (matt)
+
+21.09.2004 20:08
+- rrdtool
+
+ rrdtool.db-name is now conditional
+
+ fixed check if write() failed (adam)
+
+17.09.2004 17:50 - 1.3.0
+- rewrite
+
+ added url.rewrite-final = ...
+
+17.09.2004 15:55
+- code cleanup
+
+ integrated the fixes from cygwin into the main tree
+
+- kqueue
+
+ init kqueue after daemonizing (broken since 12.09.2004 14:02)
+
+16.09.2004 21:00
+- cygwin + macosx
+
+ finished the cygwin port
+ this port seems to fix the problems on macosx too
+
+12.09.2004 14:02
+- socket handling
+
+ added support to handle more than one server socket
+
+11.09.2004 12:23 - 1.2.8
+- EINTR
+
+ handle EINTR for linux-sendfile
+
+- configfile
+
+ ignore an extra comma at the end of the array declaration
+
+11.09.2004 09:46
+- mod_proxy
+
+ pass remote-addr as X-Forwarded-For to the real server behind the proxy
+
+- code cleanup
+
+ moved all cut'n'paste versions of the inet_ntop cache to inet_ntop_cache.c
+
+- fcgi
+
+ don't overwrite the fd in fcgi_establish connection if connect fails. this
+ results in various problem in other places.
+
+05.09.2004 09:46
+- file-cache
+
+ cache the mimetype
+
+- last-modified
+
+ don't complain if the If-Modified-Since contains a valid comment/option
+ like <timestamp>; length = ...
+
+05.09.2004 09:13
+- expires
+
+ overwrite the Expire if it is set by a previous plugin
+
+- conditional config
+
+ conditional config as disabled in 1.2.7 by accident
+
+04.09.2004 10:02 - 1.2.7
+- mod-proxy
+
+ remove the \0 before the post content
+
+- cgi
+
+ fixed hanging process if cgi-crash terminates to fast (before we read its
+ response)
+
+- extented attributes
+
+ added xattr support, submitted by Ari
+
+29.08.2004 16:00
+- rrdtool
+
+ moved the rrdtool support from mod_status into its own module mod_rrdtool
+
+ rrdtool.binary = "/usr/bin/rrdtool"
+ rrdtool.db-name = "/var/www/lighttpd.rrd"
+
+29.08.2004 11:00 - pre-release
+- timeouts
+
+ server.max-keep-alive-requests = 0 replaces
+ server.use-keep-alive = "disable"
+
+ added
+ server.max-keep-alive-idle
+ server.max-read-idle
+ server.max-write-idle
+
+- docs
+
+ added a entry for each config-value into configuration.txt
+ added simple docs for
+ rewrite
+ redirect
+ compress
+ cgi
+ simple-vhost
+
+29.08.2004 10:05
+- config options
+
+ complain if no configfile is specified
+
+- fastcgi
+
+ removed stupid allocation bug which might cause a problem in really rare
+ cases
+
+26.08.2004 22:06 - 1.2.6
+- optimize
+
+ use array_strcasecmp() in favour of strcasecmp() as it is slightly
+ faster.
+
+ apply the case-insentive conversion also on the last character. (adam)
+
+ sort the checked elements in request.c and filter apply the logic to
+ compare some less fields, if the header is not used.
+
+ improved the config-patch function to use our internal buffer-compare
+ functions instead of strcmp
+
+22.08.2004 16:09 - pre-release
+- cgi
+
+ added missing cleanup code
+
+- fastcgi
+
+ remove double-free
+ added handling of EINTR in some places
+
+- leaks
+
+ fixed some leaks in the new config code
+
+- array_strcasecmp
+
+ fixed alignment in the improved array_strcasecmp function (adam)
+
+20.08.2004 14:46 - pre-release
+- performance
+
+ optimized a few useless strlen() away as we either know the length from
+ buffer->used - 1 or by sizeof(str) - 1 if it is constant.
+
+ optimized the 'find the \r\n\r\n' function.
+
+ improved the array_strcasecmp() based on another idea from (ralf)
+
+- accesslog
+
+ enabled the strftime cache again
+
+15.08.2004 23:41
+- accesslog
+
+ added apache-like CustomLog handling in accesslog.format
+
+ accesslog.format = "..."
+
+15.08.2004 21:08
+- test-cases
+
+ remove testdir
+
+- configfiles
+
+ handle escaping of " in strings properly
+
+13.08.2004 12:07
+- array
+
+ improved inner-loop of array_strcasecmp() (ralf)
+
+11.08.2004 14:14
+- fcgi socket
+
+ use SUN_LEN if available
+
+- keep-alive
+
+ disable keep-alive on request
+
+ server.use-keep-alive = "disable"
+
+10.08.2004 15:59 - 1.2.5
+- conditional config
+
+ mod_fastcgi
+ mod_rewrite
+ mod_redirect
+ mod_access
+ mod_compress
+ mod_accesslog
+
+ are ported
+
+10.08.2004 13:05
+- pipelining
+
+ fixed very stupid pipelining bug
+
+09.08.2004 22:07 - pre-release
+- conditional config
+
+ first code for conditional config
+
+09.08.2004 14:21
+- fcgi
+
+ fixed access to free()'d memory (doesn't create any harm)
+
+- isdigit, warings
+
+ signed -> unsigned for 2 more isdigit() calls (adam)
+ removed some unused var's if pcre is not available (adam)
+
+08.08.2004 20:57 - pre-release
+- debian
+
+ added a chmod to /var/log/lighttpd/ (allan)
+
+08.08.2004 12:05
+- kqueue
+
+ use EV_SET() instead of setting the ev-struct by hand (adam)
+
+- fcgi
+
+ fixed the EINPROGRESS handling to use getsockopt (er)
+ fixed a leak of server is disabled (er)
+
+- solaris 10 port-api
+
+ added a skeleton for the sol10 port api
+
+06.08.2004 10:18
+- mod_ssi
+
+ fix DATE_LOCAL so it displays the correct time zone (Jeremy Hinegardner)
+
+04.08.2004 11:43
+- openbsd fixes
+
+ dropped usage of MAX() in buffer.c
+ added prober includes for md5.h if openssl is enabled (brad)
+
+- memory usage
+
+ documented the way how lighttpd caches memory blocks
+ reset the buffers after they have been written by the network-layer
+
+- kqueue
+
+ modify fd-bitmask only if kevent succeeded (adam)
+
+
+03.08.2004 15:09
+- mod_compress
+
+ compress even if you have no cachedir set
+
+03.08.2004 13:26 - pre-release
+- Makefile
+
+ fixed dependencies for parallel build in mod_ssi_expr.c
+
+- combo patch
+
+ * Tinker with kqueue(). Add a reset method so that the kqueue file
+ descriptor can be re-enabled after a fork(). Emulate the devpoll driver
+ in that adds and deletes are sent to the notification mechanism im-
+ mediately, which should cut down on phantom events. Use
+ ev->kq_results as a sliding window.
+
+ * Change F_SETFD calls to use the preferred FD_CLOEXEC instead of 1.
+
+ * Remove unnecessary fdevent fcntl handlers. It appears that the only
+ driver that needs one is Linux RT signals.
+
+ * Quiet compiler warning about unused parameter.
+
+ * Set the close-on-exec flag for the /dev/poll and epoll_create() file
+ descriptors.
+
+ * Return failure if /dev/poll could not be opened instead of logging
+ and continuing.
+
+ * Detect EAGAIN after writev() failures. FreeBSD sendfile() doesn't need
+ protection, as the man page says:
+
+ When using a socket marked for non-blocking I/O, sendfile() may send
+ fewer bytes than requested. In this case, the number of bytes success-
+ fully written is returned in *sbytes (if specified), and the error
+ EAGAIN is returned.
+
+ (adam, georg, matt)
+
+
+02.08.2004 18:08
+- mod_ssi
+
+ check for pcre before compiling the module
+
+- fdevents
+
+ dropped fdevent_fcntl added by the last patch (adam)
+ kqueue: events == FDEVENT_IN -> events & FDEVENT_IN (adam)
+
+31.07.2004 22:07 - 1.2.4
+- fdevents
+
+ * Test at configure time for kqueue() and <sys/event.h>
+ * Remove various hard-coded constants from event handlers
+ * Move maxfds into the event structure, and out of the
+ fdevent_*_init handlers. Event handlers can use the maxfds
+ member to size arrays.
+ * Various event structure renames to discourage clashes
+ * Remove extra (ignored) call to fdevent_event_next_fdndx() in
+ the main server loop.
+ * Wrestle with kqueue(). The implementation has to deal with
+ phantom events (for fds which have been deleted/closed), similar
+ to the Linux RT signals code. Like the RT code, it maintains a
+ bitmask of active fds. After a successful call to kevent(), the
+ code will compress/overwrite dead events. The other annoyance is
+ that the handler must track the event filter for each fd, even
+ though you cannot support both read and write filters for the same
+ fd in one kqueue. The handler maintains a separate bitmask for fd
+ filters (1 == EVFILT_IN, 0 == EVFILT_OUT).
+ (adam)
+
+- server side includes
+
+ added native server-side includes based on the docs from apache:
+ http://httpd.apache.org/docs/mod/mod_include.html
+
+ not supported are:
+ - exec
+ - nested virtual
+ - config.errmsg
+ - echo.encoding
+
+24.07.2004
+- fdevents
+
+ added a bitset to figure out if we received a event for an unregistered fd
+ in rt-signal (adam)
+
+- kqueue
+
+ added kqueue support (Matt Levine)
+
+13.07.2004 08:58
+- configfile
+
+ parse keys correctly that contain a digit (Geoff Adams)
+
+- fcgi
+
+ fixed large post uploads (Geoff Adams)
+ fixed uri if docroot is set (Geoff Adams)
+
+03.07.2004 22:50 - 1.2.3
+- index-files
+
+ rewrite uri.path to the index-file instead of keeping it at .../
+ this fixes index-file handling in FastCGI/CGI docroot is used
+
+- close-on-exec
+
+ enable close-on-exec handling to simplify FD handling in CGI code
+
+- cgi
+
+ keep error-log-fd open to catch the error handling for execve()
+
+ report error if cgi-exec file doesn't exist
+
+- proxy
+
+ pass page-content on error to the user (E.R.)
+ code cleanup (E.R.)
+
+- ssi
+
+ first skeleton of a plugin for ServerSideIncludes
+
+- security
+
+ limit the headerlength again to 64k max
+
+03.07.2004 14:23
+- configure
+
+ fixed compile-check for libpcre if pcre-config doesn't point to /usr/lib
+
+02.07.2004 18:17
+- buffers
+
+ always allocate a multiply of 64bytes. this should reduce the number of
+ realloc()s and still doesn't has a too high overhead.
+
+02.07.2004 11:07
+- fds
+
+ connect stdin, stdout and stderr to /dev/null instead of just closing it
+ use dup2() instead of dup()
+
+- accesslog
+
+ if accesslog.filename starts with a | spawn a process which will get data
+ in one chunk once in a while
+
+01.07.2004 11:00
+- sample config
+
+ added text/css and text/javascript mimetypes
+
+28.06.2004 12:18
+- proxy module
+
+ added a proxy module (based on the fastcgi module) and added some
+ documentation
+
+25.06.2004 21:41
+- last-modified handling
+
+ replaced %Z by GMT. otherwise the last-modified check will most often fail.
+
+24.06.2004 20:20
+- relax http-parser
+
+ don't reply 400 in case of an empty header-field, just ignore it
+
+23.06.2004 22:10
+- file-cache
+
+ don't cache mmap() for files larger than 64k as we run out of RAM otherwise
+ too fast (check with some 200mb files)
+
+- 64bit fixes
+
+ fixed buffer_equal on sparc64
+
+15.06.2004 19:09 - 1.2.2
+- mmap cache
+
+ fixed mmap-caching in network_write.c and network_writev.c after a direct
+ hint by E.Rodichev
+
+- sendfile + linux
+
+ check at config-time if sendfile() works on Linux
+
+11.06.2004 15:09
+- fcgi + unix sockets
+
+ added support for unix domain sockets (spawn-fcgi 1.2.0 required)
+
+10.06.2004 11:49
+- configure
+
+ use pcre-config to determine the position of the pcre headers
+
+05.06.2004 22:06
+- filehandle-cache
+
+ remove mmap-segment if filecache gets invalidated
+
+30.05.2004 14:13 - lighttpd 1.2.1
+- response headers
+
+ request headers that appear twice are grouped together like expected by
+ the CGI spec (concat with a ", ")
+ response headers behaved the same way but are not grouped anymore. They
+ stay seperated. Actually they are concated by \r\n<key>: <value> which is
+ the same in the end.
+
+- file uploads
+
+ the handling of longer post requests is fixed now.
+
+28.05.2004 09:13
+- cgi
+
+ added support for direct calls to cgi-binary
+
+22.05.2004 21:58
+- pipeling
+
+ the code cleanup is finished successfully. Now all cases of pipelining are
+ handle the right way. POST pipelining was still not working up to now.
+
+22.05.2004 12:55
+- code cleanup
+
+ use the well-tested code from the write-queue as the base for the
+ read-queues and simplify the pipeline handling alot that way.
+
+20.05.2004 15:08
+- network backends
+
+ enabled sendfile support again (__FreeBSD__ instead of __freebsd__)
+
+ added a mmap cache as part of the filedescriptor cache
+
+ added AIX specific send_file() support (untested)
+
+20.05.2004 10:40
+- segfaults
+
+ fixed some minor segfaults on startup when no config file is used.
+
+17.05.2004 10:58 - lighttpd 1.2.0
+- documentation
+
+ reformated the documentation the doc/ directory
+
+15.05.2004 14:45
+- localizer
+
+ fixed build of localizer extension
+
+15.05.2004 12:35
+- POST requests
+
+ there is no need to die if we spot a simple POST request on a static file
+
+- pipelining
+
+ fixed HTTP/1.1 pipelining which caused the problems with opera
+
+- array handling
+
+ how did that bug survive such a long time ? a wrong compare function was
+ used in one case, but not the other.
+
+15.05.2004 03:20
+- secure and fast downloads
+
+ added a module which allows secure and fast downloading of files:
+ 1. the application (.php, ...) controls the access to the files
+ 2. the webserver is handling the transfer (and check the app generated
+ tokens)
+
+ the token is based on
+ - a secret
+ - a timestamp
+ - the filename
+ this means even if the token is is distributed by the user it will get
+ invalid after a given timeout (default 60 seconds)
+
+- errorfiles
+
+ check for errorfiles before using them
+
+- code cleanup
+
+ applied cleanup fixes from adam
+
+14.05.2004 18:47
+- fdevent handling
+
+ added a more generic callback interface to the fdevent structures which
+ simplifies the writing of plugins. this might destabilize lighttpd for a
+ while
+
+- cgi
+
+ fixed header parsing of the header is sent in chunks and the terminator is
+ sent in a single chunk
+
+- EINTR
+
+ fixed some occurences of EINTR which read()
+
+03.05.2004 23:55
+- portability
+
+ E.R.:
+ * portability fixes for Solaris 2.5
+
+02.05.2004 10:15
+- Expect: Handling
+
+ added incomplete support for Expect: 100-continue (RFC 2616 8.2.3) by
+ sending always 417 for every Expect-request (see 14.20)
+
+ we have been blamed for not supporting it:
+ http://lists.w3.org/Archives/Public/ietf-http-wg/2004JanMar/0059.html
+
+29.04.2004 23:07 - 1.1.9
+- usertracking
+
+ added a very basic usertracking cookie handler
+
+29.04.2004 19:37
+- network-writev
+
+ Adam:
+ * call munmap() on error in write()
+
+- docs
+
+ E.R:
+ * documented 'check-local'
+
+- test-env
+
+ made the shell scripts more portable (checked with zsh, bash and ksh)
+
+ fixed compilation on NetBSD
+
+28.04.2004 22:22
+- FastCGI
+
+ E.Rodichev:
+ * added "Authorizer" mode for FastCGI
+
+27.04.2004 18:08
+- ssl
+
+ Alexey Slynko:
+ * handle SSL_ERROR_WANT_READ or SSL_ERROR_WANT_WRITE in SSL_write the
+ right way.
+
+- FastCGI
+
+ add 'check-local' instead of the implicit 'if-docroot-is-set' handling
+ implemented at 24.04.2004 14:34
+
+ E.Rodichev:
+ * remove useless extra-/ in before uri.path
+ * add 'prefix' notation for FastCGI processes
+
+26.04.2004 16:52
+- code cleanup
+
+ patches from Alexey Slynko:
+ * remove the pidfile if lighttpd terminates the normal way (if not in chroot)
+ * init SSL before getting daemonized
+
+25.04.2004 19.15
+- mem-leak
+
+ fixed mem-leak on broken HTTP-headers
+
+- FastCGI
+
+ patches from E.Rodichev:
+
+ 1. CONTENT_LENGTH
+ "If no data are attached, then this metavariable is either NULL or not
+ defined".
+
+ 2. QUERY_STRING
+ If the Script-URI does not include a query component, the QUERY_STRING
+ metavariable MUST be defined as an empty string ("").
+
+ 3. Doubling of REMOTE_ADDR removed.
+
+ patches from adam:
+ * fixed bug in the sizeof() patches from yesterday.
+ * some more *_long to *_off_t
+
+24.04.2004 14:34
+- FastCGI
+
+ don't check for localfile if 'docroot' for a FastCGI host is specified.
+
+24.04.2004 12:13
+- POST
+
+ fixed POST request handling
+
+- chunk-encoding
+
+ the generated HEX strings where broken since the 1.1.8
+ (this effected all HTTP/1.1 requests without Content-Length like FastCGI-PHP)
+
+- code cleanup
+
+ patches from adam:
+ * malloc + memset -> calloc
+ * sizeof(int) -> sizeof(<variable>)
+ * assign fd_set instead of memcpy()
+ * init fd -> connection fd pointers to -1
+
+16.04.2004 08:48 - 1.1.8
+- code cleanup
+
+ don't reuse buffer > 64k (see settings.h)
+
+ added server.max-request-size to limit the maximum request-body size
+ (in kBytes)
+
+ don't accept HTTP-request headers larger then 32kBytes (see settings.h)
+
+ minor speed improvements in the request-parser
+
+ More cleanup patches from adam:
+
+ * change pre-ANSI C/valid C++ syntax for function declarations/definitions
+ from using () to (void). Ex: int foo(); --> int foo(void);
+ * use static linkage as much as possible, to limit possible symbol
+ collisions
+ * whack more unneeded variables
+ * try and prevent any errno clobbering by storing the old errno value before
+ any subsequent system calls, and restoring before function exit.
+ * change printf syntax for unsigned variables from %d to %u
+
+15.04.2004 18:41
+- code cleanup
+
+ handle all int != size_t cases in fcgi.c correctly
+
+ check headerfields to have a value
+
+ handle both EINVAL cases of writev() before the can occur
+
+ limit content-length to SSIZE_MAX
+ disallow negative content-length
+
+ the usage of ltostr() has been reduced to the minimum in favour of
+ buffer_/append|copy)_(long|off_t)
+
+ dropped ultostr() and ultohex() in favour of buffer_*
+
+15.04.2004 16:35
+- portablity
+
+ more patches from adam:
+
+ * remove warnings for unused parameters and variables
+ * remove warnings for mismatched pointer assignments
+ * change "gtime_r" to "gmtime_r"
+
+13.04.2004 20:48
+- test-cases
+
+ made the 'make check' target self-contained
+
+ In our case we have to call the targets in the following order:
+
+ $ ./configure ...
+ $ make
+ $ make install
+ $ make check
+
+ because the path to the plugins is hardcoded in the binary itself
+
+ using
+
+ $ ./configure --prefix=/tmp/lighttpd-1.1.x/
+ ...
+
+ will help if you don't really want to install before testing.
+
+13.04.2004 00:05
+- portability
+
+ adam sent another patchset:
+
+ * Wrap PCRE-specific data member access with an #ifdef
+ * Add const to pointer using return value from dlerror()
+ * Explicitly initialize pointer in the lemon parser to 0,
+ in order to catch missing else { } clause
+ * Use a time_t rather than an int for gmtime() call. On some
+ systems (including 32- and 64-bit SPARC) time_t is a long.
+
+12.04.2004 17:00 - 1.1.7
+- fastcgi
+
+ strip WS after HTTP-response headers coming from the FastCGI process
+
+ added REMOTE_USER to the Server->FastCGI headers
+ removed HTTP_AUTHORIZATION from the Server->FastCGI headers
+
+12.04.2004 10:24
+- cgi
+
+ if we don't get a partial HTTP-response-header send the content out as soon
+ as the cgi script is finished
+
+12.04.2004 01:23
+- compression
+
+ added bzip2 compression (supported by w3m)
+
+12.04.2004 00:12
+- configfile
+
+ add some usefull error messages if the tokenizer or the parser fail to
+ read the configfile
+
+11.04.2004 22:04
+- configure
+
+ added --with-ldap and --disable-lfs to the configure options
+
+11.04.2004 20:28
+- 64bit offset size
+
+ disable linux-sendfile support for linux 2.4.x for now as it don't
+ support 64bit transfers
+
+ fixed all assignments on the path from the stat() to the Content-Length
+ HTTP-header
+
+- head requests
+ set content-length in HEAD requests
+
+- accesslog
+
+ write accesslog entry on network error
+
+ write the correct amount of byte written to the accesslog
+
+11.04.2004 11:48
+- code cleanup
+
+ moved the config for the cgi-plugin from config.c to the plugin.
+
+ moved some buffers which were only used by a one or two plugin from
+ the server-structure to the plugins
+
+ keeping the plugins independent from the server-core is a 'good thing'
+
+10.04.2004 19:06
+- configfile parser
+
+ removed the leaks from the configfile parser
+
+09.04.2004 23:15 - 1.1.6
+- stricter http-parser
+
+ added line-folding although noone really seems to use it.
+
+09.04.2004 18:42
+- configfile parser
+
+ the hand-written configfile parser has been replaced by a LALR(1) one.
+ 'lemon' from the sqlite guys has been used to generate the parser.
+
+- by-host, by-url, by-file, by ...
+
+ $HTTP["url"] =~ "~$" {
+ access.deny = "all"
+ }
+
+ $HTTP["host"] =~ "." {
+ simple-vhost.server-root = "/home/weigon/wwwroot/servers/"
+ simple-vhost.default-host = "grisu.home.kneschke.de"
+ simple-vhost.document-root = "pages"
+ }
+
+ $HTTP["host"] == "incremental.home.kneschke.de" {
+ server.docroot = "/hasdasd"
+ }
+
+ at least the parser can handle it now. Currently there is no real support
+ for this context-based config-option. But the syntax and the parser are
+ done.
+
+09.04.2004 10:58
+- ssl support
+
+ enable ssl support again
+
+- mmap
+
+ enabled mmap+write again
+
+08.04.2004 12:34
+- stricter http-parser
+
+ based on a thread at
+
+ http://lists.w3.org/Archives/Public/ietf-http-wg/2004JanMar/0050.html
+
+ the HTTP-parser has been adjusted to be more correct when it comes to
+ request-header fieldnames
+
+ the whitespace handling around the ':' has been relaxed as requested
+
+07.04.2004 17:06
+- sigaction
+
+ use sigaction instead of signal if possible
+
+07.04.2004 13:55
+- accesslog
+
+ use localtime-timestamps in accesslogs if struct tm has a tm_gmtoff field
+
+07.04.2004 10:41 - 1.1.5
+- -D_REENTRANT
+
+ solaris + localtime_r() needs it
+
+07.04.2004 02:54
+- mod_auth + ldap
+
+ added a ldap backend to the auth plugin.
+
+06.04.2004 13:37
+- pidfile
+
+ fixed the permissions of the pidfile (Matthijs van der Klip)
+
+- specfile
+
+ merge the RedHat and SuSE specfile with Matthijs
+
+- 64bit file-offsets
+
+ moved the FILE_OFFSET_BITS settings from the config.h the Makefile to enable
+ 64bit offsets the right way
+
+06.04.2004 12:32
+- mod_expire
+
+ added an apache compatible mod_expire which adds Expires: headers to the
+ request
+
+ expire.url = ( "/buggy/" => "access 2 hours" )
+
+05.04.2004 22:34
+- solaris devpoll
+
+ forgot to provide the infrastructure to actually enable the devpoll event
+ handler. the same has been done for the freebsd-kqueue handler (which
+ doesn't work yet)
+
+ fixed the devpoll support while testing it on a real solaris box
+
+05.04.2004 09:49
+- debian
+
+ added debian packaging support written by Vincent Wagelaar
+
+- solaris
+
+ Another set of patches for Solaris from Adam
+ * Detect <sys/devpoll.h>
+ * Detect and include <sys/filio.h> for definition of FIONREAD
+ * Detect and link against the library exporting hstrerror
+ * Correct typo in SENDFILE_LIB
+ * Use__sun instead of __solaris__ for detecting operating system.
+ Please see http://predef.sourceforge.net/preos.html for more
+ detail
+ * Explicitly cast arguments to isalpha() and toupper() to unsigned
+ char. The man page says that the functions support the range of
+ an unsigned char, and EOF.
+ * Include <limits.h> and define UIO_MAXIOV as IOV_MAX for Solaris.
+
+04.04.2004 18:05 - 1.1.4
+- pidfile
+
+ added pidfile writing after deamonizing
+
+04.04.2004 01:05
+- fdevent
+
+ added framework for freebsd_kqueue and solaris_devpoll
+
+ the solaris_devpoll one might event work (untested)
+
+03.04.2004 16:41
+- network
+
+ added framework for filebased chunks
+ - read-write + mmap-write
+ - linux-sendfile
+ - freebsd-sendfile
+ - solaris-sendfilev (untested)
+
+ and memorybased chunks
+ - write
+ - writev
+
+ made TCP_CORK a 'global' flag around the write_chunkqueue-calls
+
+ the writev() support should improve the performance for all non-static
+ pages.
+
+ 170 req/s against 158 req/s for the following script if writev() is used
+ instead of write()
+
+ <?php
+
+ for ($i = 0; $i < 1000; $i++) {
+ print $i."<br />\n";
+ flush();
+ }
+
+ ?>
+
+28.03.2004 13:42
+- cleanup
+
+ applied some cleanup patches submitted by Adam:
+ * variables modified in signal handlers should be sig_atomic_t
+ * assert statements should not have side effects
+ * STD{IN,OUT,ERR}_FILENO preferred instead of {0,1,2}
+ * dieing --> dying
+ * SEGFAULT calls abort directly, instead of derefencing a NULL pointer
+
+- mod_accesslog
+
+ modified the accesslog format to be CLF compatible
+ set locale for LC_TIME to C
+
+26.03.2004 16:13
+- path info
+
+ enabled the pathinfo code again
+
+
+25.03.2004 13:30 - 1.1.3
+- portability
+
+ compiles fine now without any patches on IRIX
+
+- hostname detection
+
+ reworked "get the hostname for HTTP/1.0 requests which don't specify a
+ Host: ..." to only query the name in this single case for the server side
+ of the connection
+
+- errorlog handling
+
+ stderr is only used until the errorlog is init'ed
+ if no error-log is specified, syslog() is used
+ if cycling error-log fails, syslog() is used
+
+- accesslog cycling
+
+ don't fall back to stdout anymore
+
+- event-handler
+
+ use poll() as the default event-handler again
+
+24.03.2004 01:37 - 1.1.2a
+- error messages
+
+ added some hints to the failing error-messages
+
+22.03.2004 01:58 - 1.1.2
+- configure
+
+ some protability changes to get the 'inline' working with the MIPS CC
+
+21.03.2004 22:00
+- mod_rewrite, mod_redirect
+
+ reading the config for those two plugins was not working
+
+- fdevents
+
+ changed the compile time setting for the event handling into a run-time
+ setting.
+
+ server.event-handler = "select" # poll, linux-rtsig, linux-sysepoll
+
+ added sys_epoll() for linux 2.6
+
+ select - all systems
+ poll - Linux 2.1.23+, all XPG4-UNIX
+ sigio - linux 2.4.0+
+ sysepoll - linux 2.5.66+
+
+ 1000-4k-nok 1000-100k-nok
+ select 1776.99 296.52
+ poll 678.02 607.28
+ sigio 3754.46 1411.23
+ sysepoll 3817.67 1431.02
+
+21.03.2004 00:10
+- configure script
+
+ rewrote large parts of the lib/header detection of the configure script
+
+20.03.2004 01:39
+- fastcgi
+
+ as the docroot on external hosts might be different than the webserver
+ docroot it can now be specified in the config:
+
+ fastcgi.server = ( ".php" =>
+ ( "grisu" =>
+ (
+ "host" => "192.168.2.41",
+ "docroot" => "/home/jan/servers/",
+ "port" => 1026
+ )
+ )
+ )
+
+ a huge internal cleanup in the config handling made the code more readable.
+ some more warnings and error checking should track most of the config
+ errors for the fastcgi plugin
+
+19.03.2004 12:34
+- external patches
+
+ Matthijs van der Klip submitted three nice patches:
+ - turn off writing in mod_status if status.rrd-reports is set to disable
+ - fix for a debug message
+ - get the hostname for HTTP/1.0 requests which don't specify a Host: ...
+ - rc-script for RedHat
+
+- documentation
+
+ added a documentation section about authentification
+ - doc/authentification.txt
+
+19.03.2004 05:11
+- optimizations
+
+ implemented special versions of
+ - strcasecmp (array_strcasecmp)
+ - isdigit, isalpha, isalnum (light_*)
+
+ added a faster check for a finished header
+
+ after disabling all modules it is still possible to get 20 kreq/s.
+
+15.03.2004 19:45 - 1.1.1
+- localizer server
+
+ added the localizer-server module to the code
+
+- chunked-encoding
+
+ Apple's Safari or HTTP-Handler doesn't handle chunked-extensions defined by
+ RFC 2616 correctly and doesn't ignore them. Disabled the chunked-extension
+ which were just used for debugging purposes.
+
+07.03.2004 12:20
+- optimization
+
+ moved the checks if a plugins support a given function from the dispatcher
+ (plugins_call) to plugins_call_init() to do the check only once.
+
+ equalized the plugins functions to only two types:
+ SERVER_FUNC()
+ CONNECTION_FUNC()
+
+ replaced all handwritten plugin_call-handlers with macros
+
+ made all plugin-functions 'static'
+
+ with all plugins loaded we are at 15kreq/s gain
+ without any plugin loaded at 16kreq/s
+
+ before the change we were at 13kreq/s
+
+06.03.2004 21:13
+- compilation fixes
+
+ fixed some warnings on FreeBSD and NetBSD by adding
+ #include <netinet/in.h>
+
+ ifdef'ed a pcre-entry in base.h
+
+ remove #define _XOPEN_SOURCE from http_auth.c for IRIX
+ crypt() on Linux needs _XOPEN_SOURCE
+
+06.03.2004 19:18 - 1.1.0
+- authentification
+
+ added htpasswd and htdigest backends to work against user-files generated
+ by htpasswd and htdigest.
+
+ for basic auth:
+ - plain
+ - htpasswd (crypt only)
+ - htdigest
+
+ for digest auth:
+ - plain
+ - htdigest
+
+06.03.2004 17:35
+- authentification
+
+ check the method in the authorization header againt the configured method
+
+06.03.2004 14:54
+- hostname parsing
+
+ added a RFC-2396 conforming "Host:" parser
+ added 17 checks for the parser
+
+06.03.2004 10:25
+- configuration
+
+ added a warning for unknown configuration variables.
+
+ dropped the 'specific-for.url' ideas for now as it is not known yet how to
+ implement it the right way
+
+ renamed some config-variables to reflect there actual meaning
+ - server.host -> server.bind
+ - server.virtual-* -> simple-vhost.*
+ - server.userid -> server.username
+ - server.groupid -> server.groupname
+ - server.docroot -> server.document-root
+
+
+05.03.2004 15:36
+- fastcgi
+
+ internals: moved all mod_fastcgi settings from the global struct to the
+ plugin itself
+
+- vhosting
+
+ got a patch for enhanced virtualhosting from christian kruse -> mod_evhost
+
+ moved the virtual hosting config (server.virtual-*) to it's own module
+ called mod_simple_vhost
+
+23.02.2004 10:06
+- configfile
+
+ rearragned the config-file structure again to be able to add settings for
+ a given URL, Host, Filename, ...
+ This change affects some config-options directly (access.deny,
+ url.rewrite, url.redirect, virtual-hosting, ...)
+
+ added 'specific-for.url' for url specific config settings
+
+- digest auth
+
+ FIX: md5-sess type
+
+ seperate the auth-backend stuff
+
+13.02.2004 22:23 - lighttpd 1.0.3
+- content-length + POST
+
+ FIX: If header and content didn't fit into one single packet the rest of
+ the content was not read correctly
+
+13.02.2004 01:07
+- content-length + POST
+
+ the check for content-length on a POST request vanished somehow in one of
+ the previous releases.
+
+- header search
+
+ FIX: the search for header fields was up to now case-sensitive. Now it is
+ like required by the standard case-in-sensitive.
+
+- browser bugs
+
+ w3m 0.2.5 adds an additional \r\n at the end of the POST requests which is
+ handled now
+
+10.02.2004 10:12
+- start script
+
+ took the suse rc-skeleton which states to be LSB compliant and modified it
+ for lighttpd needs
+
+09.02.2004 11:48
+- HEAD requests
+
+ FIX: HEAD requests for static files delived the content from the GET
+ request. (test case is added)
+
+08.02.2004 15:53
+- directory listings
+
+ FIX: the pathname has not encoded at all before it was transfered to the
+ browser. a proper url and html-encoding has been added.
+
+ added modification-time and filesize to the output
+
+ added a basic css for the virtual listings
+
+07.02.2004 22:15 - lighttpd 1.0.2
+- sample configfile
+
+ rearranged the config-file to have all the important options at the top
+
+- docs
+
+ added a mod-rewrite options
+
+- mod_accesslog
+
+ stdout is no longer used a default for the accesslog
+
+- error-messages
+
+ the 404 is now reported in the error-log
+
+07.02.2004 17:30
+- configfile handling
+
+ if a key is used twice like
+
+ url.rewrite = ( "url1" => "url")
+ url.rewrite = ( "url2" => "url")
+
+ you get an error now. You have to write:
+
+ url.rewrite = ( "url1" => "url",
+ "url2" => "url")
+
+31.01.2004 12:22 - lighttpd 1.0.1
+- log cycling
+
+ added a sighup-handler to the plugin interface and fixed the log-cycling
+ for access-logs
+
+- portability
+
+ disabled the interval-time optimization on IRIX
+
+- documentation
+
+ added a lot of new documentation to README
+
+31.01.2004 10:59
+- status module
+
+ added two new options rrd-dir and rrd-reports:
+
+ rrd-reports = (boolean) # enables RRD-reports
+ rrd-dir = (string) # path for the daily status-files
+
+ fixed the "status-files in /"-bug this way
+
+
+22.01.2004 13:38 - lighttpd 1.0.0
+- simple docroot
+
+ fixed handling of docroots if virtual-host is disabled
+
+27.12.2003 11:12
+- license handling
+
+ added the first interface to license handling.
+
+25.12.2003 23:48
+- protability
+
+ Verified again that the code compiles and runs cleanly on Linux, FreeBSD,
+ NetBSD and IRIX
+
+ compiling with gcc and the option -pedantic works fine
+ compiling with mipspro cc works fine, too
+
+- tests
+
+ added some more tests: 39 tests
+
+25.12.2003 16:01
+- protability
+
+ some compile fixes for FreeBSD have been applied and a new switch has been
+ added to choose between IPv4 and IPv6 on FreeBSD.
+ (cmdline: -6, configfile: server.use-ipv6)
+
+- packaging
+
+ cleaned up the specfile for building RPMs
+
+21.12.2003 01:00
+- authorization
+
+ brought basic and digest auth back to life. this module as the last one
+ which had to be updated after the config-file changes
+
+- test harness framework
+
+ add 3 tests for basic auth
+
+20.12.2003 22:10
+- compression
+
+ added gzip compression (gzip-header + deflate + crc)
+
+- test harness framework
+
+ added a 22 tests to verify the correct behaviour of lighttpd
+
+- request parsing
+
+ GET http://www.yahoo.com/ HTTP/1.0
+
+ is handled now as
+
+ GET / HTTP/1.0
+
+- plugins
+
+ moved FastCGI and CGI handling into modules which can be loaded at run-time
+
+17.12.2003 13:18
+- compression
+
+ the directory structure is now build automaticly
+
+15.12.2003 01:00
+- compression
+
+ added a compression cache to the compression module (mod_compress)
+
+ Vary: Accept-Encoding is set now as it influences to delivered stream of
+ bytes. This is important for caches.
+
+10.12.2003 00:24
+- config files
+
+ a new config-file format is ready for the final release of lighttpd.
+
+ it supports:
+
+ server.docroot = "string"
+ server.host = integer
+ server.modules = ( "string", "string" )
+ server.mimetypes = ( "key" => "value" )
+ server.complex = ( "key" => ( "string", integer ),
+ "string",
+ integer )
+
+ the syntax should look familar to all who worked with Perl or PHP.
+
+ config-file handling has been seperated into a parser and a lexer. Both
+ are currently written by hand and will propably be rewritten into bison +
+ flex if time permits. But that would be a cosmetical change.
+
+05.12.2003 03:07
+- status-page
+
+ improved the status page to display
+ - the current connection-stati
+ - average throughput over 5 seconds
+ (requests/s and output-bound traffic)
+
+ now you can see what is going on in the server
+
+- access-log
+
+ the accesslog is now a module and can be disabled by just removing the
+ plugin from the list of loaded plugins
+
+04.12.2003 16:18
+- chroot-ing
+
+ how-to: using chroot
+
+ - chroot to /home/www/
+ - docroot at /servers/<hostname>/pages/
+ - defaulthost www.example.org
+
+ e.g. (external view)
+ /home/www/servers/www.example.org/pages/index.html
+
+ (in chroot)
+ /servers/www.example.org/pages/index.html
+
+ config:
+
+ chroot /home/www/
+ userid wwwrun
+ groupid nogroup
+
+ virtual-server-root /servers/
+ virtual-server-default-host www.example.org
+ virtual-server-docroot /pages/
+
+ The FastCGI process is living outside this chroot definition as it is
+ started seperatly.
+
+01.12.2003 02:06
+- cleanup
+
+ in preparation for the first stable release some internals had to be
+ cleaned up. Basicly it was a cleanup of workflow of the creation of the
+ response-header. All modules can use a clean interface for this purpose
+ now. This is espacially usefull for all modules which have to pass some
+ HTTP-headers to the client.
+
+29.11.2003 22:22
+- modules
+
+ finally moved the modules to shared libraries and cleaned up some code
+ path to become more readable.
+
+ So far we have:
+
+ mod_rewrite
+ mod_redirect
+ mod_access
+ mod_auth
+ mod_cache
+ mod_chat
+ mod_status
+ mod_maps
+
+28.11.2003 18:16
+- redirects
+
+ as lighttpd supports url-rewriting redirection was a few lines of new code.
+
+ redirect ^/wishlist/(.+) http://jan.kneschke.de/wishlist/$1
+
+ rewrite ^/wishlist/(.+) /new/wishlist/$1
+
+28.11.2003 17:00
+- signal stuff
+
+ setitimer is used to send a event every second to call time() only once a
+ second. another system call which has been remove from the main-loop.
+
+ sending HUP to lighttpd will close and re-open the logfiles. this is used
+ for cycling logfiles.
+
+#! /bin/sh
+
+###
+#
+# a simple logfile rotator for lighttpd
+#
+
+DATE=`date +"%Y%m%d-%H%M"`
+LPID=`pidof lighttpd`
+mv access.log access.log.${DATE}
+kill -HUP ${LPID}
+gzip access.log.${DATE}
+
+27.11.2003 01:07
+- native win32 port
+
+ a first attempt for a native win32 has been done. For now mingw is the
+ base for the development as it provides a basic unix-like framework for
+ building native win32 applications.
+
+ the most internal files have been ported and the over all progress is
+ going well. At the end this will just be a prove of concept.
+
+26.11.2003 01:17
+- access denied
+
+ added a access-deny filter to block specific urls like
+
+ access-deny ~
+ access-deny .inc
+
+17.11.2003 01:06
+- bug fixing
+
+ a fstat() on a opened fd which has changed reports wrong the file-info.
+ Using stat() again helps to solve this problem.
+
+ the sig-io version doesn't suffer from this problem.
+
+ the etags are now used for verifing file-cache-entries.
+
+- chat
+
+ enabled the internal login mechanism again
+
+ added support transfering session-infos over MySQL.
+
+15.11.2003 00:19
+- optimizing
+
+ added a buffer_equal_reverse function which is optimized version of strcmp
+ which is going backwards as pathnames are often the same for in the first
+ bytes.
+
+ wrote a one-pass parser for the request-header. The combination of
+ strstr(..., "\r\n") to seperate lines and strchr(..., ':') to seperate
+ keys from values more or less touched every byte twice.
+
+ we are still at 18.000 req/s for 4kb keep-alive requests even with etags
+ and handling all header fields.
+
+14.11.2003 17:26
+- fcgi
+
+ Content-Type wasn't passed correctly to the FastCGI app. HTTP_CONTENT_TYPE
+ was sent instead.
+
+- cache
+
+ provided access to the Session-ID
+
+- error-log
+
+ the timestamp is now written in a human readable form
+
+22.10.2003 00:06
+- fcgi, cgi
+
+ added a special set of array-functions which are optimised for the "insert
+ only once" case.
+
+ this provides access to the headers which are now forwarded to the external
+ interfaces. Before this change only a limited set of request-headers were
+ forwarded.
+
+21.10.2003 11:58
+- modules
+
+ added a new module-hook after the basic-init of the module for handling
+ config-settings and prepare the overall operartion (like building
+ db-connections, compiling regexes, ...)
+
+- cache
+
+ use turckmm-cache 2.4.3 to get some numbers for the php-latency:
+
+ /usr/sbin/ab -n 10000 -c 10 http://alba.home.kneschke.de:1025/index.php
+
+ handling the cache-decision and the cache-hit in php:
+
+ cache-miss: 100% (-&gt; $version = 0)
+
+ plain : 108.13 req/s
+ turckmm-cache: 218.39 req/s
+
+ cache-hit: 100% (-&gt; $version = 1)
+
+ plain : 164.45 req/s
+ turckmm-cache: 653.98 req/s
+
+ handling the cache-decision and the cache-hit in the server:
+
+ cache-hit: 100%, but using index.cml
+
+ cml: 4918.84 req/s (no keep-alive)
+ cml: 6901.31 req/s (keep-alive)
+
+ cache-miss: 100%, but using index.cml
+
+ plain : 108.39 req/s
+ turckmm-cache: 217.84 req/s
+
+ Conclusion:
+ - there is no loss in the cache-miss case through the cml-handling
+ - the cache-hit case can be improved dramaticly with lighttpd-cache
+ - turckmm-cache improves the cache-miss case alot
+
+20.10.2003 00:40
+- cache
+
+ the first 'real-life' test showed dramatic improvements in the req/s
+ handling.
+
+ The basic idea was to move the decision if a php-page can be taken from
+ the cache from the php-code to the webserver.
+
+ See here why this is a good thing:
+
+ the quite common code which works for http://jan.kneschke.de/ is using
+ templates and is quite static, but depends on 4 external files (the
+ menu-structure, the template, the current content, the class-file).
+
+ the index-file is always:
+
+ include_once "jk.inc";
+
+ $v = new view();
+ print $v->get(array(array ("file" => "content.html")));
+
+ It is more or less the same for all pages.
+
+ This basic setup can deliver 100 requests/s.
+
+ The next step has:
+ - application bases caching
+
+ as we know that each pages depends on those 4 files, you can check if they
+ have been modified since the last request and deliver the content from the
+ cache otherwise.
+
+ this increased the throughput to 150 req/s. (cache-hit ratio 100%)
+
+ The next logic step is to move the decision-making process out of the PHP
+ code as PHP is to slow for the cache-hit path:
+
+ a CML (Cache-Markup-Language) has been written which describes the whole
+ decision process which has been written in PHP-code before:
+
+
+output.content-type text/html
+
+output.include _cache.html
+
+trigger.handler index.php
+
+trigger.if file.mtime("../lib/php/menu.csv") > file.mtime("_cache.html")
+trigger.if file.mtime("templates/jk.tmpl") > file.mtime("_cache.html")
+trigger.if file.mtime("content.html") > file.mtime("_cache.html")
+
+ if one of the 'trigger.if' statements is true the 'trigger.handler' is
+ called to generate the pages.
+
+ if none of the them is trigger the files from 'output.include' are sent to
+ the browser with content-type specified in the first line:
+
+ The result was very 'promissing':
+
+ 5900 req/s with keep-alive
+ 3800 req/s without keep-alive
+
+ (both for a cache-hit ratio of 100%)
+
+ for keep-alive this is factor <b>59</b> against the plain un-cached
+ version and still <b>39</b> againt the php-cache-version which is doing
+ exactly the same.
+
+ Time for party. :)
+
+19.10.2003 - 18:55
+- cache
+
+ the handling of functions has been improved. they are now 'plugable'. just
+ the dlopen() stuff is missing.
+
+ a new datatype has been added: the string
+
+ this makes it possible to evaluate something like:
+
+trigger.if unix.time.now() - file.mtime("head.html") > 30
+trigger.if mysql.query("SELECT count(*) " + \
+ " FROM structure AS struc, session AS sess " + \
+ " WHERE struct.user = sess.user" + \
+ " AND sess.id = \"" + mysql.escape("ab\"c") + "\"")
+
+ you see:
+ - string operations (concat)
+ - handing of escape-sequences
+ - functions
+ - comparisions
+
+18.10.2003 - 13:39
+- cvs
+
+ imported everything into the cvs server which makes the whole revision
+ handler a lot easier. The CVS server was up all the time but not used.
+ Importing required 5 minutes of work which included merge the freebsd and
+ the linux tree.
+
+- compilers + platforms
+
+ on a regular various compilers and platform are check to compile with with
+ the current code base:
+
+ platform | os | compiler | state
+ ---------+---------------------+--------------+---------
+ ia32 | Linux 2.4.22 | gcc 2.95.3 | ok
+ ia32 | FreeBSD 5.1-CURRENT | gcc 3.3.1 | ok
+ mips64 | IRIX 6.5 | gcc 3.2.2 | ok
+ misp64 | IRIX 6.5 | MIPSpro 7.41 | ok
+
+ the mipspro compiler revealed some warning which resulted in a nice
+ code-cleanup that made the code more readable.
+
+18.10.2003 - 03:00
+- e-tags and friends
+
+ in preparation for the php-conference at the begin of november in
+ frankfurt/main the server has the support some more caching/proxy tags
+ like:
+ - E-Tag (14.19) [done]
+ - If-Match (14.24)
+ - If-None-Match (14.26) [done]
+ - If-Range (14.27)
+
+ Section (13.3.3) binds them together. [RFC 2616]
+
+ using lxr.kde.org and lxr.mozilla.org revealed that
+ - konqui only uses if-none-match
+ - mozilla uses if-none-match and if-range
+
+ it looks like it isn't that easy to trigger the if-range case.
+
+ As ulf suggested the etag is a hash of file-size, inode-number and mtime.
+
+- fd-caching
+
+ ulf just phoned me ask proposed the free the cache more agressivly in case
+ of fd-shortage. increasing the the fd-limit is the better idea. :)
+
+17.10.2003 12:45
+- chat
+
+ finished the mysql-support for storing the sessions
+
+12.10.2003 20:56
+- valgrind
+
+ used valgrind again to verify that the code a free of mem-leaks and found
+ a 'leak generator' in the chunk-api.
+
+ the last few leaks were just some missing free()'s at the end of the
+ program run which would have been freed anyway.
+
+ at the end valgrind couldn't find any missing free()'s.
+
+11.10.2003 12:09
+- FastCGI
+
+ reduced the number of system calls for FastCGI to WebServer to 2 calls per
+ fd-event. (ioctl() + read())
+
+ this has no direct effect of the performance of the server, but improves
+ the possible througput of the load-balancer.
+
+10.10.2003 21:09
+- FastCGI - load-balancing
+
+ a brown paper bug has been fixed which caused to decreasing throughput if
+ load-balancing was enabled.
+
+
+ benchmarking the req/s with load-balancing shows really nice results:
+
+
+ server : req/s comment
+ ---------+--------------------------------------------------
+ ulf : 764.06 (php)
+ lappi : 800.06 (php)
+
+ ulf+lappi: 1526.95 (2 * php)
+
+ grisu : 1265.66 (php + ab + lighttpd)
+
+
+ all : 1647.72 (3 * php + ab + lighttpd)
+ all(nice): 1904.40 (same as all, but the local php on grisu
+ has been 'nice -20'd)
+
+
+ if a php is run on the load-balancer it has to get a lower priority than
+ the load-balancer itself as to handle the work of (here) 3 php-servers.
+
+
+10.10.2003 15:11
+- java ?
+
+ http://jakarta.apache.org/tomcat/tomcat-4.1-doc/jk2/common/AJPv13.html
+
+08.10.2003 21:08
+- gigE
+
+ Last week 3 RTL8169S gigE cards arrived and were installed in the
+ test-framework.
+
+ They are very cheap (20 Euros) and are a good start for a low-level
+ benchmark network.
+
+ First result show us:
+
+ 48 Mb/s with ab.
+
+ The webserver and the test-server are equipped with a 2000+ AMD CPU. The
+ system load 95%, user load is 3%, the rest is idle on both plattforms.
+
+ After some calculations at gets clear that there are various bottlenecks:
+
+ 1. The PCI-Bus (32bit/33Mhz) can only transfer 133Mb/s
+ - 48 Mb/s TCP-Traffic results in 55Mb/s Ethernet-Traffic (verified with
+ slurm) [outgoing]
+ - there is about 10Mb/s incomming traffic at the PCI bus which the
+ requests
+ - the rest of the devices at the PCI bus are eating the last few mb/s
+ 2. IRQ-Handling
+ - There are reasons why the RTL8169S cards are so cheap
+ - they can't send jumbo-frames
+ - only 8k/64k buffers which results in a interrupt every 3 packets
+ - they are at least handling checksum offloading for ip, udp and tcp
+
+ In the end there is a need for new hardware to limit the throughput by the
+ Ethernet again.
+ - PCI-X, 64bit-PCI, ...
+ - 'real' gigE-Network cards
+ - ...
+
+
+ BTW: 2.4.22 + the r8139 driver are very flacky and resulted in 3 lock-ups
+ for today.
+
+ In another test the dual-PPro-FreeBSD 5.1-CURRENT machine has been used as
+ server with a gigE interface (re0) at has shown that the CPU is the limit
+ for this combination. The maximum thoughput was 7Mb/s.
+
+ Another small benchmark:
+ $ ab -n 1000 -c 10 http://192.168.2.41:&lt;port&gt;/lighttpd-20030925.tar
+
+ port | server | CPU Idle
+ ------+-------­---------+-----------
+ 1025 | lighttpd | 75%
+ 1026 | thttpd 2.23b1 | 75%
+ 1027 | boa-0.94.14rc17 | 69% *
+ 1028 | apache 1.3.x | 77%
+
+
+ In all 4 cases the thoughput was 8600 kbytes/s.
+
+ * boa had 9 failed transfers.
+
+- FreeBSD
+
+ The problems with FreeBSD 5.0-RELEASE vanished after updating to
+ 5.1-CURRENT.
+
+26.09.2003 18:22
+- FreeBSD
+
+ A SMP-machine has been added to the test-farm. It is running FreeBSD
+ 5.1-RELEASE and will help to the improve the scalability.
+
+ fixed sendfile() handling.
+
+- FreeBSD problems
+
+ FreeBSD-5.1-RELEASE-SMP
+ 2 * Pentium Pro 200 MHz
+ 192.168.2.38 (doubleheart)
+ (webserver [lighttpd at port 1025, thttpd at port 1027])
+
+ Linux 2.4.20
+ 1 * AMD 2000+
+ 192.168.2.10 (grisu)
+ (ab)
+
+ Problem:
+ Connections are reset by the kernel without any application intervention.
+
+ Calling 'ab' (apachebench) at grisu with the following paramters:
+
+ /usr/sbin/ab -n 10000 -c 10 http://192.168.2.38:1025/index.html
+
+ results in the following output:
+
+ ...
+ Time taken for tests: 40.610 seconds
+ Complete requests: 10000
+ Failed requests: 5980
+ (Connect: 0, Length: 5980, Exceptions: 0)
+ ...
+
+
+ This is reproducable and the number of failed requests is always
+ 5980 +/- 50 requests. In other words: after 4000 requests tcpdump shows
+ the following output:
+
+ tcpdump shows:
+
+ 00:53:48.923029 192.168.2.10.39774 &gt; 192.168.2.38.1025: S [tcp sum ok]
+ 1013737315:1013737315(0) win 5840 &lt;mss 1460,sackOK,timestamp 5208461
+ 0,nop,wscale0&gt; (DF) (ttl 64, id 7918, len 60)
+0x0000 4500 003c 1eee 4000 4006 964d c0a8 020a E..&lt;..@.@..M....
+0x0010 c0a8 0226 9b5e 0401 3c6c 6763 0000 0000 ...&amp;.^..&lt;lgc....
+0x0020 a002 16d0 eeaa 0000 0204 05b4 0402 080a ................
+0x0030 004f 798d 0000 0000 0103 0300 .Oy.........
+
+ 00:53:48.923330 192.168.2.38.1025 &gt; 192.168.2.10.39774: S [tcp sum ok]
+ 1803860672:1803860672(0) ack 1013737316 win 65535 &lt;mss 1460,nop,wscale
+ 1,nop,nop,timestamp 4459794 5208461&gt; (DF) (ttl 64, id 6821, len 60)
+0x0000 4500 003c 1aa5 4000 4006 9a96 c0a8 0226 E..&lt;..@.@......&amp;
+0x0010 c0a8 020a 0401 9b5e 6b84 bac0 3c6c 6764 .......^k...&lt;lgd
+0x0020 a012 ffff d4ce 0000 0204 05b4 0103 0301 ................
+0x0030 0101 080a 0044 0d12 004f 798d .....D...Oy.
+
+ 00:53:48.924009 192.168.2.10.39774 &gt; 192.168.2.38.1025: . [tcp sum ok] ack 1
+ win 5840 &lt;nop,nop,timestamp 5208461 4459794&gt; (DF)
+ (ttl 64, id 7919, len 52)
+0x0000 4500 0034 1eef 4000 4006 9654 c0a8 020a E..4..@.@..T....
+0x0010 c0a8 0226 9b5e 0401 3c6c 6764 6b84 bac1 ...&amp;.^..&lt;lgdk...
+0x0020 8010 16d0 e9c3 0000 0101 080a 004f 798d .............Oy.
+0x0030 0044 0d12
+
+ 00:53:48.924150 192.168.2.10.39774 &gt; 192.168.2.38.1025: P [tcp sum ok]
+ 1:29(28) ack 1 win 5840 &lt;nop,nop,timestamp 5208461 4459794&gt; (DF)
+ (ttl 64, id 7920, len 80)
+ 0x0000 4500 0050 1ef0 4000 4006 9637 c0a8 020a E..P..@.@..7....
+ 0x0010 c0a8 0226 9b5e 0401 3c6c 6764 6b84 bac1 ...&amp;.^..&lt;lgdk...
+ 0x0020 8018 16d0 27e4 0000 0101 080a 004f 798d ....'........Oy.
+ 0x0030 0044 0d12 4745 5420 2f69 6e64 6578 2e68 .D..GET./index.h
+ 0x0040 746d 6c20 4854 5450 2f31 2e30 0d0a 0d0a tml.HTTP/1.0....
+
+ 00:53:48.924728 192.168.2.38.1025 &gt; 192.168.2.10.39774: R [tcp sum ok]
+ 1803860673:1803860673(0) win 0 (ttl 64, id 6831, len 40)
+0x0000 4500 0028 1aaf 0000 4006 daa0 c0a8 0226 E..(....@......&amp;
+0x0010 c0a8 020a 0401 9b5e 6b84 bac1 0000 0000 .......^k.......
+0x0020 5004 0000 64ba 0000
+
+ SYN, SYN+ACK, ACK, DATA, RST
+
+ strace shows that no connection attempt has been reported to the
+ application which is poll()'ing the server socket.
+
+ /* the common loop without any block attempts */
+
+ accept(3, {sa_family=AF_UNSPEC, sa_data="\0\0\0\0\0\0\0\0\0\0\0\0\0\0"}, [0]) = 5
+ fcntl(5, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+ read(5, "GET /index.html HTTP/1.0\r\n\r\n", 4095) = 28
+ stat("/home/jan/lighttpd-0.1.0/servers/", {st_mode=S_IFDIR|0755, st_size=512, ...}) = 0
+ fstat(6, {st_mode=S_IFREG|0644, st_size=4348, ...}) = 0
+ write(5, "HTTP/1.0 200 OK\r\nConnection: clo"..., 235) = 235
+ write(2, "1064875136: (network.c.210) 235 "..., 33) = 33
+ syscall_393(0x6, 0x5, 0, 0, 0x10fc, 0, 0xbfbff2c0, 0) = 0
+ close(5) = 0
+
+ /* no futher waiting connections */
+
+ accept(3, 0xbfbff700, [1852702730]) = -1 EAGAIN (Resource temporarily unavailable)
+
+ /* enter the main-loop */
+
+ gettimeofday({1769235301, 1663069807}, NULL) = 0
+ poll([{fd=3, events=POLLIN}], 1, 1000) = 0
+ gettimeofday({4294967295, 65537}, NULL) = 0
+ poll([{fd=3, events=POLLIN}], 1, 1000) = 0
+ gettimeofday({4294967295, 65537}, NULL) = 0
+ poll([{fd=3, events=POLLIN}], 1, 1000) = 0
+ ...
+
+ (strace is broken for accept() and gettimeofday(), syscall_393() is sendfile())
+
+ after entering the main-loop the webserver doesn't receive any new POLLIN
+ events at all for the next 10-15 seconds. Any connection-attempt within
+ the period is, as you can see in the tcpdump output, accepted by the
+ kernel and the received data is thrown away as the kernel sends a RST.
+ After those 10-15 seconds the application gets a POLLIN event for the
+ server socket and the normal data-transfer taken place for the next 4000
+ requests.
+
+ This behaviour is reproducable with thttpd 2.20c and the current lighttpd.
+
+
+26.09.2003 11:42
+- localizer
+
+ ported the localizer-server application into a module for lighttpd. After
+ 30 minutes the code was ported and funtional. This modules provides access
+ to the localizer-db by a HTTP-Interface and generates the response as
+ HTML, CSV and plain-text.
+
+ So far, the module-interface looks good and flexible enough.
+
+ 7000 req/s is good enough too. Generating the HTML and querying the DB
+ needs some time.
+
+22.09.2003 08:40
+- modules
+
+ introduced a simple module interface which allow to hook into the process
+ of handling the requests. Basicly it allows to move the url-rewriter, the
+ auth-sub-system and the cache out of the main-code. The module-interface
+ will be extended to allow the cgi and the fastcgi sub-processes to be
+ moved into a module.
+
+15.09.2003 09:36
+- error-handling
+
+ fastcgi and cgi connections are now closed correctly if the corresponding
+ client-connection has died.
+
+14.09.2003 10:40
+- cgi
+
+ finally streaming works with CGI, too
+
+ this enable support for cgiirc.sf.net and friends which use streaming as
+ there transport mechanism.
+
+ streaming has been verified with cgiirc-0.5.2.
+
+- fdevents
+
+ there where some reports that sigio didn't work as expected. It just
+ reported no events at all. Looks like a known bug in the glibc on
+ those platforms.
+
+ Using poll() instead solve the problems.
+
+27.08.2003 22:12
+- rewrite
+
+ a pcre based rewrite engine has been integrated
+
+- cgi
+
+ the file-based cgi interface has been replace by two pipes.
+
+23.07.2003 13:29
+- fdevents
+
+ the whole fd-event handling has been reworked and several smaller bugs
+ and design-errors have fixed.
+
+ sigio, poll() and select() are working fine again.
+
+ On IRIX 6.5 SIGIO could be used, but without further testing poll() is used.
+
+- cgi
+ CGI-support is still broken.
+
+21.07.2003 18:46
+- dnotify
+
+ using the F_NOTIFY feautre of the Linux 2.4.x kernel gives anothre nice
+ performance boost as lighttpd can cache the stat()'s the right way, now.
+
+ 23009.66 @ 5-4k-k which means +10% against 30.06.2003 14:03
+
+ for 1000-4k-nok the performace nearly doubles: 3730.23 goes up to 6144.39
+
+17.07.2003 13:21
+- FreeBSD
+
+ a small patch (#include &lt;&gt;) to compile lighttpd on FreeBSD again.
+
+08.07.2003 10:48
+- fileinfo-cache
+
+ A reallife test showed that the cache wasn't perfect at all as it made
+ lighttpd crash. This is fixed now.
+
+30.06.2003 17:40
+- lighttpd-bench
+
+ After some problems with other benchmarking tools for webservers the first
+ version of lighttpd-bench has been written.
+
+ It a revealed a nasty strange behaviour which was fixed by increasing the
+ listen-backlog from 5 to 1024.
+
+30.06.2003 14:03
+- fileinfo-cache
+
+ the fileinfo-cache has been relaxed a little bit and there are always 2
+ fstat()'s per file-request now. This isn't that dramatic:
+
+ 21800.74 req/s is still a very good result (7-4k-k).
+
+29.06.2003 03:29
+- fileinfo-cache
+
+ a fileinfo cache has been added to reduce the number of system-calls to
+ stat and open a file.
+
+ in the releases before the same file was stat'ed at least 2 times plus a
+ stat on the docroot for each request. Now the stat()'s and the
+ corresponding open() + close() calls are cached and the number of system
+ calls has been reduced to the minimum:
+
+ $ strace -eopen,stat64,read,write,sendfile,accept,shutdown,close \
+ -p `pidof lighttpd`
+
+/* first connection */
+accept(3, {sin_family=AF_INET6, sin6_port=htons(56211),
+ inet_pton(AF_INET6, "::ffff:192.168.2.10", &amp;sin6_addr), sin6_flowinfo=0,
+ sin6_scope_id=0}, [28]) = 5
+accept(3, 0xbffff470, [28]) = -1 EAGAIN
+read(5, "GET /index.html HTTP/1.0\r\nUser-A"..., 4095) = 91
+stat64("/home/weigon/projects/lighttpd/servers/grisu.home.kneschke.de:1025/pages/",
+ {st_mode=S_IFDIR|0755, st_size=3656, ...}) = 0
+stat64("/home/weigon/projects/lighttpd/servers/grisu.home.kneschke.de:1025/pages//index.html",
+ {st_mode=S_IFREG|0644, st_size=4348, ...}) = 0
+open("/home/weigon/projects/lighttpd/servers/grisu.home.kneschke.de:1025/pages//index.html",
+ O_RDONLY) = 6
+write(5, "HTTP/1.0 200 OK\r\nConnection: clo"..., 235) = 235
+sendfile(5, 6, [0], 4348) = 4348
+shutdown(5, 1 /* send */) = 0
+close(5) = 0
+
+/* second connection */
+accept(3, {sin_family=AF_INET6, sin6_port=htons(56212), inet_pton(AF_INET6,
+ "::ffff:192.168.2.10", &amp;sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28])
+ = 5
+accept(3, 0xbffff470, [28]) = -1 EAGAIN
+read(5, "GET /index.html HTTP/1.0\r\nUser-A"..., 4095) = 91
+write(5, "HTTP/1.0 200 OK\r\nConnection: clo"..., 235) = 235
+sendfile(5, 6, [0], 4348) = 4348
+shutdown(5, 1 /* send */) = 0
+close(5) = 0
+
+
+ In the end we have a new speed record:
+
+ (ab -c 8 -n 100000 http://192.168.2.10:1025/index.html with poll())
+ Requests per second: 23435.67 [#/sec] (mean)
+
+ This is a speed increasement of 20-30% against the last internal benchmark.
+
+
+28.06.2003 02:30
+- caching framework
+
+ the trigger.if directive is working fine. the basic algebra is done ( +,
+ -, *, / and comperations =, &lt;=, &gt;=, &gt;, &lt; and the boolean logic
+ &amp;&amp; and || including braces)
+
+ two basic function are available:
+ - unix.time.now
+ - file.mtime(...)
+
+25.06.2003 17:33
+- caching framework
+
+ added output.include, output.content-type for a cache-hit and
+ trigger.handler for a cache-miss.
+
+ the actual decision is made be trigger.if which will be added tomorrow.
+
+15.06.2003 15:33
+- sig-io
+
+ After several other smaller optimisations lighttpd performs better with
+ sig-io under high load:
+
+ sigio+poll poll
+ c1000-4k-nok : 2635.95 1643.39
+ c1000-4k-k : 7335.68 6788.87
+ c1000-100k-nok: 2353.49 1217.73
+ c1000-100k-k : 3097.89 2080.73
+
+
+ The user-space part has been optimized a lot. Now it is time to optimized
+ the number of context-switches between user and kernel-mode.
+
+ user 0m0.180s
+ sys 0m1.160s
+
+ a fileinfo-cache is the way to go.
+
+ struct {
+ buffer *name;
+ struct stat st;
+ int handler;
+ ...
+
+ int fd;
+ void *mmap_p;
+ }
+
+11.06.2003 14:57
+- sig-io is back again
+
+ and it works fine.
+
+ sigio (Realtime-Signals under Linux 2.4.x) sends one signal per event and
+ buffers the rest of the events in a kernel queue. If the is full a SIGIO
+ is sent and poll() gets all events at once for further processing.
+
+
+ Currently the behaviour is a little bit strange:
+ - sig-io + poll() is good for non-keep-alive connections
+ - poll() for keep-alive connections
+
+ c1000-4k-nok: (1000 concurrent request, 4k filesize, no keepalive)
+ poll : 1521.38
+ sigio+poll: 2124.00
+
+ c1000-4k-k: (1000 concurrent request, 4k filesize, keepalive)
+ poll : 5882.35
+ sigio+poll: 1239.46
+
+ Very strange for now.
+
+09.06.2003 23:59
+- code-cleanup
+
+ the event-handling code has been rewritten to handle single events better
+ as they are expected from sig-io.
+
+ the fallback-mode of sig-io is broken now, but the normal poll() mode got
+ a 10% increasement in speed. This means the we are back the speed level of
+ 20030308-0155 are as fast as zeus again.
+
+ Especially under higher load the current lighttpd performes better.
+
+09.06.2003 11:51
+- sig-io benchmark
+
+ 20030609-1151 20030608-2110 20030308-0155
+-c 10 sigio select() poll() poll()
+4k : 7870.92 7937.77 8035.36 9443.76
+4k (keep-alive) : 14098.41 14590.02 14275.52 17985.61
+100k : 3366.32 3382.03 3261.15 3722.32
+100k (keep-alive) : 5544.77 5576.00 5573.20 5975.86
+-c 100
+4k : 6144.77 5821.40 5714.29 6724.95
+4k (keep-alive) : 9097.53 9213.19 8979.08 10833.06
+100k : 2549.33 2495.94 2318.95 2607.36
+100k (keep-alive) : 4267.67 4283.94 4094.17 4314.06
+
+
+For -c 100 4k and 100k sig-io gives a small increasment.
+
+09.06.2003 01:00
+- sig-io
+
+ writing large files works now as expected. After removing the limit for
+ the chunks of sendfile the write-buffer-is-empty-again signal is
+ generated. that was missing.
+
+ 321 of 10000 connections still have the wrong length. After that is fixed
+ it is time to start some benchmarks again.
+
+08.06.2003 21:10
+- sig-io
+
+ first attempts in getting SIGIO support running which were not very
+ successfull yet.
+
+- poll()/select() benchmark
+
+ 20030608-2110 20030525-1623 20030308-0155
+-c 10 select() poll() poll() poll()
+4k : 7937.77 8035.36 8166.60 9443.76
+4k (keep-alive) : 14590.02 14275.52 14781.97 17985.61
+100k : 3382.03 3261.15 3176.42 3722.32
+100k (keep-alive) : 5576.00 5573.20 5809.56 5975.86
+-c 100
+4k : 5821.40 5714.29 5669.26 6724.95
+4k (keep-alive) : 9213.19 8979.08 8418.22 10833.06
+100k : 2495.94 2318.95 2314.28 2607.36
+100k (keep-alive) : 4283.94 4094.17 4456.92 4314.06
+
+
+ as the overall processing cycle has been rearranged the overall figures
+ changed in minor ranges. c100-4k-k increased, *-100k-k decreased.
+
+ At least it still works.
+
+08.06.2003 12:45
+- select()/poll()
+
+ implementate an abstration layer for fd-events (like eevry other webserver).
+ currently we support poll() and select().
+
+ This should bring us support for Mac OS X and propably Windows.
+
+04.06.2003 18:35
+- configure
+
+ lighttpd can now be build without ssl-support even if openssl is installed
+
+- protability
+
+ - on IRIX IPv6 is supported now out of the box
+ - for FreeBSD some missing haeders have been added
+
+04.06.2003 14:34
+- pipelining
+
+ adding support for pipeling introduces a problem if the request-header
+ was broken. this has been fixed now.
+
+- unneccesary slashes
+
+ when building pathes from different portions of a string (e.g. docroot +
+ virt-server-docroot + request-uri) slashes where added for security and
+ simplicity. This resulted in up to 5 adjacent slashes which caused no harm
+ but looked strange. (fixed)
+
+04.06.2003 09:57
+- start/stop messages
+
+ the error-log contains the start and end-times of the lighttpd process,
+ now.
+
+- configfile
+
+ the config-file parser has been relaxed to accepts tabs instead of spaces.
+
+- better error-handling
+
+ fixed a <a
+ href="http://bugs.php.net/?id=24009">bug in the FastCGI-SAPI of PHP</a>
+
+ if the fastcgi process dies or closes the connection unexpectedly we
+ return 500 now instead of closing the connection to the client.
+
+- Location
+
+ the CGI/1.1-rev-03 specification requires us to send Status 302 if a
+ Location-header is sent by the client and a Status-header is missing.
+
+- PATH_TRANSLATED
+
+ if PHP is compiled without --discard-path PATH_TRANSLATED has to be
+ provided.
+
+27.05.2003 15:54
+- directory listings
+
+ if a directory is requested and the directory doesn't contain a index-file
+ a directory-listing can be displayed. You have to enable directory-listings
+ in the config-file (directory-listings on)
+
+- url-decoding
+
+ up to know urls where not decoded at all (%26 -> . and so on). This has
+ been added. Unicode isn't supported as we use 8-bit chars internally.
+
+26.05.2003 00:44
+- pipelining
+
+ as Sascha required pipelining for his benchmarking tool it has been
+ implemented.
+
+ pipelining allows sending a bunch of requests at once without waiting for
+ the actual responses. This reduces the network-overhead and the
+ round-trip-time.
+
+- non-free()d memory
+
+ dmalloc helped to close some non-free()d memory. For the normal operation
+ this isn't important as only memory chunks which had to be free()d at the
+ end of the live-time of the lighttpd-process were not de-allocated.
+
+- partly-initialized variables
+
+ lighttpd wasn't initializing the main-structure which resulted in strange
+ behaviour in rare circumstances.
+
+
+25.05.2003 16:23
+- benchmarks
+
+ after removing some useless internal copies we are more or less at the old
+ speed levels.
+
+ after adding virtual-hosts 10% of the performance were lost. Using less
+ memcpy() operations might add several other boosts.
+
+ I've just checked how lighttpd compares to Zeus.
+
+ lighttpd (current) (old)
+-c 10 20030525-1623 20030308-0155 Zeus 4_2
+4k : 8166.60 9443.76 7278.55
+4k (keep-alive) : 14781.97 17985.61 16496.21
+100k : 3176.42 3722.32 3156.37
+100k (keep-alive) : 5809.56 5975.86 5460.30
+-c 100
+4k : 5669.26 6724.95 5134.26
+4k (keep-alive) : 8418.22 10833.06 8010.25
+100k : 2314.28 2607.36 2688.32
+100k (keep-alive) : 4456.92 4314.06 4240.70
+
+23.05.2003 14:38
+- cgi-variables
+
+ HTTP_HOST was missing for the cgi-module while the fcgi-module passed it
+ through to the handler. Fixed that.
+
+- fcgi-errors
+
+ the connection to the fcgi was dropped and poll() reported an error, the
+ error wasn't reported to the client the right way.
+
+22.05.2003 23:02
+- authorization
+
+ the first password-storage has been added:
+
+ [auth]
+ backend plan
+ plain-userfile &lt;filename&gt;
+
+ require /download/ user=jan|user=anom
+ http-auth /download/ "download archiv" digest
+
+ groups are prepared but not implemented. basic and digest are working fine.
+
+20.05.2003 17:53
+- authentification
+
+ The auth-methods from RFC 2617 have been added.
+ - auth basic
+ - auth digest
+
+ The only source for accounts is currently only the config-file.
+
+ auth-digest needs the plain-text passwort. Are there any source which
+ provide a plain-text password ?
+
+12.05.2003 14:33
+- virtual hosts
+
+ added very basic virtual-host support
+
+ virtual-server-root /home/weigon/projects/lighttpd/servers/
+ virtual-server-default-host grisu.home.kneschke.de:1025
+ virtual-server-docroot /pages/
+
+ docroot is
+
+ - if http-host exists
+ &lt;virtual-server-root&gt; + &lt;http-host&gt; + &lt;virtual-server-docroot&gt;
+
+ - otherwise
+ &lt;virtual-server-root&gt; + &lt;virtual-server-default-host&gt; +
+ &lt;virtual-server-docroot&gt;
+
+ - if even virtual-server-default-host does not exist, 500 is sent
+
+
+12.05.2003 13:02
+- code cleanup
+
+ After two month of development it was time clean-up the internal
+ structures. It looks like every went fine as lighttpd works es expected
+ like before.
+
+- deflate
+ the on-the-fly compression has been verified to work fine with opera,
+ konqui, mozilla and the IE.
+
+12.05.2003 02:10
+- on-the-fly compression: deflate
+
+ Why the hell are the defining a "deflate" encoding in the form of
+
+ _deflate_ The "zlib" format defined in RFC 1950 [31] in combination
+ with the "deflate" compression mechanism described in RFC 1951 [29].
+ (RFC 2616)
+
+ and noone implements it that way ? Konqui and Mozilla expect a plain
+ deflate() package without the zlib-header.
+
+ Konqui is using "inflate2(..., -MAX_WBITS); " which is noted in the zlib
+ source as
+
+ /* handle undocumented nowrap option (no zlib header or check) */
+
+ Funny. Very, very funny.
+
+
+ Anyway. We have mimetype-depended compression support now.
+
+11.05.2003 21:56
+- logging
+ re-arranged the logfile structure to write CLF + useragent + referrer.
+
+11.05.2003 10:23
+- POST file-upload
+ added the missing functionality to send more than a single packet to the
+ FCGI-Server (or Client ? ... the PHP).
+
+ This gives us the file-upload thing for eg. PHP and large user-forms
+ (&gt;16kb).
+
+05.05.2003 15:21
+- PATH_INFO
+
+ added support for PATH_INFO. PHP is a little strange and doesn't trust the
+ passed PATH_INFO setting. Works fine now.
+
+30.04.2003 15:25
+- bug-fixing day
+
+ While testing the FastCGI interface with the MSIE Björn Schotte discovered
+ that sometimes the output repeats itself from the start in an endless loop.
+ This bug has been fixed.
+
+ The read-write-fallback for ancient systems seeked the wrong FDs.
+
+ The FastCGI handler is now separting the HTTP-Header from the
+ response-body what results in a cleaner interface. The "header too long
+ for caching" message is gone now.
+
+28.04.2003 18:18
+- chunked transfer-encoding
+
+ The FastCGI part is now using Chunked-Transfer-Encoding if HTTP/1.1 is
+ used and no content-length is specified.
+
+27.04.2003 23:10
+- chunked transfer-encoding
+ added "Transfer-Encoding: chunked" which is currently used in the web-chat
+ for the endless stream. Perhaps it helps some browsers.
+
+ The FastCGI interface will get a the chunked-support too, as it will
+ enable keep-alive even if no content-length is returned from the FastCGI
+ process. We know the size of the chunks and will report it to the browser.
+
+16.04.2003 12:02
+- gigE deatchmatch
+
+ sascha compared the current lighttpd to his premium thttpd in his
+ gigabit-Ethernet-Network.
+
+ <a
+href="http://schumann.cx/gbit_deathmatch.txt">http://schumann.cx/gbit_deathmatch.txt</a>
+
+ small comment:
+ lighttpd provides the same performance (req/s and thoughput), but uses more
+ CPU-Time.
+
+10.04.2003 17:22
+- works on IRIX
+
+ Jörg Behrens provided me login to his SGI Origin and after fixing two small
+ typos it worked fine on IRIX. (#if define HAVE... was missing a 'd' and
+ getopt returns a 'int' and not a 'char')
+
+ IPv6 support is currently disabled for IRIX a gethostbyname2() isn't
+ available.
+
+10.04.2003 15:56
+- another bug-fixing day
+ The upper limit of open connections was enforced and a caused a seg-fault.
+ The current limit is set to 4096 parallel connections.
+
+ As sascha benchmarked lighttpd and his premium thttpd I tried to reproduce
+ his reported results and had to fix 2 flaws in the async-io handling of
+ httpd_load which was used for the testing.
+
+ If sascha starts another benchmark session I'll put a link to it here.
+
+09.04.2003 00:08
+- bug-fixing time
+ Date: and Last-Modified: where sending a timezone != GMT what was invalid.
+ The timestamp itself was correct, just the timezone use the wrong
+ characters.
+
+ the fcgi-code had an buffer-overflow for larger POST-Requests.
+
+ The fcgi-code still has problems with POST-Request larger than 16kb as the
+ the write buffer is full. Currently we don't handle this case except from
+ reporting it in the error-log.
+
+02.04.2003 01:17
+- cgi is back
+
+ The CGI Interface wasn't tested for a longer time. It don't really
+ survived the introduction of the config-file handling and the internal
+ changes that were part of it.
+
+ A small test with
+
+#! /usr/bin/perl
+print "Content-Type: text/html\r\n\r\n";
+print time()."\n";
+0;
+
+ produced 219 req/s.
+
+ Calling PHP via the CGI interface results in 100 req/s. Same script, same
+ parameters for 'ab' and same PHP result in 1400 req/s if we use the
+ FastCGI interface.
+
+ <b>Don't forget</b>: these benchmarks only represent figures for scenarios which
+ are not very realistic. They are just usefull for comparisions of the
+ internals. We don't want to benchmark applications.
+
+01.04.2003 23:04
+- new benchmarks
+
+ This time we wanted to see if we can get the fastcgi-Interface a little bit
+ faster. We use this small script for the testing the interface.
+
+&lt;?php
+
+ob_start(/*"ob_gzhandler"*/);
+print "12345&lt;br /&gt;\n";
+header("Content-Length: ".ob_get_length());
+ob_end_flush();
+
+?&gt;
+
+ It generate a small network load and is the best case for benchmarking the
+ overhead of the call to the fastcgi-php.
+
+ Using the chunk-API instead auf tmp-files increase the req/s vom 1200req/s
+ to 1600 req/s and the IO-load went down as expected. Waiting for the
+ filesystem and creating 1200 files per second required some time. The
+ CGI-Interface is still using tempfiles.
+
+01.04.2003 19:28 (no april fools joke)
+- added SSL support
+ I took -lssl and -lcrypto and added SSLv2/SSLv3/TLS support to lighttpd.
+
+ After some reading I realisized that libcrypto contained some of my code.
+ They have a similar buffer-struct with similar functions and they use the
+ same MD5-code from the RFC. :)
+
+ Adding basic SSL-support was quite esay: replacing all write/read-calls by
+ SSL_write/read, initializing the ssl-context the right way and telling
+ openssl where to get the data from (SSL_set_fd). It fits really well into
+ lighttpd.
+
+- sidenote
+ sooner or later the con->filename handler will vanish in favour of the
+ direct interface to the chunk-API which will simplifiy the design a little
+ bit.
+
+31.03.2003 20:50
+- added a web-chat module
+ 1400 lines of C-code are neccesary to add a web-chat to lighttpd.
+
+ Features:
+ - bb-code for text-layouting
+ - auto-highlight for URLs and Email-adresses
+ - unlimited number of channels
+ - max. 32.000 users per channel
+ - fast as it is directly integrated into the web-server
+ - easy to install (as easy as lighttpd)
+ - IRC-like (/msg, /kick, /me, ...)
+ - works with MS IE, Mozilla, Konqueror, ...
+ - uses as little JavaScript as possible to stay compatible with all browsers
+ - flood-protection (2 Levels: ignore and kick)
+ - uses CSS for customized look-and-feel
+
+25.03.2003 00:36
+- finished the config-file support
+ now we have config-sections
+
+ [fastcgi]
+ fastcgi .php 192.168.2.76 1025
+
+ The only this missing is -HUP handling to re-read the config. But that
+ will follow when I'm up again.
+
+20.03.2003 01:04
+- adding config-file support
+ the most boring part of the writing programs after writing documentation.
+ The format is quite simple and good enough for lighttpd.
+
+19.03.2003 03:05
+- more on sendfile support
+ added support for freebsd's version of sendfile().
+
+ Linux:
+ ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
+
+ FreeBSD:
+ int sendfile(int fd, int s, off_t offset, size_t nbytes,
+ struct sf_hdtr *hdtr, off_t *sbytes, int flags);
+
+ the first 2 params are swap, the next 2 are the same and the last 3 are
+ set to NULL or 0.
+
+ Solaris 9 is providing a direct interface to the chunk-API with the
+ sendfilev() system call:
+
+ ssize_t sendfilev(int fildes,
+ const struct sendfilevec *vec, int sfvcnt, size_t *xferred);
+
+ recovering from a failure is a little bit more complex, but it should be
+ fast. I just need a system to test it. Anyone ?
+
+18.03.2003 17:32
+- in the news
+ what a surprise: lighttpd is announced in entwickler.com.
+
+ <a href="http://www.entwickler.com/itr/news/psecom,id,9483,nodeid,82.html">http://www.entwickler.com/itr/news/psecom,id,9483,nodeid,82.html</a>
+
+ this was not planned.
+
+
+- implemented the chunked-API
+ rather writing the content of multi-range'd requests to a temp-file we
+ just register the parts in a chunk-queue.
+
+ chunk 1 [mem] - part-header
+ chunk 2 [file] - source-file (offset, len)
+ chunk 3 [mem] - part-header
+ chunk 4 [file] - source-file (offset, len)
+ chunk 5 [mem] - part-footer
+
+ If everything is prepared, the content-length is calculated and the
+ http-header is generated and prepended to the chunk-queue.
+
+ the handle_write() function which handles the write-process just sends the
+ chunks to the network without only further modifications.
+
+ the chunk-api even simplifies the
+ 'my-fastcgi-process-needs-some-time-to-create-the-response-
+ and-sends-the-data-in-chunks' case. Just add the chunk to the queue if it
+ is received.
+
+13.03.2003 10:49
+- another set of real-life benchmarks
+
+ the chairman was benchmarked a little bit. Chairman is full-flegded WCMS.
+ As every CMS it needs some time to generate pages. To speed the page
+ generating the static-parts of the page can be cached internally.
+
+ without caching with caching
+apache + mod_php : 2.50 10.64 req/s
+lighttpd + fcgi-php: 2.50 22.74 req/s
+
+ Looks like lighttpd is the way to go :)
+
+ Please, don't compare these numbers with the other benchmarks:
+ We used a different test-machine which is a little bit under-powered
+ for this test-case.
+
+12.03.2003 13:43
+- another large application works with lighttpd
+
+ <a
+href="http://www.thinkphp.de/content/content2.php?CatID=44&amp;NewsID=95">Chairman</a> from <a href="http://www.thinkphp.de/">thinkphp</a> has been verified to work with lighttpd.
+
+ Three things are worth to note:
+
+ 1. ALWAYS use log_error in the php.ini if you use FastCGI
+ otherwise it will put the errormessages directly into fastcgi-socket
+ without any FastCGI Header. This will result in strange errors.
+ (its a PHP bug)
+ 2. DOCUMENT_ROOT has been added to the environment variables
+ 3. a small bug for sending larger output from a fastcgi client has been
+ fixed.
+
+11.03.2003 11:52
+- added two neccesary features
+ - redirect _dir_ to _dir_/
+ - append index-file to _dir_/ if they exist
+
+11.03.2003 00:13
+- another target
+ after adding some headers lighttpd compiles without any warnings
+ under cygwin on Windows.
+
+ A native windows port will take some time as I have to figure out the
+ changes on the winsock.h to the unix headers.
+
+10.03.2003 11:52
+- added Solaris 8 and 9
+ lighttpd has been confirmed to compile and work on
+
+ - linux
+ - FreeBSD, NetBSD
+ - Solaris 8, 9
+
+ Perhaps I can get lcc to compile it on windows.
+
+10.03.2003 01:30
+- another platform was confirmed
+ lighttpd works on NetBSD
+
+- another webserver benchmark
+ mathopd (http://www.mathopd.org/)
+
+ Mathopd/1.4
+-c 10
+4k : 6329.11 [#/sec]
+4k (keep-alive) : 10235.41 [#/sec]
+100k : 1168.50 [#/sec]
+100k (keep-alive) : 268.82 [#/sec] (99% idle)
+-c 100
+4k : ---- (connections dropped)
+4k (keep-alive) : ----
+100k : ----
+100k (keep-alive) : ----
+
+Very good values for small files, but the rest ?
+
+10.03.2003 00:06
+- added more write-handlers
+ 1. sendfile (linux only)
+ 2. mmap + write
+ 3. read + write
+
+ This means that lighttpd runs on some more systems. It has been verified
+ to compile and work on linux 2.4.x and FreeBSD.
+
+
+-c 100
+ sendfile mmap read
+4k 6476.68 5698.01 5363.08 [#/sec]
+100k 2312.35 841.54 783.09 [#/sec]
+
+ The mmap() numbers could be better with a fd+mmap-cache. The zero-copy thing
+ is good for our performance.
+
+- tested another small httpd - BOA
+ just to get a better view about the performance of lighttpd i've tested
+ another httpd: Boa/0.94.14rc16 (http://www.boa.org/)
+
+ Boa/0.94.14rc16
+-c 10
+4k : 5659.63 [#/sec]
+4k (keep-alive) : 250.23 [#/sec]
+100k : 1104.29 [#/sec]
+100k (keep-alive) : 1363.14 [#/sec]
+-c 100
+4k : 4319.65 [#/sec]
+4k (keep-alive) : 2490.66 [#/sec]
+100k : 815.93 [#/sec]
+100k (keep-alive) : 1007.05 [#/sec]
+
+ The results are a little bit strange. Keep-Alive for small files seems to be
+ broken.
+
+ It looks like lighttpd has enough power for now. Time the port and add more
+ features.
+
+09.03.2003 13:26
+- load-balancing works great
+
+ I used the framework from http://framework.netuse.de/ as a
+ real-life example again to test the load-balancer.
+
+ setup:
+ - grisu
+ - AMD athlon XP 2000+
+ - runs lighttpd + ab + a 'nice -15'ed FastCGI-PHP
+ - generates 153 req/s alone
+
+ - laptop
+ - Intel PIII 850
+ - runs a FastCGI-PHP
+ - generates 88 req/s
+
+ using the internal load-balancer of lighttpd which balances the
+ php-requests over grisu and laptop generate:
+ 221 req/s
+
+ An apache with mod_php running on grisu gives 117.04 req/s only.
+
+09.03.2003 12:46
+- building the connect connection to the fcgi-php is not non-blocking
+ socket() -> connect() -> fcntl(non-blocking) resulted in some problems as
+ the connect() call blocked sometimes for 1 seconds.
+
+ socket() -> fcntl(non-blocking) -> connect() solves this problem, but
+ addes more overhead. The first connect-attempt seems always to
+ return EINPROGRESS.
+
+08.03.2003 15:06
+- the first 'real-life' PHP test showed 2 bugs in the POST handling.
+ 1. the Content-Type header was not forwarded via fastcgi
+ 2. the internal content_length handler wasn't reset after the request
+
+ now lighttpd + php work with
+
+ http://framework.netuse.de/
+
+ the basic application gives us 145 req/s
+
+08.03.2003 11:06
+- use diet to 'test' your code
+ diet gives some use full warnings which should be followed. I took the
+ chance and removed the last few fprintf() and sprintf() from the code.
+ now, we don't need stdio.h anymore.
+
+ a staticly linked, stripped lighttpd is 42884 bytes large.
+
+08.03.2003 01:55
+- buffer_strcat() uses strlen() to get the length of the 'to-be-catted-string'
+ if the string is constant or has a known length you can pass that function
+ which gives use buffer_strcat_len() which passes the string length as a
+ parameter.
+
+- using a ramdisk as the base for the tempfiles generated mkstemp() is a
+ very cood idea
+ it reduces the io-load on the system and gives as more cpu-time for
+ load-balancing the php-requests.
+
+- cache the output of strftime(), gmtime() and localtime
+ we generate more then 10.000 req/s which results in using the same
+ timestamp over and over again. It is sufficient to generate the timestamp
+ once a second and give us a bunch of CPU-cycles for sending files.
+
+ the same applies for other timestamps like Last-modified which sends a
+ string version of st.st_mtime. Cache it.
+
+- don't try to overoptimize for code for the sake of clean code
+ the range support require some hack in the first versions like setting the
+ write_offset to the start of the range and keeping the rest of the
+ "code 200" send code as usual. Only a few lines added this first range
+ feature. fast, but a hack. It made things more complicated then neccesary
+ to add multi-range support in this scenario.
+
+ removing the hack doing small clean preprocessing helps to clean up the
+ whole 'write a chunk on the wire' code. At the end we use less code and
+ have a cleaner design.
+
+ Sascha proposed a chunked layer which just takes the chunks (http-header,
+ part-header, part-message, ... and the last boundary) and passes them to
+ the write-to-the-wire-code. This is far more elegant and will perhaps same
+ us from other problems, too. Currently I think that it is not necessary.
+ First we have to fix some protability issues.
+
+Ok, today benches:
+
+ today last
+-c 10
+4k : 9443.76 7739.94 + 22%
+4k (keep-alive) : 17985.61 13885.03 + 29%
+100k : 3722.32 3349.97 + 11%
+100k (keep-alive) : 5975.86 4965.49 + 20%
+-c 100
+4k : 6724.95 5918.56 + 13%
+4k (keep-alive) : 10833.06 8405.48 + 28%
+100k : 2607.36 2393.60 + 9%
+100k (keep-alive) : 4314.06 4035.35 + 7%
+
+Top Transfer Rate:
+
+ 86365.77 [Kbytes/sec] received
+
+Too much for a GigE-link ?
+
+
+so far:
+
+- use state-engines
+
+ a non-forking webserver like described in
+
+ http://www.kegel.com/c10k.html
+
+- don't use fprintf() for logging.
+ writing one line to log file takes more time that sending responsing the a
+ HTTP-request
+
+- take care of your memory
+
+ typedef struct {
+ char *ptr;
+ size_t used;
+ size_t size;
+ } buffer;
+
+ buffer* buffer_init();
+ void buffer_free(buffer *b);
+ int buffer_prepare_copy(buffer *b, size_t size);
+ int buffer_prepare_append(buffer *b, size_t size);
+ int buffer_strcpy(buffer *b, const char *s);
+ int buffer_strcpy_len(buffer *b, const char *s, int s_len);
+ int buffer_strcat(buffer *b, const char *s);
+ int buffer_strcat_len(buffer *b, const char *s, int s_len);
+
+ buffer_init() is only called once per buffer. If you don't need the
+ buffer, set 'used' to zero and reused it afterward.
+ buffer_strcpy() + buffer_strcat() check if the 'used' + the new strlen()
+ fit in to the 'size' of the buffer. If not the realloc() the buffer.
+ buffer_strcat() uses memcpy(ptr + used - 1, s, s_len + 1); which should
+ be faster than the original strcat().
+
+ Using those buffers keep the memory usage at 2Mb. malloc() and free() are
+ only called at the beginnig of the programm and at the end.
+
+- don't used sprintf() to convert a integer into a string as like
+ sprintf(buf, "%d", l);
+
+ write your own ltostr function. sprintf() is to general for the case and
+ is slow.
+
+
+Speed:
+------
+
+Let's assume that <a
+href="http://www.acme.com/software/thttpd/">thttpd</a> is (one of) the
+fastest webservers out there.
+
+all httpds were started with:
+
+$ ./thttpd -p 1026 -D \
+ -d /home/weigon/projects/localizer/src/lighttpd/docroot/ \
+ -l thttpd.access.log
+
+(lighttpd uses the same parameters).
+
+We used ApacheBench for testing the RPS (requests per second).
+
+$ /usr/sbin/ab -dS -c 10 -n 100000 http://192.168.2.10:80/dummy.out
+
+ lighttpd thttpd/2.21b+php thttpd/2.20c thttpd/2.23b1
+(concurrency 10)
+4k : 7739.94 6040.84 5078.20 5888.24 [#/sec]
+4k (keep-alive): 13885.03 10349.82 5034.49 5853.09 [#/sec]
+100k : 3349.97 1176.29[1] 1188.74 1198.29 [#/sec]
+100k (keep-a.) : 4965.49 2513.38[2] 1100.65 1130.51 [#/sec]
+(concurrency 100)
+4k : 5918.56 4907.01 4987.53 4886.87 [#/sec]
+4k (keep-alive): 8405.48 6379.99 4938.76 4816.26 [#/sec]
+100k : 2393.60 972.73 958.27 961.09 [#/sec]
+100k (keep-a.) : 4035.35 893.51[3] 970.21 955.05 [#/sec]
+
+thttpd/2.21b+php has been patched with the keep-alive + php patches from PHP4
+sapi/thttpd/thttpd_patch.
+
+[1] ab reported:
+Failed requests: 1
+ (Connect: 0, Length: 1, Exceptions: 0)
+[2] ab reported:
+Failed requests: 5
+ (Connect: 0, Length: 5, Exceptions: 0)
+[3] ab reported:
+Failed requests: 24
+ (Connect: 0, Length: 24, Exceptions: 0)
+
+Tunning the thttpd:
+-------------------
+- disable symlink checking (chroot() or -nos)
+- log to /dev/shm/logfile, a ramdisk or disable logging
+
+
+$ ./thttpd -p 1026 -D \
+ -d /home/weigon/projects/localizer/src/lighttpd/docroot/ \
+ -l /dev/null
+