Como faço para DRY up esta configuração Nginx?

4

Estou no Nginx 0.8.54 tentando obter o seguinte como DRYly:

  • Proxy direto para localhost:8060 se o cookie no_cache for true ou se o método de solicitação não for GET .
  • Caso contrário, exiba arquivos estáticos em $document_root/static/$uri .
  • Se esse arquivo não existir, tente $document_root/cache/$uri e $document_root/cache/$uri.html .
  • Se o caminho da solicitação for / , não tente arquivos estáticos e apenas $document_root/cache/index.html .
  • Finalmente, volte para localhost:8060 se não encontrar arquivos estáticos nem armazenados em cache.

Arquivo de configuração atual:

server {
    root /srv/web/example.com;
    server_name example.com;

    location @backend { proxy_pass http://localhost:8060; }

    location / {
        if ($cookie_no_cache = true) { proxy_pass http://localhost:8060; }
        if ($request_method != GET) { proxy_pass http://localhost:8060; }
        try_files /static/$uri /cache/$uri /cache/$uri.html @backend;
    }

    location = / {
        if ($cookie_no_cache = true) { proxy_pass http://localhost:8060; }
        if ($request_method != GET) { proxy_pass http://localhost:8060; }
        try_files /cache/index.html @backend;
    }
}
    
por ja' 25.04.2011 / 00:17

1 resposta

4
http {
  map $cookie_no_cache $cacheZone {
    default "";
    true    X;
  }

  server {
    root /srv/web/example.com;
    server_name example.com;

    error_page 405 = @backend;

    location / {
      try_files /cache$cacheZone/$uri.html /static$cacheZone/$uri
                /cache$cacheZone/$uri @backend;
    }

    location @backend {
      proxy_pass http://localhost:8060;
    }
  }
}

Explicação.

  1. Em relação à verificação do cookie "no_cache". Estamos substituindo por Nginx map . Variável $cacheZone depende do valor de $cookie_no_cache . Por padrão, ele está vazio, mas se houver um cookie "no_cache = true", definimos $cacheZone como qualquer valor para modificar o caminho de pesquisa do arquivo estático em try_files - espero que você não tenha as pastas /cacheX e /staticX sob sua raiz do servidor (se sim, escolha outro valor para $cacheZone )
  2. O Nginx não pode aplicar os métodos HTTP PUT ou POST a arquivos estáticos (isso não tem sentido), portanto, emite um erro HTTP 405 "Não permitido" neste caso. Interceptamos por error_page e passamos a solicitação para @backend location.

Abordagem alternativa

Caso contrário, use proxy_cache :

http {
  proxy_cache_path example:1m;

  server {
    root  /srv/web/example.com;
    server_name example.com;

    location / {
      proxy_cache example;
      proxy_cache_bypass $cookie_no_cache;
      proxy_cache_valid 200 10s;
      proxy_pass http://localhost:8060;
    }
  }
}
    
por 27.04.2011 / 13:32