# nginx_system_test.sh makes a few substitutions to pagespeed_test.conf.template
# file to generate @@TEST_TMP@@/pagespeed_test.conf

# The cache flush test depends on worker_processes=1.
worker_processes  1;

daemon @@DAEMON@@;
master_process on;

error_log "@@ERROR_LOG@@" debug;
pid "@@TEST_TMP@@/nginx.pid";

events {
  worker_connections  1024;
}


http {
  server_names_hash_bucket_size 128;

  log_format cache '$time_local '
                   '$upstream_cache_status '
                   '$http_host $request ($status) '
                   '"$http_user_agent"';
  access_log "@@ACCESS_LOG@@" cache;

  # Don't put entries in the error log for 403s and 404s.
  log_not_found off;

  proxy_cache_path "@@PROXY_CACHE@@"  levels=1:2   keys_zone=htmlcache:60m inactive=90m  max_size=50m;
  proxy_temp_path "@@TMP_PROXY_CACHE@@";

  pagespeed ProcessScriptVariables all;
  pagespeed StatisticsPath /ngx_pagespeed_statistics;
  pagespeed GlobalStatisticsPath /ngx_pagespeed_global_statistics;
  pagespeed ConsolePath /pagespeed_console;
  pagespeed MessagesPath /ngx_pagespeed_message;
  pagespeed AdminPath /pagespeed_admin;
  pagespeed GlobalAdminPath /pagespeed_global_admin;

  pagespeed StaticAssetPrefix /pagespeed_custom_static/;

  pagespeed MessageBufferSize 200000;
  # Increase the default fetcher timeout to resolve sporadic flakeyness when
  # the native fetcher uses 8.8.8.8 to resolve.
  pagespeed FetcherTimeoutMs 10000;
  pagespeed NativeFetcherMaxKeepaliveRequests 50;

  root "@@SERVER_ROOT@@";

  # Block 5a: Decide on Cache-Control header value to use for outgoing
  # response.
  # Map new_cache_control_header_val to "no-cache, max-age=0" if the
  # content is html and use the original Cache-Control header value
  # in all other cases.
  map $upstream_http_content_type $new_cache_control_header_val {
    default $upstream_http_cache_control;
    "~*text/html" "no-cache, max-age=0";
  }

  pagespeed UsePerVHostStatistics on;
  pagespeed InPlaceResourceOptimization on;
  pagespeed CreateSharedMemoryMetadataCache "@@SHM_CACHE@@" 8192;
  pagespeed BlockingRewriteKey psatest;

  # We need to checkpoint more frequently than usual so that our checkpointing
  # test will definitly have seen one of these intervals and so not be flaky.
  # This needs to have a 1s interval because the checkpointing test has a 2s
  # sleep.
  pagespeed ShmMetadataCacheCheckpointIntervalSec 1;

  # CriticalImagesBeaconEnabled is now on by default, but we disable in testing.
  # With this option enabled, the inline image system test will currently fail.
  # When critical image beaconing is enabled, only critical images are inlined.
  # In our current system test, we aren't yet sending a beacon to identify the
  # critical images to be inlined, so we just disable the option here.
  pagespeed CriticalImagesBeaconEnabled false;

  # By default, resources will not be used for inlining without explicit
  # authorization. Supported values are off or a comma-separated list of strings
  # from {Script,Stylesheet}.
  pagespeed InlineResourcesWithoutExplicitAuthorization off;

  pagespeed Statistics on;
  pagespeed StatisticsLogging on;
  pagespeed LogDir "@@TEST_TMP@@/logdir";

  # Expanded to CentralControllerPort directive when RUN_CONTROLLER_TEST=on
  @@CONTROLLER@@

  server {
    # Sets up a logical home-page server on
    # max-cacheable-content-length.example.com.  This server is only used to
    # test ModPagespeedMaxCacheableContentLength, i.e.,
    # max_cacheable_response_content_length.
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name max-cacheable-content-length.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";


    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_javascript;
    pagespeed MaxCacheableContentLength 85;
  }

  # Test how load from file handles maximum sizes.
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name lff-large-files.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed RewriteLevel PassThrough;
    pagespeed MaxCacheableContentLength 4096;
    pagespeed LoadFromFile
      "http://lff-large-files.example.com/"
      "@@SERVER_ROOT@@/";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name lff-large-files-no-fallback.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed RewriteLevel PassThrough;
    pagespeed MaxCacheableContentLength 4096;
    # http://lff-large-files-no-fallback.example.com/foo.css won't load, because
    # we've configured a LoadFromFile pattern that doesn't match the path the
    # webserver would take.
    pagespeed LoadFromFile
      "http://lff-large-files-no-fallback.example.com/"
      "@@SERVER_ROOT@@/mod_pagespeed_example/styles/";
  }

  pagespeed UseNativeFetcher "@@NATIVE_FETCHER@@";
  @@RESOLVER@@

  server {
    # Block 1:  Basic port, server_name definitions.
    # This server represents the external caching layer server which
    # receives user requests and proxies them to the upstream server
    # running on the PRIMARY_PORT when the response is not available in
    # the cache. It also services purge requests from the upstream server.
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name proxy_cache.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    # Disable PageSpeed on this server.
    pagespeed off;

    # Block 2: Define prefix for proxy_cache_key based on the UserAgent.

    # Define placeholder PS-CapabilityList header values for large and small
    # screens with no UA dependent optimizations. Note that these placeholder
    # values should not contain any of ll, ii, dj, jw or ws, since these
    # codes will end up representing optimizations to be supported for the
    # request.
    set $default_ps_capability_list_for_large_screens "LargeScreen.SkipUADependentOptimizations";
    set $default_ps_capability_list_for_small_screens "TinyScreen.SkipUADependentOptimizations";

    # As a fallback, the PS-CapabilityList header that is sent to the upstream
    # PageSpeed server should be for a large screen device with no browser
    # specific optimizations.
    set $ps_capability_list $default_ps_capability_list_for_large_screens;

    # Cache-fragment 1: Desktop User-Agents that support lazyload_images (ll),
    # inline_images (ii) and defer_javascript (dj).
    # Note: Wget is added for testing purposes only.
    if ($http_user_agent ~* "Chrome/|Firefox/|MSIE |Safari|Wget") {
      set $ps_capability_list "ll,ii,dj:";
    }
    # Cache-fragment 2: Desktop User-Agents that support lazyload_images (ll),
    # inline_images (ii), defer_javascript (dj), webp (jw) and lossless_webp
    # (ws).
    if ($http_user_agent ~*
        "Chrome/[2][3-9]+\.|Chrome/[3-9][0-9]+\.|Chrome/[0-9]{3,}\.") {
      set $ps_capability_list "ll,ii,dj,jw,ws:";
    }
    # Cache-fragment 3: This fragment contains (a) Desktop User-Agents that
    # match fragments 1 or 2 but should not because they represent older
    # versions of certain browsers or bots and (b) Tablet User-Agents that
    # correspond to large screens. These will only get optimizations that work
    # on all browsers and use image compression qualities applicable to large
    # screens. Note that even Tablets that are capable of supporting inline or
    # webp images, e.g. Android 4.1.2, will not get these advanced
    # optimizations.
    if ($http_user_agent ~* "Firefox/[1-2]\.|MSIE [5-8]\.|bot|Yahoo!|Ruby|RPT-HTTPClient|(Google \(\+https\:\/\/developers\.google\.com\/\+\/web\/snippet\/\))|Android|iPad|TouchPad|Silk-Accelerated|Kindle Fire") {
      set $ps_capability_list $default_ps_capability_list_for_large_screens;
    }
    # Cache-fragment 4: Mobiles and small screen Tablets will use image compression
    # qualities applicable to small screens, but all other optimizations will be
    # those that work on all browsers.
    if ($http_user_agent ~* "Mozilla.*Android.*Mobile*|iPhone|BlackBerry|Opera Mobi|Opera Mini|SymbianOS|UP.Browser|J-PHONE|Profile/MIDP|portalmmm|DoCoMo|Obigo|Galaxy Nexus|GT-I9300|GT-N7100|HTC One|Nexus [4|7|S]|Xoom|XT907") {
      set $ps_capability_list $default_ps_capability_list_for_small_screens;
    }

    # Block 3a: Bypass the cache for .pagespeed. resource. PageSpeed has its own
    # cache for these, and these could bloat up the caching layer.
    if ($uri ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+") {
      set $bypass_cache "1";
    }

    # For testing purposes, we never generate values that will result in a beacon
    # unless a test request it via "X-Allow-Beacon: yes" in its request header.
    # This is for testing purposes, note that in a production environment,
    # you want 'set_random $rand 0 100;' unconditionally!
    set $rand 5;

    if ($http_x_allow_beacon ~ "yes") {
      set_random $rand 0 100;
    }
    set $should_beacon_header_val "";
    if ($rand ~* "^[0-4]$") {
      set $should_beacon_header_val "random_rebeaconing_key";
      set $bypass_cache 1;
    }

    # Block 3b: Only cache responses to clients that support gzip.  Most clients
    # do, and the cache holds much more if it stores gzipped responses.
    if ($http_accept_encoding !~* gzip) {
      set $bypass_cache "1";
    }

    # Block 4: Location block for purge requests.
    location ~ /purge(/.*) {
      allow 127.0.0.1;
      allow ::1;
      deny all;
      proxy_cache_purge htmlcache $ps_capability_list$1$is_args$args;
    }

    # Block 6: Location block with proxy_cache directives.
    location /mod_pagespeed_test/cachable_rewritten_html/ {
      # 1: Upstream PageSpeed server is running at localhost:@@PRIMARY_PORT@@.
      proxy_pass http://localhost:@@PRIMARY_PORT@@;
      # 2: Use htmlcache as the zone for caching.
      proxy_cache htmlcache;
      # 3: Bypass requests that correspond to .pagespeed. resources
      # or clients that do not support gzip etc.
      proxy_cache_bypass $bypass_cache;
      # 4: Use the redefined proxy_cache_key and make sure the /purge/
      # block uses the same key.
      proxy_cache_key $ps_capability_list$uri$is_args$args;
      # 5: Forward Host header to upstream server.
      proxy_set_header Host $host;
      # 6: Set the PS-CapabilityList header for PageSpeed server to respect.
      proxy_set_header PS-CapabilityList $ps_capability_list;
      add_header PS-CapabilityList $ps_capability_list;
      # 7: Add a header for identifying cache hits/misses/expires. This is
      # for debugging purposes only and can be commented out in production.
      add_header X-Cache $upstream_cache_status;

      # Block 5b: Override Cache-Control headers as needed.
      # Hide the upstream cache control header.
      proxy_hide_header Cache-Control;
      # Add the inferred Cache-Control header.
      add_header Cache-Control $new_cache_control_header_val;

      proxy_set_header PS-ShouldBeacon $should_beacon_header_val;
      proxy_hide_header PS-ShouldBeacon;
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name if-in-server.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";

    pagespeed RewriteLevel PassThrough;
    set $inline_javascript "No";

    if ($http_x_custom_header_inline_js) {
      # TODO(jefftk): Turn on NGX_HTTP_SIF_CONF and figure out how to get
      # pagespeed directives inside of a server location block to be respected,
      # then uncomment the following line and duplicate the if-in-location test
      # for if-in-server.
      #pagespeed EnableFilters inline_javascript;
      set $inline_javascript "Yes";
    }

    add_header "X-Inline-Javascript" $inline_javascript;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name if-in-location.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";


    location / {
      set $inline_javascript "No";
      pagespeed RewriteLevel PassThrough;

      if ($http_x_custom_header_inline_js) {
        pagespeed EnableFilters inline_javascript;
        set $inline_javascript "Yes";
      }

      add_header "X-Inline-Javascript" $inline_javascript;
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name secondary.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";

    pagespeed MapProxyDomain secondary.example.com/gstatic_images
                             http://www.gstatic.com/psa/static;
  }

  # These three vhosts are for testing the experiment framework (Furious).
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name experiment.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed InPlaceResourceOptimization off;

    pagespeed RunExperiment on;
    pagespeed AnalyticsID "123-45-6734";
    pagespeed UseAnalyticsJs false;
    pagespeed ExperimentVariable 2;
    pagespeed ExperimentSpec
      "id=7;enable=recompress_images;disable=convert_jpeg_to_progressive;percent=50";
    pagespeed ExperimentSpec "id=2;enable=recompress_images;percent=50";
    pagespeed ExperimentSpec "id=3;default;percent=0";
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name contentexperiment.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed InPlaceResourceOptimization off;

    pagespeed RunExperiment on;
    pagespeed AnalyticsID "123-45-6734";
    pagespeed UseAnalyticsJs false;
    pagespeed ExperimentVariable 2;
    pagespeed ExperimentSpec
      "id=7;enable=recompress_images;disable=convert_jpeg_to_progressive;percent=50;options=ContentExperimentID=ID:H1BpS2TCRFmJzZgjwyeBHQ,ContentExperimentVariantID=111";
    pagespeed ExperimentSpec
      "id=2;enable=recompress_images;percent=50;options=ContentExperimentID=ID:H1BpS2TCRFmJzZgjwyeBHQ,ContentExperimentVariantID=222";
    pagespeed ExperimentSpec
      "id=3;default;percent=0;options=ContentExperimentID=123,ContentExperimentVariantID=333";
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name experiment.noga.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed RunExperiment on;
    pagespeed ExperimentVariable 2;
    pagespeed ExperimentSpec
      "id=7;enable=recompress_images;disable=convert_jpeg_to_progressive;percent=50";
    pagespeed ExperimentSpec "id=2;enable=recompress_images;percent=50";
    pagespeed ExperimentSpec "id=3;default;percent=0";
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name experiment.devicematch.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed RunExperiment on;
    pagespeed ExperimentSpec
      "id=1;percent=100;matches_device_type=mobile;enable=recompress_images";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name preserveurls.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed EnableFilters inline_preview_images,lazyload_images;
    pagespeed EnableFilters resize_mobile_images,rewrite_images,sprite_images;
    pagespeed EnableFilters fallback_rewrite_css_urls,flatten_css_imports;
    pagespeed EnableFilters inline_css,move_css_above_scripts,move_css_to_head;
    pagespeed EnableFilters outline_css,rewrite_css,combine_css;
    pagespeed EnableFilters combine_javascript,defer_javascript;
    pagespeed EnableFilters inline_javascript;
    pagespeed EnableFilters outline_javascript,rewrite_javascript;

    location /mod_pagespeed_test/preserveurls/on/ {
       pagespeed JsPreserveURLs On;
       pagespeed ImagePreserveURLs On;
       pagespeed CssPreserveURLs On;
    }

    location /mod_pagespeed_test/preserveurls/off/ {
       pagespeed JsPreserveURLs Off;
       pagespeed ImagePreserveURLs Off;
       pagespeed CssPreserveURLs Off;
    }
  }

  server {
    # Setup a vhost with the critical image beacon and lazyload filter enabled
    # to make sure that critical images are not lazyloaded.
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name imagebeacon.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters lazyload_images;
    pagespeed CriticalImagesBeaconEnabled true;
  }

  server {
    # Setup a vhost with the critical image beacon enabled to make sure that
    # downstream caches and rebeaconing interact correctly.
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name downstreamcacherebeacon.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed RewriteLevel PassThrough;
    pagespeed CriticalImagesBeaconEnabled true;
    # Enable the downstream caching feature and specify a rebeaconing key.
    pagespeed DownstreamCachePurgeLocationPrefix "http://localhost:@@SECONDARY_PORT@@/purge";
    pagespeed DownstreamCacheRebeaconingKey random_rebeaconing_key;
    location ~ .*[.]html {
      add_header Cache-Control "private, max-age=3000";
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name downstreamcacheresource.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_images;
    pagespeed DownstreamCachePurgeLocationPrefix "http://localhost:@@SECONDARY_PORT@@/purge";
  }

  # Set up a reverse proxy (rproxy.) and origin (origin.) as vhosts for
  # showing that we can configure PageSpeed via response headers.
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name rproxy.rmcomments.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed RewriteLevel PassThrough;
    pagespeed DisableFilters add_instrumentation,remove_comments;

    # Note that we don't enable remove_comments here; that setting comes from
    # the response headers from origin.rmcomments.example.com
    location / {
      proxy_pass http://127.0.0.1:@@SECONDARY_PORT@@/;
      proxy_set_header "Host" "origin.rmcomments.example.com";
    }
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name origin.rmcomments.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed off;
    location / {
      add_header PageSpeedFilters remove_comments;
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name renderedimagebeacon.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters resize_rendered_image_dimensions;
    pagespeed CriticalImagesBeaconEnabled true;
  }


  # Build a configuration hierarchy where at the root we have turned on
  # OptimizeForBandwidth, and in various subdirectories we override settings
  # to make them more aggressive.
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name optimizeforbandwidth.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed RewriteLevel OptimizeForBandwidth;
    pagespeed DisableFilters add_instrumentation;

    location /mod_pagespeed_test/optimize_for_bandwidth/inline_css {
      pagespeed EnableFilters inline_css;
    }
    location /mod_pagespeed_test/optimize_for_bandwidth/css_urls {
      pagespeed CssPreserveURLs off;
    }
    location /mod_pagespeed_test/optimize_for_bandwidth/image_urls {
      pagespeed ImagePreserveURLs off;
    }
    location /mod_pagespeed_test/optimize_for_bandwidth/core_filters {
      pagespeed RewriteLevel CoreFilters;
    }
  }

  server {
    # For testing with a custom origin header.  In this VirtualHost,
    # /mod_pagespeed_test is included in our DocumentRoot and thus does
    # not need to be in any resource URL paths.  This helps us verify that
    # we are looping back to the corect VirtualHost -- if we hit the wrong
    # one it will not work.  Also we don't have a VirtualHost for
    # sharedcdn.example.com, so the default Host header used for
    # origin-mapping won't work either.  Instead, we want origin-fetches
    # to go back to this VirtualHost so we rely on the new third optional
    # argument to MapOriginDomain.
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name customhostheader.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@_test";
    root "@@SERVER_ROOT@@/mod_pagespeed_test";

    pagespeed on;
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_images;
    # Don't use localhost, as ngx_pagespeed's native fetcher cannot resolve it
    pagespeed MapOriginDomain 127.0.0.1:@@SECONDARY_PORT@@/customhostheader
              sharedcdn.example.com/test customhostheader.example.com;
    pagespeed JpegRecompressionQuality 50;
    pagespeed CriticalImagesBeaconEnabled false;
  }

  server {
    # Sets up a virtual host where we can specify forbidden filters without
    # affecting any other hosts.
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name forbidden.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";


    # Start with all core filters enabled ...
    pagespeed RewriteLevel CoreFilters;
    # ... then forbid these filters ...
    pagespeed ForbidFilters remove_quotes,remove_comments,collapse_whitespace;
    pagespeed ForbidFilters rewrite_css,resize_images;
    # ... and disable but not forbid this one (to ensure we retain its URL).
    pagespeed DisableFilters inline_css;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name unauthorizedresources.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed RewriteLevel PassThrough;
    pagespeed InlineResourcesWithoutExplicitAuthorization Script,Stylesheet;
    pagespeed CssInlineMaxBytes 1000000;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name client-domain-rewrite.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    # Don't actually try to rewrite any resources; the ones in
    # rewrite_domains.html don't actually exist.
    pagespeed RewriteLevel PassThrough;

    pagespeed MapRewriteDomain http://client-domain-rewrite.example.com
              http://src.example.com;
    pagespeed ClientDomainRewrite true;
    pagespeed EnableFilters rewrite_domains;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name url-attribute.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    # Don't actually try to rewrite any resources; the ones in
    # rewrite_domains.html don't actually exist.
    pagespeed RewriteLevel PassThrough;

    # This is used for testing dynamically defined url-valued
    # attributes
    pagespeed UrlValuedAttribute span src Hyperlink;
    pagespeed UrlValuedAttribute hr imgsrc Image;
    pagespeed DomainRewriteHyperlinks on;
    pagespeed MapRewriteDomain http://dst.example.com http://src.example.com;
    pagespeed EnableFilters rewrite_domains;
    pagespeed UrlValuedAttribute custom a Image;
    pagespeed UrlValuedAttribute custom b otherResource;
    pagespeed UrlValuedAttribute custom c hyperlink;
    pagespeed UrlValuedAttribute img alt-src Image;
    pagespeed UrlValuedAttribute video alt-a Image;
    pagespeed UrlValuedAttribute video alt-b Image;
    pagespeed UrlValuedAttribute link data-stylesheet Stylesheet;
    pagespeed UrlValuedAttribute span data-stylesheet-a Stylesheet;
    pagespeed UrlValuedAttribute span data-stylesheet-b Stylesheet;
    pagespeed UrlValuedAttribute span data-stylesheet-c Stylesheet;

    # Also test that we can redefine spec-defined attributes.
    pagespeed UrlValuedAttribute blockquote cite Image;
  }

  server {
    listen 127.0.0.2:@@SECONDARY_PORT@@;
    server_name loopbackfetch.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name domain-hyperlinks-on.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    # Don't actually try to rewrite any resources; the ones in
    # rewrite_domains.html don't actually exist.
    pagespeed RewriteLevel PassThrough;

    pagespeed DomainRewriteHyperlinks on;
    pagespeed MapRewriteDomain http://dst.example.com http://src.example.com;
    pagespeed EnableFilters rewrite_domains;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name domain-hyperlinks-off.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    # Don't actually try to rewrite any resources; the ones in
    # rewrite_domains.html don't actually exist.
    pagespeed RewriteLevel PassThrough;

    pagespeed DomainRewriteHyperlinks off;
    pagespeed MapRewriteDomain http://dst.example.com http://src.example.com;
    pagespeed EnableFilters rewrite_domains;
  }

  server {
    # Test host for shared memory cache.
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name shmcache.example.com;
    pagespeed FileCachePath "@@SHM_CACHE@@";

    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_images;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name xfp.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed RespectXForwardedProto on;

    location /redirecting_origin {
      pagespeed off;
      # Hack: we clear the response headers using headers_more.
      # If we don't, nginx will add an extra empty Location: headers here.
      # It is kind of hard to get nginx to generate a relative location header
      # that starts with "/".
      more_clear_headers 'Location';
      add_header Location /mod_pagespeed_example;
      return 301;
    }
    location /redirect {
      proxy_method GET;
      proxy_pass http://127.0.0.1:@@SECONDARY_PORT@@/redirecting_origin;
      proxy_set_header "Host" "xfp.example.com";
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name xheader.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed XHeaderValue "UNSPECIFIED VERSION";
  }

  # Support for embedded configurations, where image flags in the
  # VirtualHost serving HTML is not the same as the one serving resources,
  # and thus we must embed the image flags in the rewritten image URLs.
  #
  # Note that we test with two distinct caches.
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name embed-config-html.example.org;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    root "@@SERVER_ROOT@@/mod_pagespeed_test";

    pagespeed AddOptionsToUrls on;
    pagespeed JpegRecompressionQuality 73;
    pagespeed DisableFilters inline_css,extend_cache,inline_javascript;
    pagespeed Domain embed-config-resources.example.com;

    # Share a cache keyspace with embed-config-resources.example.com.
    pagespeed CacheFragment "embed-config";

    pagespeed LoadFromFile "http://embed-config-resources.example.com/"
      "@@SERVER_ROOT@@/mod_pagespeed_example/";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name embed-config-resources.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    root "@@SERVER_ROOT@@/mod_pagespeed_example";

    pagespeed AddOptionsToUrls on;

    # Note that we do not set the jpeg quality here, but take
    # it from image URL query parameters that we synthesize in
    # from embed-config-html.example.org.

    # Share a cache keyspace with embed-config-html.example.org.
    pagespeed CacheFragment "embed-config";

    pagespeed LoadFromFile "http://embed-config-resources.example.com/"
      "@@SERVER_ROOT@@/mod_pagespeed_example/";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name ipro-for-browser.example.com;
    root "@@SERVER_ROOT@@/mod_pagespeed_example";
    pagespeed EnableFilters rewrite_images,rewrite_css;
    pagespeed EnableFilters convert_to_webp_lossless;
    pagespeed EnableFilters in_place_optimize_for_browser;
    pagespeed JpegRecompressionQuality 75;
    pagespeed WebpRecompressionQuality 70;
    pagespeed InPlaceResourceOptimization on;
    pagespeed AllowVaryOn "Accept";
    pagespeed FileCachePath "@@IPRO_CACHE@@";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name ipro-for-browser-vary-on-auto.example.com;
    root "@@SERVER_ROOT@@/mod_pagespeed_example";
    pagespeed EnableFilters rewrite_images,rewrite_css;
    pagespeed EnableFilters convert_to_webp_animated;
    pagespeed EnableFilters convert_to_webp_lossless;
    pagespeed EnableFilters in_place_optimize_for_browser;
    pagespeed InPlaceResourceOptimization on;
    # pagespeed AllowVaryOn "Accept";  # Default is "Auto".
    pagespeed ImageRecompressionQuality 90;
    pagespeed JpegRecompressionQuality 75;
    pagespeed JpegRecompressionQualityForSmallScreens 55;
    pagespeed JpegQualityForSaveData 35;
    pagespeed WebpRecompressionQuality 70;
    pagespeed WebpRecompressionQualityForSmallScreens 50;
    pagespeed WebpQualityForSaveData 30;
    pagespeed WebpAnimatedRecompressionQuality 60;
    pagespeed FileCachePath "@@IPRO_CACHE@@";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name ipro-for-browser-vary-on-none.example.com;
    root "@@SERVER_ROOT@@/mod_pagespeed_example";
    pagespeed EnableFilters rewrite_images,in_place_optimize_for_browser;
    pagespeed InPlaceResourceOptimization on;
    pagespeed AllowVaryOn "None";
    pagespeed ImageRecompressionQuality 75;
    pagespeed FileCachePath "@@IPRO_CACHE@@";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name respectvary.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed RespectVary on;
    add_header Vary User-Agent;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name cache_a.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed CacheFlushPollIntervalSec 1;
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters inline_css;

    # Make a non-empty subdirectory config to make sure that
    # cache.flush updates get transmitted to nested configurations.
    #
    # TODO(jmarantz): This test currently fails on ngx_pagespeed, meaning we
    # don't handle cache flushing correctly here.  Uncomment the config below to
    # expose the error.
    #location /mod_pagespeed_test/cache_flush/ {
    #  pagespeed RewriteLevel PassThrough;
    #  pagespeed EnableFilters inline_css;
    #  pagespeed DisableFilters add_instrumentation;
    #}
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name cache_b.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";

    pagespeed CacheFlushPollIntervalSec 1;
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters inline_css;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name cache_c.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed CacheFlushFilename "othercache.flush";
    pagespeed CacheFlushPollIntervalSec 1;
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters inline_css;
  }

  # The next three server blocks are for a cdn test.
  server {
    # Sets up a logical home-page server on www.example.com
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name www.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed LoadFromFile http://cdn.example.com @@SERVER_ROOT@@/;
    pagespeed MapRewriteDomain cdn.example.com origin.example.com;
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_css,rewrite_images;
    pagespeed CacheFragment "example";
  }
  server {
    # Sets up a logical origin for CDNs to fetch content from, on
    # origin.example.com.
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name origin.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed LoadFromFile http://cdn.example.com @@SERVER_ROOT@@/;
    pagespeed MapRewriteDomain cdn.example.com origin.example.com;
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_css,rewrite_images;
    pagespeed CacheFragment "example";
  }
  server {
    # Sets up a logical cdn, which is where we tell browsers to fetch resources
    # from.
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name cdn.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed LoadFromFile http://cdn.example.com @@SERVER_ROOT@@/;
    pagespeed MapRewriteDomain cdn.example.com origin.example.com;
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_css,rewrite_images;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name lff-ipro.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed LoadFromFile
      "http://lff-ipro.example.com/mod_pagespeed_example/lff_ipro"
      "@@SERVER_ROOT@@/mod_pagespeed_example/lff_ipro";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name tryfiles.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" { }
    location ~ "^/ngx_pagespeed_static/" { }
    location ~ "^/ngx_pagespeed_beacon$" { }

    try_files $uri $uri/ /mod_pagespeed_example/index.html;
  }

  server {
    # Proxy modpagespeed.com for testing Issue 582.
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name modpagespeed.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed off;

    location / {
      proxy_pass http://modpagespeed.com;
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name custom-paths.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed StatisticsPath /custom_pagespeed_statistics;
    pagespeed ConsolePath /custom_pagespeed_console;
    pagespeed MessagesPath /custom_pagespeed_message;
    pagespeed AdminPath /custom_pagespeed_admin;

    pagespeed StatisticsDomains Allow *;
    pagespeed GlobalStatisticsDomains Allow *;
    pagespeed MessagesDomains Allow *;
    pagespeed ConsoleDomains Allow *;
    pagespeed AdminDomains Allow *;
    pagespeed GlobalAdminDomains Allow *;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name inherit-paths.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed StatisticsDomains Allow *;
    pagespeed GlobalStatisticsDomains Allow *;
    pagespeed MessagesDomains Allow *;
    pagespeed ConsoleDomains Allow *;
    pagespeed AdminDomains Allow *;
    pagespeed GlobalAdminDomains Allow *;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name blocking.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";

    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_images;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name keepalive-html.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed RewriteLevel CoreFilters;
    error_log "@@TEST_TMP@@/keepalive-html.example.com.error.log" warn;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name keepalive-resource.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    error_log "@@TEST_TMP@@/keepalive-resource.example.com.error.log" warn;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name keepalive-beacon-get.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    error_log "@@TEST_TMP@@/keepalive-beacon-get.example.com.error.log" warn;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name keepalive-beacon-post.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    error_log "@@TEST_TMP@@/keepalive-beacon-post.example.com.error.log" warn;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name keepalive-static.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    error_log "@@TEST_TMP@@/keepalive-static.example.com.error.log" warn;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name response-header-filters.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RewriteLevel PassThrough;
    pagespeed on;
    location / {
      proxy_pass http://localhost:@@SECONDARY_PORT@@;
      proxy_set_header Host "enable-filter-header-origin.example.com";
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name response-header-disable.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed EnableFilters add_instrumentation;
    pagespeed on;
    location / {
      proxy_pass http://localhost:@@SECONDARY_PORT@@;
      proxy_set_header Host "pagespeed-off-header-origin.example.com";
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name headers.example.com;
    pagespeed InPlaceRewriteDeadlineMs -1;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed LoadFromFile "http://headers.example.com/"
              "@@SERVER_ROOT@@/";
    location /mod_pagespeed_test/ {
      more_set_headers "Server: override";
      more_set_headers -s '404' 'Cache-Control: override';
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name custom404.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    error_page 404 /404.html;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name ipro.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";

    pagespeed on;
    pagespeed InPlaceResourceOptimization on;

    location /mod_pagespeed_test/ipro/nocache/test_image_dont_reuse.png {
      add_header Cache-Control no-cache;
    }

    location /mod_pagespeed_test/ipro/no-cache-control-header {
      add_header Cache-Control "";
      pagespeed ImplicitCacheTtlMs 333000;
    }
  }

  # Test hosts to cover all possible cache configurations.  L1 will be filecache
  # or memcache depending on the setting of MEMCACHED_TEST.  These four hosts
  # are for the four settings for the L2 cache.

  # 1. L2_d=LRU, L2_m=LRU
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name lrud-lrum.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@_lrud_lrum";

    pagespeed LRUCacheKbPerProcess 1024;
    pagespeed LRUCacheByteLimit 2000;
    pagespeed EnableFilters rewrite_images;
    pagespeed CriticalImagesBeaconEnabled false;
  }

  # 2. L2_d=LRU, L2_m=SHM
  pagespeed CreateSharedMemoryMetadataCache
            "@@SECONDARY_CACHE@@_lrud_shmm" 8192;
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name lrud-shmm.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@_lrud_shmm";

    pagespeed LRUCacheKbPerProcess 1024;
    pagespeed LRUCacheByteLimit 2000;
    pagespeed EnableFilters rewrite_images;
    pagespeed CriticalImagesBeaconEnabled false;
  }

  # 3. L2_d=none, L2_m=SHM
  pagespeed CreateSharedMemoryMetadataCache
            "@@SECONDARY_CACHE@@_noned_shmm" 8192;
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name noned-shmm.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@_noned_shmm";

    pagespeed EnableFilters rewrite_images;
    pagespeed CriticalImagesBeaconEnabled false;
  }

  # 4. L2_d=none, L2_m=none
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name noned-nonem.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@_noned_nonem";

    pagespeed EnableFilters rewrite_images;
    pagespeed CriticalImagesBeaconEnabled false;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name date.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    add_header "Date" "Fri, 16 Oct 2009 23:05:07 GMT";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name options-by-cookies-enabled.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@_optionsbycookieson";
    pagespeed AllowOptionsToBeSetByCookies true;
    pagespeed StickyQueryParameters sticky_secret;
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters collapse_whitespace;
    pagespeed DisableFilters remove_comments,add_instrumentation;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name options-by-cookies-disabled.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@_optionsbycookiesoff";
    pagespeed AllowOptionsToBeSetByCookies false;
    pagespeed DisableFilters add_instrumentation;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name redirect.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@_redirected";
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters add_instrumentation,collapse_whitespace;
    location /redirect {
      rewrite ^/redirect/(.*) http://$server_name/$1 permanent;
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name request-option-override.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RequestOptionOverride abc;
    pagespeed RewriteLevel Passthrough;
    pagespeed EnableFilters collapse_whitespace;
    pagespeed DisableFilters remove_comments,add_instrumentation;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name signed-urls.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed UrlSigningKey helloworld;
    pagespeed RewriteLevel Passthrough;
    pagespeed EnableFilters collapse_whitespace,rewrite_images;
    pagespeed DisableFilters remove_comments,add_instrumentation;
  }

  # For testing signed URLs, ignoring signature validity.
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name signed-urls-transition.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed UrlSigningKey helloworld;
    pagespeed AcceptInvalidSignatures true;
    pagespeed RewriteLevel Passthrough;
    pagespeed EnableFilters collapse_whitespace,rewrite_images;
    pagespeed DisableFilters remove_comments,add_instrumentation;
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name unsigned-urls-transition.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    # This server will not sign URLs, but AcceptInvalidSignature is on.
    pagespeed AcceptInvalidSignatures true;
    pagespeed RewriteLevel Passthrough;
    pagespeed EnableFilters collapse_whitespace,rewrite_images;
    pagespeed DisableFilters remove_comments,add_instrumentation;
  }

  # Start remote config servers.
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name remote-config.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RemoteConfigurationUrl "http://127.0.0.1:@@RCPORT@@/standard";
    pagespeed RemoteConfigurationTimeoutMs 1500;
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name remote-config-partially-invalid.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RemoteConfigurationUrl
              "http://127.0.0.1:@@RCPORT@@/partly-invalid";
    pagespeed RemoteConfigurationTimeoutMs 1500;
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name remote-config-invalid.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RemoteConfigurationUrl "http://127.0.0.1:@@RCPORT@@/invalid";
    pagespeed RemoteConfigurationTimeoutMs 1500;
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name remote-config-failed-fetch.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RemoteConfigurationUrl "http://127.0.0.1:@@RCPORT@@/fail-future";
    pagespeed RemoteConfigurationTimeoutMs 1500;
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name remote-config-slow-fetch.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RemoteConfigurationUrl "http://127.0.0.1:@@RCPORT@@/timeout";
    pagespeed RemoteConfigurationTimeoutMs 1500;
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name remote-config-experiment.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RemoteConfigurationUrl "http://127.0.0.1:@@RCPORT@@/experiment";
    pagespeed RemoteConfigurationTimeoutMs 1500;
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name remote-config-slightly-slow-fetch.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RemoteConfigurationUrl
              "http://127.0.0.1:@@RCPORT@@/slightly-slow";
    pagespeed RemoteConfigurationTimeoutMs 1500;
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name remote-config-slightly-slow-expired-fetch.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RemoteConfigurationUrl "http://127.0.0.1:@@RCPORT@@/slow-expired";
    pagespeed RemoteConfigurationTimeoutMs 1500;
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name remote-config-forbidden.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RemoteConfigurationUrl "http://127.0.0.1:@@RCPORT@@/forbidden";
    pagespeed RemoteConfigurationTimeoutMs 1500;
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name remote-config-initially-forbidden.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RemoteConfigurationUrl
              "http://127.0.0.1:@@RCPORT@@/forbidden-once";
    pagespeed RemoteConfigurationTimeoutMs 1500;
  }

  # Test that pagespeed is disabled when sendfile headers are present.
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name uses-sendfile.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed EnableFilters inline_javascript,rewrite_javascript;
    add_header 'X-Sendfile' 'blablabla';
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name doesnt-sendfile.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed EnableFilters inline_javascript,rewrite_javascript;
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name uses-xaccelredirect.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed EnableFilters inline_javascript,rewrite_javascript;
    add_header 'X-Accel-Redirect' 'blablabla';
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name map-static-domain.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed MapRewriteDomain http://static-cdn.example.com
                               http://map-static-domain.example.com;
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters defer_javascript,rewrite_domains;
  }

  # Proxy + IPRO a gzip'd file for testing Issue 896.
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name ipro-proxy.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@_ipro_proxy";

    pagespeed on;
    pagespeed InPlaceResourceOptimization on;
    pagespeed EnableFilters rewrite_domains;

    location / {
      proxy_pass
       "http://localhost:@@PRIMARY_PORT@@/mod_pagespeed_test/ipro/mod_deflate/";
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name compressedcache.example.com;
    pagespeed on;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed EnableFilters rewrite_css;
    pagespeed HttpCacheCompressionLevel 9;
    location ~ \.php$ {
      fastcgi_param SCRIPT_FILENAME $request_filename;
      fastcgi_param QUERY_STRING $query_string;
      fastcgi_param REQUEST_METHOD $request_method;
      fastcgi_param CONTENT_TYPE $content_type;
      fastcgi_param CONTENT_LENGTH $content_length;
      fastcgi_pass 127.0.0.1:9000;
      fastcgi_buffering off;
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name uncompressedcache.example.com;
    pagespeed on;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed EnableFilters rewrite_css;
    pagespeed HttpCacheCompressionLevel 0;
    location ~ \.php$ {
      fastcgi_param SCRIPT_FILENAME $request_filename;
      fastcgi_param QUERY_STRING $query_string;
      fastcgi_param REQUEST_METHOD $request_method;
      fastcgi_param CONTENT_TYPE $content_type;
      fastcgi_param CONTENT_LENGTH $content_length;
      fastcgi_pass 127.0.0.1:9000;
      fastcgi_buffering off;
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name compressed-css.example.com;
    pagespeed on;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed InPlaceResourceOptimization on;
  }

  # nested gzip config: pagespeed gzip on/off
  server {
    pagespeed on;
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name gzip-test1.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    location /mod_pagespeed_example/ {
      pagespeed gzip off;
    }
    location /mod_pagespeed_example/styles/ {
      pagespeed gzip on;
    }
  }

  # nested gzip config: pagespeed on/off
  server {
    pagespeed on;
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name gzip-test2.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    location /mod_pagespeed_example/ {
      pagespeed off;
    }
    location /mod_pagespeed_example/styles/ {
      pagespeed on;
    }
  }

  server {
    pagespeed on;
    pagespeed EnableFilters add_instrumentation;
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name proxy-post.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    location / {
      # Transform the POST to a GET request for the origin,
      # as nginx's static handler doesn't allow POST requests.
      proxy_method GET;
      proxy_pass http://127.0.0.1:@@SECONDARY_PORT@@/;
      proxy_set_header "Host" "proxy-post-origin.example.com";
    }
  }

  server {
    pagespeed off;
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name proxy-post-origin.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    root "@@SERVER_ROOT@@/";
  }

  server {
    # Write all post data to temp files
    client_body_in_file_only clean;
    pagespeed CriticalImagesBeaconEnabled true;
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name beacon-post-temp-file.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name script-filters.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    root "@@SERVER_ROOT@@/";
    set $filters "";
    set $domain_shards "cdn1.example.com,cdn2.example.com";
    if ($http_X_Script) {
        set $filters "add_instrumentation";
        set $domain_shards "";
    }
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_domains;
    pagespeed EnableFilters $filters;
    pagespeed ShardDomain script-filters.example.com "$domain_shards";
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name purge.example.com;

    # Test purging individual URLs without flushing the entire metadata cache.
    pagespeed EnableCachePurge on;

    pagespeed PurgeMethod PURGE;
    root "@@SERVER_ROOT@@/purge";
    pagespeed FileCachePath "@@FILE_CACHE@@_purge";
    pagespeed DisableFilters add_instrumentation;
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_css;
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name psoff-dir-on.example.com;

    # Test purging individual URLs without flushing the entire metadata cache.
    pagespeed EnableCachePurge on;

    pagespeed PurgeMethod PURGE;
    root "@@SERVER_ROOT@@/purge";
    pagespeed FileCachePath "@@FILE_CACHE@@_dir_on";
    pagespeed DisableFilters add_instrumentation;
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_css;
    pagespeed off;
    location / {
      pagespeed on;
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name  cc-header-origin.example.com;
    pagespeed InPlaceResourceOptimization off;
    pagespeed off;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    root "@@SERVER_ROOT@@/";
    location /mod_pagespeed_test/nostore {
      add_header "Cache-Control" "max-age=12345";
      add_header "Cache-Control" "public, no-store";
      add_header "Cache-Control" "max-age=14";
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name  enable-filter-header-origin.example.com;
    pagespeed InPlaceResourceOptimization off;
    pagespeed off;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    root "@@SERVER_ROOT@@/";
    location / {
      add_header "PageSpeedFilters" "add_instrumentation";
    }
  }

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name  pagespeed-off-header-origin.example.com;
    pagespeed InPlaceResourceOptimization off;
    pagespeed off;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    root "@@SERVER_ROOT@@/";
    location / {
      add_header "PageSpeed" "off";
    }
  }

  pagespeed MessagesDomains Allow messages-allowed.example.com;
  pagespeed MessagesDomains Allow cleared-inherited.example.com;
  pagespeed MessagesDomains Allow cleared-inherited-reallowed.example.com;
  pagespeed MessagesDomains Allow more-messages-allowed.example.com;
  pagespeed MessagesDomains Allow anything-*-wildcard.example.com;
  pagespeed MessagesDomains Allow localhost;

  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name messages-allowed.example.com
                messages-not-allowed.example.com
                more-messages-allowed.example.com
                anything-a-wildcard.example.com
                anything-b-wildcard.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name messages-still-not-allowed.example.com
                but-this-message-allowed.example.com
                and-this-one.example.com;
    pagespeed MessagesDomains Allow but-this-message-allowed.example.com;
    pagespeed MessagesDomains Allow and-this-one.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name cleared-inherited.example.com
                cleared-inherited-reallowed.example.com
                messages-allowed-at-vhost.example.com
                messages-not-allowed-at-vhost.example.com
                anything-c-wildcard.example.com;
    pagespeed MessagesDomains Disallow *;
    pagespeed MessagesDomains Allow cleared-inherited-reallowed.example.com;
    pagespeed MessagesDomains Allow messages-allowed-at-vhost.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name cleared-inherited-unlisted.example.com;
    pagespeed MessagesDomains Allow *;
    pagespeed FileCachePath "@@FILE_CACHE@@";
  }
  server {
    server_name nothing-allowed.example.com;
    pagespeed MessagesDomains Disallow *;
    pagespeed FileCachePath "@@FILE_CACHE@@";
  }
  server {
    server_name nothing-explicitly-allowed.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name everything-explicitly-allowed.example.com
                everything-explicitly-allowed-but-aliased.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed StatisticsDomains Allow everything-explicitly-allowed.example.com;
    pagespeed GlobalStatisticsDomains
      Allow everything-explicitly-allowed.example.com;
    pagespeed MessagesDomains Allow everything-explicitly-allowed.example.com;
    pagespeed ConsoleDomains Allow everything-explicitly-allowed.example.com;
    pagespeed AdminDomains Allow everything-explicitly-allowed.example.com;
    pagespeed GlobalAdminDomains
     Allow everything-explicitly-allowed.example.com;
  }
  server {
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name psol-vary.example.com;
    pagespeed on;
    pagespeed InPlaceResourceOptimization on;
    pagespeed FileCachePath "@@FILE_CACHE@@";
  }
  server {
    pagespeed on;
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name flush.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed RewriteLevel PassThrough;
    pagespeed RewriteDeadlinePerFlushMs 1;

    location ~ \.php$ {
      fastcgi_param SCRIPT_FILENAME $request_filename;
      fastcgi_param QUERY_STRING $query_string;
      fastcgi_param REQUEST_METHOD $request_method;
      fastcgi_param CONTENT_TYPE $content_type;
      fastcgi_param CONTENT_LENGTH $content_length;
      fastcgi_pass 127.0.0.1:9000;
      fastcgi_buffering off;
    }
  }
  server {
    pagespeed on;
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name noflush.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed RewriteLevel PassThrough;
    pagespeed RewriteDeadlinePerFlushMs 1;
    pagespeed FollowFlushes off;

    location ~ \.php$ {
      fastcgi_param SCRIPT_FILENAME $request_filename;
      fastcgi_param QUERY_STRING $query_string;
      fastcgi_param REQUEST_METHOD $request_method;
      fastcgi_param CONTENT_TYPE $content_type;
      fastcgi_param CONTENT_LENGTH $content_length;
      fastcgi_pass 127.0.0.1:9000;
      fastcgi_buffering off;
    }
  }
  server {
    pagespeed on;
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name special-response.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    error_page 404 /mod_pagespeed_test/php_withflush.php;
    location ~ \.php$ {
      fastcgi_param SCRIPT_FILENAME $request_filename;
      fastcgi_param QUERY_STRING $query_string;
      fastcgi_param REQUEST_METHOD $request_method;
      fastcgi_param CONTENT_TYPE $content_type;
      fastcgi_param CONTENT_LENGTH $content_length;
      fastcgi_pass 127.0.0.1:9000;
    }
  }
  server {
    pagespeed on;
    listen @@SECONDARY_PORT@@;
    listen [::]:@@SECONDARY_PORT@@;
    server_name debug-filters.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters debug;
  }
  server {
    listen @@PRIMARY_PORT@@;
    listen [::]:@@PRIMARY_PORT@@;
    server_name  localhost;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    location ~ ^/pagespeed_admin {
      allow 127.0.0.1;
      allow ::1;
      deny all;
    }

    location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" {
      # TODO(oschaaf): The following breaks nginx starting up, as the bad header
      # value gets rejected during configuration parsing. However, we can't easily
      # build a test for that right now.
      # pagespeed AddResourceHeader "X-Fo\n\no" "Bar";
      # pagespeed AddResourceHeader "X-Foo" "Ba\nr";

      # For testing that AddResourceHeader gets passed through
      pagespeed AddResourceHeader "X-Foo" "Bar";
      add_header "" "";
    }

    # Backend for ipro-proxy.example.com
    location /mod_pagespeed_test/ipro/mod_deflate/ {
      pagespeed off;
    }

    location /mod_pagespeed_test/cachable_rewritten_html/ {
      # This location has the html files that will be configured to be stored
      # in the proxy_cache layer.
      pagespeed DownstreamCachePurgeMethod "GET";
      pagespeed DownstreamCachePurgeLocationPrefix "http://localhost:@@SECONDARY_PORT@@/purge";
      pagespeed DownstreamCacheRebeaconingKey "random_rebeaconing_key";
      # We use a very small deadline here to force the rewriting to not complete
      # in the very first attempt.
      pagespeed RewriteDeadlinePerFlushMs 1;
      pagespeed RewriteLevel PassThrough;
      pagespeed EnableFilters collapse_whitespace,extend_cache,recompress_images;
      pagespeed CriticalImagesBeaconEnabled true;
      add_header Cache-Control "public, max-age=100";
    }

    location /mod_pagespeed_test/disable_no_transform/index.html {
      pagespeed DisableRewriteOnNoTransform off;
    }

    location /mod_pagespeed_test/disable_no_transform/disable_no_transform.css {
      add_header 'Cache-Control' 'no-transform';
    }

    location /mod_pagespeed_test/no_transform {
      add_header 'Cache-Control' 'no-transform';
    }

    # uncomment the following two lines if you're testing memcached
    #pagespeed MemcachedServers "localhost:11211";
    #pagespeed MemcachedThreads 1;

    pagespeed on;

    #pagespeed CacheFlushPollIntervalSec 1;

    #pagespeed RunExperiment on;
    #pagespeed AnalyticsID "UA-XXXXXXXX-Y";
    #pagespeed ExperimentSpec "id=1;percent=50;default";
    #pagespeed ExperimentSpec "id=2;percent=50";

    pagespeed Library 43 1o978_K0_LNE5_ystNklf
      http://www.modpagespeed.com/rewrite_javascript.js;
    pagespeed RetainComment " google_ad_section*";
    pagespeed PermitIdsForCssCombining "allowed-to-combine-1-*";
    pagespeed PermitIdsForCssCombining "allowed-to-combine-2-*";

    # Test proxying of non-.pagespeed. resources.
    pagespeed MapProxyDomain http://localhost:@@PRIMARY_PORT@@/modpagespeed_http
                           http://@@PAGESPEED_TEST_HOST@@/do_not_modify;
    pagespeed MapProxyDomain http://localhost:@@PRIMARY_PORT@@/content_type_present
                           http://@@PAGESPEED_TEST_HOST@@:8091;
    pagespeed MapProxyDomain http://localhost:@@PRIMARY_PORT@@/content_type_absent
                           http://@@PAGESPEED_TEST_HOST@@:8092;

    add_header X-Extra-Header 1;

    # Establish a proxy mapping where the current server proxies an image
    # stored on ref.pssdemos.com.
    pagespeed MapProxyDomain localhost:@@PRIMARY_PORT@@/gstatic_images
                             http://www.gstatic.com/psa/static;

    location /ngx_pagespeed_statistics {
      allow 127.0.0.1;
      allow ::1;
      deny all;
    }

    location /ngx_pagespeed_message {
      allow 127.0.0.1;
      allow ::1;
      deny all;
    }

    pagespeed Domain modpagespeed.com:1023;
    # As opposed to mod_pagespeed, our default for aris is 'on'
    pagespeed AvoidRenamingIntrospectiveJavascript off;

    location /mod_pagespeed_test/nostore {
      proxy_pass http://localhost:@@SECONDARY_PORT@@;
      proxy_set_header Host "cc-header-origin.example.com";
    }

    location /mod_pagespeed_test/forbid_all_disabled/disabled {
      # Prevent the enabling of these filters for files in this directory
      # -and- all subdirectories.
      #
      # Apache checks here that they can't be renabled with .htaccess, but
      # that's not how Nginx location blocks work.
      pagespeed ForbidAllDisabledFilters true;
      pagespeed DisableFilters remove_quotes,remove_comments;
      pagespeed DisableFilters collapse_whitespace;
    }

    location /mod_pagespeed_test/max_html_parse_size {
      pagespeed MaxHtmlParseBytes 5000;
    }

    location ~ \.php$ {
      fastcgi_param SCRIPT_FILENAME $request_filename;
      fastcgi_param QUERY_STRING $query_string;
      fastcgi_param REQUEST_METHOD $request_method;
      fastcgi_param CONTENT_TYPE $content_type;
      fastcgi_param CONTENT_LENGTH $content_length;
      fastcgi_pass 127.0.0.1:9000;
    }

    location /mod_pagespeed_example/core_filters/ {
      pagespeed RewriteLevel CoreFilters;
    }

    location /mod_pagespeed_example/pass_through/ {
      pagespeed RewriteLevel PassThrough;
    }

    #location / {
    #  proxy_pass http://www.google.com;
    #}

    location /mod_pagespeed_test/ssi/ {
      ssi on;

      pagespeed EnableFilters collapse_whitespace,remove_comments,combine_css;
      pagespeed DisableFilters add_instrumentation;
      pagespeed DisableFilters inline_css;
    }

    location /mod_pagespeed_test/no_cache/ {
      add_header Cache-Control no-cache;
    }

    location /mod_pagespeed_test/compressed/ {
      add_header Content-Encoding gzip;

      # Even though this is also in the server block it must be repeated here
      # because add_header directives are only inherited if you don't define
      # more of them.  See: http://serverfault.com/questions/400197
      add_header X-Extra-Header 1;

      types {
        text/javascript custom_ext;
      }
    }

    location /mod_pagespeed_test/shard/ {
      pagespeed ShardDomain "localhost:@@PRIMARY_PORT@@" shard1,shard2;
      pagespeed RewriteLevel PassThrough;
      pagespeed EnableFilters extend_cache;
    }

    location /mod_pagespeed_test/retain_cache_control/ {
      pagespeed ModifyCachingHeaders off;
      add_header Cache-Control "private, max-age=3000";
    }

    location /mod_pagespeed_test/retain_cache_control_with_downstream_caching/ {
      pagespeed ModifyCachingHeaders on;
      pagespeed DownstreamCachePurgeLocationPrefix "http://localhost:8020/";
      add_header Cache-Control "private, max-age=3000";
    }

    location /mod_pagespeed_test/avoid_renaming_introspective_javascript__on/ {
      pagespeed AvoidRenamingIntrospectiveJavascript on;
    }

    location /mod_pagespeed_test/custom_options/ {
      pagespeed DisableFilters convert_jpeg_to_progressive;
    }

    location /mod_pagespeed_test/ipro/test_image_dont_reuse.png {
      expires 5m;
    }

    location /mod_pagespeed_test/example.json {
      expires 10m;
    }

    location /mod_pagespeed_test/ipro/cc200/ {
      add_header "Cache-Control" "max-age=200";
    }
    location /mod_pagespeed_test/ipro/cc200p/ {
      add_header "Cache-Control" "private, max-age=200";
    }
    location /mod_pagespeed_test/ipro/cc200nc/ {
      add_header "Cache-Control" "no-cache, max-age=200";
    }
    location /mod_pagespeed_test/ipro/cc200ns/ {
      add_header "Cache-Control" "no-store, max-age=200";
    }
    location /mod_pagespeed_test/ipro/cc200nt/ {
      add_header "Cache-Control" "no-transform, max-age=200";
    }
    location /mod_pagespeed_test/ipro/cc200sma5/ {
      add_header "Cache-Control" "s-maxage=5, max-age=200";
    }
    location /mod_pagespeed_test/ipro/cc200sma50/ {
      add_header "Cache-Control" "s-maxage=50, max-age=200";
    }
    location /mod_pagespeed_test/ipro/cc200sma50nsp/ {
      add_header "Cache-Control" "s-maxage=50,max-age=200";
    }
    location /mod_pagespeed_test/ipro/cc9/ {
      add_header "Cache-Control" "max-age=9";
    }
    location /mod_pagespeed_test/ipro/cc200cc9/ {
      add_header "Cache-Control" "max-age=200, max-age=9";
    }
    location /mod_pagespeed_test/ipro/cc200sma50sma5/ {
      add_header "Cache-Control" "max-age=200, s-maxage=50, s-maxage=5";
    }
    location /mod_pagespeed_test/ipro/cc200sma50cc9/ {
      add_header "Cache-Control" "max-age=200, s-maxage=50, max-age=9";
    }
    location /mod_pagespeed_test/ipro/cc200sma50cc9nsp/ {
      add_header "Cache-Control" "max-age=200,s-maxage=50,max-age=9";
    }
    location /mod_pagespeed_test/ipro/cc200sma50sma51/ {
      add_header "Cache-Control" "max-age=200, s-maxage=50, s-maxage=51";
    }

    location /mod_pagespeed_test/ipro/wait/ {
      # TODO(jmarantz): ModPagespeedInPlaceWaitForOptimized should be superfluous,
      # or made equivalent to ModPagespeedInPlaceRewriteDeadlineMs -1, which waits
      # forever.  Otherwise ModPagespeedInPlaceRewriteDeadlineMs should just have
      # the specified deadline.
      # # See https://github.com/pagespeed/mod_pagespeed/issues/1171 for more
      # detailed discussion.
      pagespeed InPlaceWaitForOptimized on;
    }

    location /mod_pagespeed_test/ipro/wait/long/ {
      # Make the deadline long here for valgrind tests.  We could
      # conditionalize this.
      pagespeed InPlaceRewriteDeadlineMs 10000;
    }

    location /mod_pagespeed_test/ipro/wait/short/ {
      pagespeed EnableFilters in_place_optimize_for_browser;

      # Make the deadline short here as we expect to always miss it
      # in tests.
      pagespeed InPlaceRewriteDeadlineMs 1;
    }

    location /mod_pagespeed_test/ipro/instant/wait/ {
      pagespeed InPlaceWaitForOptimized on;

      # TODO(jefftk): When running with valgrind we need to raise the rewrite
      # deadline or else we get "Deadline exceeded for rewrite of resource".
      # I had thought InPlaceWaitForOptimized was supposed to disable the
      # rewrite deadline, but it seems not to.
      #
      # InPlaceWaitForOptimized is definitely doing something, though: when I
      # remove the InPlaceRewriteDeadlineMs line below and run without valgrind,
      # purple.css is optimized via ipro on the first request but if I set
      # InPlaceWaitForOptimized to off then it is not.
      pagespeed InPlaceRewriteDeadlineMs 1000;
    }

    location /mod_pagespeed_test/ipro/instant/deadline/ {
      set $ps_deadline -1;
      pagespeed ImageRecompressionQuality $ps_deadline;
      pagespeed InPlaceRewriteDeadlineMs $ps_deadline;
    }

    # Test to make sure that user-authenticated resources do not get cached and
    # optimized.
    location /mod_pagespeed_test/auth/ {
       auth_basic "Restricted";
       auth_basic_user_file "@@SERVER_ROOT@@/mod_pagespeed_test/auth/passwd.conf";
    }

    location /mod_pagespeed_test/ipro/cookie/ {
      # Add Vary:Cookie.  This should prevent us from optimizing the
      # vary_cookie.css even though PagespeedRespectVary is off.
      # test/nginx_system_test.sh does the fetches test with and w/o cookies.
      add_header Vary Cookie;
      pagespeed RespectVary off;
      pagespeed InPlaceWaitForOptimized on;
    }

    location /mod_pagespeed_test/ipro/cookie2/ {
      # Add Vary:Cookie2.  This should prevent us from optimizing the
      # vary_cookie2.css even though PagespeedRespectVary is off.
      # test/nginx_system_test.sh does the fetches test with and w/o cookie2.
      add_header Vary Cookie2;
      pagespeed RespectVary off;
      pagespeed InPlaceWaitForOptimized on;
    }

    location /mod_pagespeed_test/vary/ {
      pagespeed RespectVary on;
    }

    location ~ /mod_pagespeed_test/vary/\.(js|css)$ {
        add_header Vary User-Agent;
    }

    location /mod_pagespeed_test/vary/no_respect/ {
      pagespeed DisableFilters add_instrumentation,inline_css;
      pagespeed RespectVary off;
    }

    location /mod_pagespeed_test/experimental_js_minifier/ {
      pagespeed UseExperimentalJsMinifier on;
    }

    pagespeed FetchHttps enable;
    location /mod_pagespeed_test/https_fetch/ {
      pagespeed DisableFilters inline_images;
      set $ps_gstatic "https://www.gstatic.com/psa/static";
      pagespeed MapProxyDomain
          http://localhost:@@PRIMARY_PORT@@/https_gstatic_dot_com
          $ps_gstatic;
    }

    location /mod_pagespeed_test/strip_subresource_hints/default/ {
      pagespeed DisableFilters add_instrumentation;
      pagespeed RewriteLevel CoreFilters;
      pagespeed DisAllow *dontrewriteme*;
    }
    location /mod_pagespeed_test/strip_subresource_hints/default_passthrough/ {
      pagespeed DisableFilters add_instrumentation;
      pagespeed RewriteLevel PassThrough;
    }
    location /mod_pagespeed_test/strip_subresource_hints/preserve_on/ {
      pagespeed DisableFilters add_instrumentation;
      pagespeed PreserveSubresourceHints on;
      pagespeed RewriteLevel CoreFilters;
    }
    location /mod_pagespeed_test/strip_subresource_hints/preserve_off/ {
      pagespeed DisableFilters add_instrumentation;
      pagespeed PreserveSubresourceHints off;
      pagespeed RewriteLevel CoreFilters;
    }
    # $host implicitly tests script variable support. I'd love to test it more
    # directly, but so far this is the best I've come up with and duplicating
    # the test doesn't seem to make sense.
    pagespeed LoadFromFile
        "http://$host:@@PRIMARY_PORT@@/mod_pagespeed_test/ipro/instant/"
        "@@SERVER_ROOT@@/mod_pagespeed_test/ipro/instant/";

    location /mod_pagespeed_test/public/ {
      add_header "Cache-Control" "public, max-age=600";
      pagespeed PreserveUrlRelativity off;
    }

    pagespeed EnableFilters remove_comments;

    # Test LoadFromFile mapping by mapping one dir to another.
    pagespeed LoadFromFile
      "http://localhost:@@PRIMARY_PORT@@/mod_pagespeed_test/load_from_file/web_dir/"
      "@@SERVER_ROOT@@/mod_pagespeed_test/load_from_file/file_dir/";
    pagespeed LoadFromFileMatch
      "^http://localhost:@@PRIMARY_PORT@@/mod_pagespeed_test/load_from_file_match/web_([^/]*)/"
      "@@SERVER_ROOT@@/mod_pagespeed_test/load_from_file/file_\1/";
    pagespeed LoadFromFileRule Disallow
      "@@SERVER_ROOT@@/mod_pagespeed_test/load_from_file/file_dir/httponly/";
    pagespeed LoadFromFileRuleMatch Disallow \.ssp.css$ps_dollar;
    pagespeed LoadFromFileRuleMatch Allow exception\.ssp\.css$ps_dollar;
    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    index index.html;


    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
      root   html;
    }
  }

  sendfile        on;

  keepalive_timeout  65;

  types {
    text/html                             html htm shtml;
    text/css                              css;
    text/xml                              xml;
    image/gif                             gif;
    image/jpeg                            jpeg jpg;
    application/x-javascript              js;
    application/atom+xml                  atom;
    application/rss+xml                   rss;

    text/mathml                           mml;
    text/plain                            txt;
    text/vnd.sun.j2me.app-descriptor      jad;
    text/vnd.wap.wml                      wml;
    text/x-component                      htc;

    image/png                             png;
    image/tiff                            tif tiff;
    image/vnd.wap.wbmp                    wbmp;
    image/x-icon                          ico;
    image/x-jng                           jng;
    image/x-ms-bmp                        bmp;
    image/svg+xml                         svg svgz;
    image/webp                            webp;

    application/json                      json;
    application/java-archive              jar war ear;
    application/mac-binhex40              hqx;
    application/msword                    doc;
    application/pdf                       pdf;
    application/postscript                ps eps ai;
    application/rtf                       rtf;
    application/vnd.ms-excel              xls;
    application/vnd.ms-powerpoint         ppt;
    application/vnd.wap.wmlc              wmlc;
    application/vnd.google-earth.kml+xml  kml;
    application/vnd.google-earth.kmz      kmz;
    application/x-7z-compressed           7z;
    application/x-cocoa                   cco;
    application/x-java-archive-diff       jardiff;
    application/x-java-jnlp-file          jnlp;
    application/x-makeself                run;
    application/x-perl                    pl pm;
    application/x-pilot                   prc pdb;
    application/x-rar-compressed          rar;
    application/x-redhat-package-manager  rpm;
    application/x-sea                     sea;
    application/x-shockwave-flash         swf;
    application/x-stuffit                 sit;
    application/x-tcl                     tcl tk;
    application/x-x509-ca-cert            der pem crt;
    application/x-xpinstall               xpi;
    application/xhtml+xml                 xhtml;
    application/zip                       zip;

    application/octet-stream              bin exe dll;
    application/octet-stream              deb;
    application/octet-stream              dmg;
    application/octet-stream              eot;
    application/octet-stream              iso img;
    application/octet-stream              msi msp msm;

    audio/midi                            mid midi kar;
    audio/mpeg                            mp3;
    audio/ogg                             ogg;
    audio/x-m4a                           m4a;
    audio/x-realaudio                     ra;

    video/3gpp                            3gpp 3gp;
    video/mp4                             mp4;
    video/mpeg                            mpeg mpg;
    video/quicktime                       mov;
    video/webm                            webm;
    video/x-flv                           flv;
    video/x-m4v                           m4v;
    video/x-mng                           mng;
    video/x-ms-asf                        asx asf;
    video/x-ms-wmv                        wmv;
    video/x-msvideo                       avi;
  }
  default_type  application/octet-stream;

}
