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

    Willingness to look stupid

    People frequently1 think that I'm very stupid. I don't find this surprising, since I don't mind if other people think I'm stupid, which means that I don't adjust my behavior to avoid seeming stupid, which results in people thinking tha…

    via Posts on Dan Luu October 21, 2021

    Experiences in raising children in shared housing

    Sometimes I see posts about people’s hope to raise children in a group housing situation, and it often seems overly optimistic to me. In particular they seem to expect that there will be more shared childcare than I think should be expected. Today I talke…

    via The whole sky October 18, 2021

    EDT with updating double counts

    I recently got confused thinking about the following case: Calculator bet: I am offered the opportunity to bet on a mathematical statement X to which I initially assign 50% probability (perhaps X = 139926 is a quadratic residue modulo 314159). I have acce…

    via The sideways view October 12, 2021

    more     (via openring)


  • Posts
  • RSS
  • ◂◂RSS
  • Contact