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

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

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

  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;

  # 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";

  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@@;
    server_name max-cacheable-content-length.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";


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

  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@@;
    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;
      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:8050.
      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@@;
    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@@;
    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@@;
    server_name mpd.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";

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

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

    pagespeed RunExperiment on;
    pagespeed AnalyticsID "123-45-6734";
    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@@;
    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@@;
    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@@;
    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@@;
    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@@;
    server_name downstreamcacheresource.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_images;
    pagespeed DownstreamCachePurgeLocationPrefix "http://localhost:@@SECONDARY_PORT@@/purge";
  }

  server {
    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.
  #
  # In Apache we can do this all with Directory blocks, but to get the same
  # inheretence in Nginx we need to have location blocks inside a server block.
  server {
    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@@;
    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@@;
    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@@;
    server_name unauthorizedresources.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

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

  server {
    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@@;
    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;

    # 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@@;
    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@@;
    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 {
    listen @@SECONDARY_PORT@@;
    server_name retaincomment.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed RetainComment " google_ad_section*";
  }

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

    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_images;
  }

  server {
    listen @@SECONDARY_PORT@@;
    server_name xfp.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed RespectXForwardedProto on;
  }

  server {
    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@@;
    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@@;
    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@@;
    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 InPlaceResourceOptimization on;
    pagespeed FileCachePath "@@IPRO_CACHE@@";
  }

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

    pagespeed RespectVary on;
    add_header Vary User-Agent;
  }

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

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

  server {
    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@@;
    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@@;
    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@@;
    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@@;
    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@@;
    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@@;
    server_name modpagespeed.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed off;

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

  server {
    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;
  }

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

  server {
    listen @@SECONDARY_PORT@@;
    server_name notransform.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";

    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_images;

    add_header Cache-Control no-transform;
  }

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

    pagespeed RewriteLevel PassThrough;
    pagespeed EnableFilters rewrite_images;
  }

  server {
    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@@;
    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@@;
    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@@;
    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@@;
    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@@;
    server_name response-header-filters.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed RewriteLevel PassThrough;
    pagespeed on;
    add_header PageSpeedFilters add_instrumentation;
  }

  server {
    listen @@SECONDARY_PORT@@;
    server_name response-header-disable.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@";
    pagespeed EnableFilters add_instrumentation;
    pagespeed on;
    add_header PageSpeed off;
  }

  server {
    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@@;
    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@@;
    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@@;
    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@@;
    server_name noned-nonem.example.com;
    pagespeed FileCachePath "@@SECONDARY_CACHE@@_noned_nonem";

    pagespeed EnableFilters rewrite_images;
    pagespeed CriticalImagesBeaconEnabled false;
  }

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

  # Proxy + IPRO a gzip'd file for testing Issue 896.
  server {
    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@@;
    server_name compressed-css.example.com;
    pagespeed FileCachePath "@@FILE_CACHE@@";
    pagespeed InPlaceResourceOptimization on;
  }

  server {
    listen       @@PRIMARY_PORT@@;
    server_name  localhost;
    pagespeed FileCachePath "@@FILE_CACHE@@";

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

    location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" {
      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';
    }

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

    pagespeed on;
    pagespeed MessageBufferSize 200000;

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

    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;
      deny all;
    }

    location /ngx_pagespeed_message {
      allow 127.0.0.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 {
      add_header "Cache-Control" "max-age=12345";
      add_header "Cache-Control" "public, no-store";
      add_header "Cache-Control" "max-age=14";
    }

    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/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/ {
      pagespeed InPlaceRewriteDeadlineMs -1;
    }

    # 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;
      pagespeed MapProxyDomain
          http://localhost:@@PRIMARY_PORT@@/https_gstatic_dot_com
          https://www.gstatic.com/psa/static;
    }

    pagespeed LoadFromFile
        "http://localhost:@@PRIMARY_PORT@@/mod_pagespeed_test/ipro/instant/"
        "@@SERVER_ROOT@@/mod_pagespeed_test/ipro/instant/";

    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$;
    pagespeed LoadFromFileRuleMatch Allow exception\.ssp\.css$;

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

  # set up gzip
  gzip  on;
  gzip_vary on;
  gzip_proxied any;
  # Turn on gzip for all content types that should benefit from it.
  gzip_types application/ecmascript;
  gzip_types application/javascript;
  gzip_types application/json;
  gzip_types application/pdf;
  gzip_types application/postscript;
  gzip_types application/x-javascript;
  gzip_types image/svg+xml;
  gzip_types text/css;
  gzip_types text/csv;
  # "gzip_types text/html" is assumed.
  gzip_types text/javascript;
  gzip_types text/plain;
  gzip_types text/xml;

  gzip_http_version 1.0;

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

}
