summaryrefslogtreecommitdiff
path: root/ChangeLog
diff options
context:
space:
mode:
Diffstat (limited to 'ChangeLog')
-rw-r--r--ChangeLog4031
1 files changed, 0 insertions, 4031 deletions
diff --git a/ChangeLog b/ChangeLog
deleted file mode 100644
index 8853a4de..00000000
--- a/ChangeLog
+++ /dev/null
@@ -1,4031 +0,0 @@
-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
-