• Posts
  • RSS
  • ◂◂RSS
  • Contact

  • Apache doesn't cache htaccess configs

    February 5th, 2013
    tech  [html]
    When I previously suggested that Apache improve performance on .htaccess files by caching them and then watching for changes with inotify, Chris wrote:
    just invalidate its cache
    This is very sensible, except Apache doesn't actually cache .htaccess files between requests.

    Apache checks .htaccess files in a monster function, ap_directory_walk. It's called on every request, and if AllowOverride is set it will call ap_parse_htaccess on every directory from the root out to the leaf. In ap_parse_htaccess you can see that it does have a per-request cache for parsed .htaccess files:

        /* firstly, search cache */
        for (cache = r->htaccess; cache != NULL; cache = cache->next) {
            if (cache->override == override && strcmp(cache->dir, d) == 0) {
                *result = cache->htaccess;
                return OK;
            }
        }
    
        ... more sanity and safety checks ...
    
        dc = ap_create_per_dir_config(r->pool);
    
        ... load and parse the htaccess file into dc ...
    
        /* cache it */
        new = apr_palloc(r->pool, sizeof(struct htaccess_result));
        new->dir = parms.path;
        new->override = override;
        new->override_opts = override_opts;
        new->htaccess = dc;
    
        /* add to head of list */
        new->next = r->htaccess;
        r->htaccess = new;
    
        return OK;
    

    Now it may be that the overhead of parsing .htaccess files just isn't that big and that in many cases a cache would just be a waste of memory. While I doubt that, this is testable. To get a best-case for caching we could test just something like:

       /var/www/foo.html
       /var/www/.htaccess
    
    Comparing this to the version that has the configuration options in a <Directory> block should tell us the maximum we could expect to gain from caching.

    Update 2013-02-08: I ran some tests on the above configuration with ab, but the variance was so extreme (some runs of 10k requests averaged 4k/s while others averaged 500/s) that I think something else is wrong. I tried running longer tests with more requests but ab consistently died with apr_socket_recv: Operation timed out (60) before finishing the test.

    Comment via: google plus, facebook

    Recent posts on blogs I like:

    Austerity is Inefficient

    Working on an emergency timetable for regional rail has made it clear how an environment of austerity requires tradeoffs that reduce efficiency. I already talked about how the Swiss electronics before concrete slogan is not about not spending money but ab…

    via Pedestrian Observations February 27, 2021

    Fireside Friday, February 26, 2021

    Fireside this week, but next week we are diving into our long awaited series on pre-modern textile production, though we will be particularly focused on the most important clothing fibers in the Mediterranean world, wool and linen (rather than, say, silk …

    via A Collection of Unmitigated Pedantry February 26, 2021

    The Troubling Ethics of Writing (A Speech from Ancient Sumer)

    (Translated from a transcript of an ancient Sumerian speech by Uruk's most well-respected Scriptological Ethicist) Writing is a profoundly dangerous technology: Access to writing was initially, and still remains, uneven. What's worse, the rich are m…

    via BLOG - Cullen O'Keefe February 15, 2021

    more     (via openring)


  • Posts
  • RSS
  • ◂◂RSS
  • Contact