Personally, I do not like the way Drupal handles output compression; I take care of this outside of Drupal.

On the Drupal site, I add

    $conf['page_compression'] = FALSE;
    $conf['css_gzip_compression'] = FALSE;
    $conf['js_gzip_compression'] = FALSE;

to settings.php, and this to a custom module to show that this is disabled:

    /**
     * Implements hook_form_FORM_ID_alter().
     */
    function MYMODULE_form_system_performance_settings_alter(&$form, $form_state) {
      $form['bandwidth_optimization']['page_compression']['#default_value'] = 0;
      $form['bandwidth_optimization']['page_compression']['#disabled'] = TRUE;
      $form['bandwidth_optimization']['page_compression']['#description'] = t('Handled by Apache.');
    }

This is to also prevent accidental double output compression, which can be very hard to diagnose if you don't know about the symptoms.

Then, in my Apache config, I do

    <IfModule mod_deflate.c>
      # Force deflate for mangled headers developer.yahoo.com/blogs/ydn/posts/2010/1
    2/pushing-beyond-gzipping/
      <IfModule mod_setenvif.c>
        <IfModule mod_headers.c>
          SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gz
    ip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
          RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encodi
    ng
        </IfModule>
      </IfModule>
    
      # HTML, TXT, CSS, JavaScript, JSON, XML, HTC:
      <IfModule filter_module>
        FilterDeclare   COMPRESS
        FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/html
        FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/css
        FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/plain
        FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/xml
        FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/x-component
        FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/javascript
        FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/json
        FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/xml
        FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/xhtml+xml
        FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/rss+xml
        FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/atom+xml
        FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/vnd.ms-font
    object
        FilterProvider  COMPRESS  DEFLATE resp=Content-Type $image/svg+xml
        FilterProvider  COMPRESS  DEFLATE resp=Content-Type $image/x-icon
        FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/x-font-ttf
        FilterProvider  COMPRESS  DEFLATE resp=Content-Type $font/opentype
        FilterChain     COMPRESS
        FilterProtocol  COMPRESS  DEFLATE change=yes;byteranges=no
      </IfModule>
    
      <IfModule !mod_filter.c>
        # Legacy versions of Apache
        AddOutputFilterByType DEFLATE text/html text/plain text/css application/json
    
        AddOutputFilterByType DEFLATE application/javascript
        AddOutputFilterByType DEFLATE text/xml application/xml text/x-component
        AddOutputFilterByType DEFLATE application/xhtml+xml application/rss+xml appl
    ication/atom+xml
        AddOutputFilterByType DEFLATE image/x-icon image/svg+xml application/vnd.ms-
    fontobject application/x-font-ttf font/opentype
      </IfModule>
    </IfModule>

This lets Apache do the output compression by MIME type, and also make sure all text based output gets compressed.  This is adapted from an older version of the HTML5 Boilerplate project's .htaccess file, which now lives in a [separate project][1].  I also add in their directives for cache control, and a few other things.  I keep all of this in an individual file, that I then `Include` in my virtual hosts.

The downside of this is that the server compresses each request, but it works well for my sites and my clients.


  [1]: https://github.com/h5bp/server-configs-apache