Architect diary-VCL variables y fragmentos comunes

En VCL, hay 3 estructuras de datos importantes:

1. req : destino de la solicitud. Cuando Varnish recibe una solicitud, se crea el objeto req. La mayor parte del trabajo en vcl_recv se lleva a cabo en el objeto req.
2. beresp : El destino devuelto por el servidor back-end, que contiene la información de encabezado devuelta. La mayor parte del trabajo en vcl_fetch se lleva a cabo en beresp onject.
3.obj : el objetivo en caché, el objetivo de solo lectura se almacena en la memoria, el valor de obj.ttl se puede modificar, los demás solo se pueden leer

Dado que la subrutina no tiene parámetros, la información necesaria para la subrutina se maneja a través de variables globales.

Las siguientes variables están disponibles en todas partes:

  • ahora: la hora actual
    las siguientes variables son válidas en el backend indicado:
  • .host: un nombre de host backend o una dirección IP
  • .port: un nombre de servicio backend o el número de puerto de
    las siguientes variables son válidos para procesar la solicitud:
  • cient.ip: IP del cliente
  • cient.identity: la identificación del cliente, que se utiliza como director del cliente para el equilibrio de carga
  • server.hostname: el nombre de host del servidor
  • server.identity: La identidad del servidor, establecida con el parámetro -i. Si el parámetro -i no se pasa a varnishd, server.identity establecerá el nombre de la instancia de varnishd.
  • server.ip: el cliente se conectó al socket y recibió la dirección IP
  • server.port: el número de puerto recibido cuando el cliente se conecta al socket
  • req.request: tipo de solicitud, como "GET", "HEAD"
  • req.proto: protocolo HTTP del cliente
  • req.url: URL solicitada
  • req.backend: qué servidor backend se utiliza para atender esta solicitud
  • req.backend.healthy: si el servidor backend está en buen estado
  • req.http. Nombre de encabezado específico: el encabezado HTTP correspondiente, como req.http.Cookie
  • req.hash_always_miss: fuerza la invalidación de caché de esta solicitud
  • req.hash_ignore_busy: ignora los objetos ocupados cuando se busca caché
  • req.can_gzip: configurado para usar gzip
  • req.restarts: establece el número máximo de reinicios
  • req.esi: Establezca si es compatible con ESI, cambiará en el futuro, se recomienda no usar
  • req.esi_level: establece el nivel de ESI
  • req.grace: establece el tiempo que se mantiene el objeto
  • req.xid: la identificación única de la solicitud

Las siguientes variables se utilizan al acceder al servidor backend

  • bereq.request: el tipo de solicitud (como "GET", "HEAD")
  • bereq.url: URL solicitada
  • bereq.proto: el protocolo solicitado
  • bereq.http. Nombre de encabezado específico: encabezado HTTP de la solicitud, como bereq.http.Cookie
  • bereq.connect_timeout: el tiempo de espera para que responda el servidor backend
  • bereq.first_byte_timeout: tiempo de espera para recibir el primer byte, no válido en modo pipe
  • bereq.between_bytes_timeout: el intervalo entre dos bytes recibidos del servidor backend, el modo de canalización no es válido

Las siguientes variables se utilizan cuando se recuperan del servidor back-end pero aún no han ingresado al caché, es decir, la variable vcl_fetch

  • beresp.do_stream: el objeto se devuelve directamente al cliente y no se almacenará en caché en Varnish. Estos objetos se marcarán como ocupados en Varnish3
  • beresp.do_esi: si realizar el procesamiento ESI
  • beresp.do_gzip: ya sea para la compresión Gzip antes de almacenar
  • beresp.do_gunzip: si descomprimir antes de almacenar
  • beresp.http. Nombre de encabezado específico: encabezado HTTP, como beresp.http.Cookie
  • beresp.proto: protocolo HTTP
  • beresp.status: código de estado HTTP
  • beresp.response: el mensaje de estado devuelto por el servidor
  • beresp.ttl: la hora a la que se guardó el objeto
  • beresp.grace: la hora en que se guardó el objeto Grace
  • beresp.saintmode: la duración del modo santo
  • beresp.backend.name: el nombre del backend de la respuesta
  • beresp.backend.ip: respuesta 的 backend 的 ip
  • beresp.backend.port: el puerto del backend de la respuesta
  • beresp.storage: Forzar a Varnish a guardar este objeto

