diff options
author | Krzysztof Krzyżaniak <eloy@debian.org> | 2009-10-30 16:38:42 +0000 |
---|---|---|
committer | Krzysztof Krzyżaniak <eloy@debian.org> | 2009-10-30 16:38:42 +0000 |
commit | d5c3fb3805049d4c1d2ba3c01c3d1a8828f04869 (patch) | |
tree | 8d5aeb317979b71999c602629ced8bb1c37f1ef4 /ChangeLog | |
parent | 9bcc98802118528450e76a95710f2fcfd8457dc8 (diff) | |
download | lighttpd-d5c3fb3805049d4c1d2ba3c01c3d1a8828f04869.tar.gz |
new upstream version
Diffstat (limited to 'ChangeLog')
-rw-r--r-- | ChangeLog | 4031 |
1 files changed, 0 insertions, 4031 deletions
diff --git a/ChangeLog b/ChangeLog deleted file mode 100644 index 642ad53..0000000 --- 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% (-> $version = 0) - - plain : 108.13 req/s - turckmm-cache: 218.39 req/s - - cache-hit: 100% (-> $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:<port>/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 > 192.168.2.38.1025: S [tcp sum ok] - 1013737315:1013737315(0) win 5840 <mss 1460,sackOK,timestamp 5208461 - 0,nop,wscale0> (DF) (ttl 64, id 7918, len 60) -0x0000 4500 003c 1eee 4000 4006 964d c0a8 020a E..<..@.@..M.... -0x0010 c0a8 0226 9b5e 0401 3c6c 6763 0000 0000 ...&.^..<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 > 192.168.2.10.39774: S [tcp sum ok] - 1803860672:1803860672(0) ack 1013737316 win 65535 <mss 1460,nop,wscale - 1,nop,nop,timestamp 4459794 5208461> (DF) (ttl 64, id 6821, len 60) -0x0000 4500 003c 1aa5 4000 4006 9a96 c0a8 0226 E..<..@.@......& -0x0010 c0a8 020a 0401 9b5e 6b84 bac0 3c6c 6764 .......^k...<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 > 192.168.2.38.1025: . [tcp sum ok] ack 1 - win 5840 <nop,nop,timestamp 5208461 4459794> (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 ...&.^..<lgdk... -0x0020 8010 16d0 e9c3 0000 0101 080a 004f 798d .............Oy. -0x0030 0044 0d12 - - 00:53:48.924150 192.168.2.10.39774 > 192.168.2.38.1025: P [tcp sum ok] - 1:29(28) ack 1 win 5840 <nop,nop,timestamp 5208461 4459794> (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 ...&.^..<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 > 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..(....@......& -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 <>) 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", &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", &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 =, <=, >=, >, < and the boolean logic - && 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 <filename> - - 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 - <virtual-server-root> + <http-host> + <virtual-server-docroot> - - - otherwise - <virtual-server-root> + <virtual-server-default-host> + - <virtual-server-docroot> - - - 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 - (>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. - -<?php - -ob_start(/*"ob_gzhandler"*/); -print "12345<br />\n"; -header("Content-Length: ".ob_get_length()); -ob_end_flush(); - -?> - - 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&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 - |