| 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 |
| |