Las siguientes variables son válidas después de que el destino de la solicitud se obtiene con éxito del servidor backend o la caché

  • obj.proto: devuelve la versión HTTP del destino de la solicitud
  • obj.status: código de estado HTTP devuelto por el servidor
  • obj.response: información de estado HTTP devuelta por el servidor
  • obj.ttl: El tiempo de supervivencia restante del objetivo, en segundos.
  • obj.lastuse: El tiempo transcurrido desde la última solicitud, en segundos.
  • obj.hits: Número aproximado de veces entregado. Si es 0, significa que la caché es incorrecta.
  • obj.grace: el tiempo de supervivencia de la gracia del objeto
  • obj.http. El nombre del encabezado específico: encabezado Http

Las siguientes variables son válidas después de la clave hash de destino

  • req.hash: la clave hash está relacionada con el destino en el caché y se usa al leer y escribir en el caché.
  • Las siguientes variables se utilizan al prepararse para responder al cliente
  • resp.proto: la versión del protocolo HTTP para la que se prepara la respuesta
  • resp.status: devuelve el código de estado HTTP del cliente
  • resp.response: devuelve la información de estado HTTP del cliente
  • resp.http.header: encabezado HTTP en comunicación
    con la palabra clave SET, el valor a asignar a la variable:
sub vcl_recv {
    
    
    # Normalize the Host: header
    if (req.http.host ~ "^(www.)?example.com$") {
        set req.http.host = "www.example.com";
    }
}

Puede usar la palabra clave remove para eliminar completamente el encabezado HTTP:

sub vcl_fetch {
    
    
    remove obj.http.Set-Cookie;
}

Fragmentos de aplicación de VCL comunes

1. Configure diferentes parámetros de encabezado para diferentes dispositivos:

sub vcl_recv {
    if (req.http.User-Agent ~ "iPad" ||
        req.http.User-Agent ~ "iPhone" ||
        req.http.User-Agent ~ "Android") {
        set req.http.X-Device = "mobile";
    } else {
        set req.http.X-Device = "desktop";
    }
}

2. Quiere cancelar la cookie de la solicitud de acceso / imágenes:

sub vcl_recv {
    
    
    if (req.url ~ "^/images") {
        unset req.http.cookie;
    }
}

3. Controle la dirección IP accesible a través de ACL

acl local {
    "localhost";
    "192.168.1.0"/24; /* and everyone on the local network */
    ! "192.168.1.23"; /* except for the dialin router */
}
sub vcl_recv {
    
    
    if (req.request == "PURGE") {
        if (client.ip ~ local) {
            return(lookup);
        }
    }
}
sub vcl_hit {
    
    
    if (req.request == "PURGE") {
        set obj.ttl = 0s;
        error 200 "Purged.";
    } 
}
sub vcl_miss {
    
    
    if (req.request == "PURGE") {
        error 404 "Not in cache.";
    }
}

4. Modifique el ttl del objeto devuelto desde el servidor de fondo:

sub vcl_fetch {
    
    
    if (req.url ~ "\.(png|gif|jpg)$") {
        unset beresp.http.set-cookie;
        set beresp.ttl = 1h;
    }
}

5. Configure el encabezado de aceptación de codificación enviado por el cliente para que solo tenga dos codificaciones: gzip y deflate, gzip tiene prioridad

if (req.http.Accept-Encoding) {
    if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$") {
        # No point in compressing these
        remove req.http.Accept-Encoding;
    } elsif (req.http.Accept-Encoding ~ "gzip") {
        set req.http.Accept-Encoding = "gzip";
    } elsif (req.http.Accept-Encoding ~ "deflate") {
        set req.http.Accept-Encoding = "deflate";
    } else {
        # unknown algorithm
        remove req.http.Accept-Encoding;
    }
}

6. Enlace antirrobo de imagen simple:

if (req.http.referer ~ "http://.*") {
    if ( !(req.http.referer ~ "http://.*baidu\.com"
        || req.http.referer ~ "http://.*google\.com"
        || req.http.referer ~ "http://.*google\.cn"
    )) {
        set req.http.host = "www.baidu.com";
        set req.url = "/static/images/logo.gif";
    }
    return (lookup);
}

Supongo que te gusta

Origin blog.csdn.net/qq_32198277/article/details/77103632
Recomendado
Clasificación