2014-05-22 38 views
0

我爲cPanel使用Unixy Varnish插件,一個特定網站及其所有子域使用完全SSL + HTTP嚴格傳輸安全。使用Varnish緩存,同時在NGINX SSL終結器上保留Google Analytics Cookie

Nginx在一個非標準的ssl端口上偵聽,將請求傳遞給Varnish,默認剝離所有的cookies。該請求最終由Apache提供。

該網站大多是靜態HTML,帶有WordPress子域名,IPB安裝,Piwik安裝。

主域名只是靜態頁面,所以我想強制Varnish緩存它,因爲沒有涉及登錄的任何內容,然後去除那些屬於Google Analytics的Cookie。

目前對於Google Analytics(分析),我使用http://www.ga-script.org中的腳本,該腳本使用經典跟蹤代碼js。我打算另外添加Universal Analytics代碼,刪除我的UA-XXXXXXX id(僅限於傳統的js)。

然後,我將解析Google Analytics的cookie(如此處所述:http://www.dannytalk.com/read-google-analytics-cookie-script/),並附帶Universal Analytics的修補程序,以便對該帖子發表最新評論 - 因此我可以將結果值傳遞給Piwik和/或CRM系統。

我並不是100%清楚我需要如何正確配置這種場景的Varnish,並希望其他人能夠幫助解決這個問題。通過Unixy供應

當前光油配置:

################################################### 
# Copyright (c) UNIXY - http://www.unixy.net # 
# The leading truly fully managed server provider # 
################################################### 

include "/etc/varnish/cpanel.backend.vcl"; 

include "/etc/varnish/backends.vcl"; 

# mod_security rules 
include "/etc/varnish/security.vcl"; 

sub vcl_recv { 

# Use the default backend for all other requests 
set req.backend = default; 

# Setup the different backends logic 
include "/etc/varnish/acllogic.vcl"; 

# Allow a grace period for offering "stale" data in case backend lags 
set req.grace = 5m; 

remove req.http.X-Forwarded-For; 
set req.http.X-Forwarded-For = client.ip; 

# cPanel URLs 
include "/etc/varnish/cpanel.url.vcl"; 

# Properly handle different encoding types 
if (req.http.Accept-Encoding) { 
    if (req.url ~ "\.(jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf|ico)$") { 
     # 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 { 
     # unkown algorithm 
     remove req.http.Accept-Encoding; 
    } 
} 

# Set up disabled 
include "/etc/varnish/disabled.vcl"; 

# Exclude upgrade, install, server-status, etc 
include "/etc/varnish/known.exclude.vcl"; 

# Set up exceptions 
include "/etc/varnish/url.exclude.vcl"; 

# Set up exceptions 
include "/etc/varnish/debugurl.exclude.vcl"; 

# Set up exceptions 
include "/etc/varnish/vhost.exclude.vcl"; 

# Set up vhost+url exceptions 
include "/etc/varnish/vhosturl.exclude.vcl"; 

# Set up cPanel reseller exceptions 
include "/etc/varnish/reseller.exclude.vcl"; 

# Restart rule for bfile recv 
include "/etc/varnish/bigfile.recv.vcl"; 


if (req.request == "PURGE") { 
     if (!client.ip ~ acl127_0_0_1) {error 405 "Not permitted";} 
     return (lookup); 
} 

## Default request checks 
if (req.request != "GET" && 
req.request != "HEAD" && 
req.request != "PUT" && 
req.request != "POST" && 
req.request != "TRACE" && 
req.request != "OPTIONS" && 
req.request != "DELETE") { 
    return (pipe); 
} 

if (req.request != "GET" && req.request != "HEAD") { 
    return (pass); 
} 

## Modified from default to allow caching if cookies are set, but not http auth 
if (req.http.Authorization) { 
    return (pass); 
} 

include "/etc/varnish/versioning.static.vcl"; 

## Remove has_js and Google Analytics cookies. 
set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(__[a-z]+|has_js)=[^;]*", ""); 

set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", ""); 

if (req.http.Cookie ~ "^\s*$") { 
    unset req.http.Cookie; 
} 

include "/etc/varnish/slashdot.recv.vcl"; 

# Cache things with these extensions 
if (req.url ~ "\.(js|css|jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf|pdf)$" && ! (req.url ~ "\.(php)")) { 
    unset req.http.Cookie; 
    return (lookup); 
} 

return (lookup); 
} 

sub vcl_fetch { 

set beresp.ttl = 40s; 
set beresp.http.Server = " - Web acceleration by http://www.unixy.net/varnish "; 

# Turn off Varnish gzip processing 
include "/etc/varnish/gzip.off.vcl"; 

# Grace to allow varnish to serve content if backend is lagged 
set beresp.grace = 5m; 

# Restart rule bfile for fetch 
include "/etc/varnish/bigfile.fetch.vcl"; 

# These status codes should always pass through and never cache. 
if (beresp.status == 503 || beresp.status == 500) { 
    set beresp.http.X-Cacheable = "NO: beresp.status"; 
    set beresp.http.X-Cacheable-status = beresp.status; 
    return (hit_for_pass); 
} 

if (beresp.status == 404) { 
    set beresp.http.magicmarker = "1"; 
    set beresp.http.X-Cacheable = "YES"; 
    set beresp.ttl = 20s; 
    return (deliver); 
} 

/* Remove Expires from backend, it's not long enough */  
unset beresp.http.expires; 

if (req.url ~ "\.(js|css|jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf|pdf|ico)$" && ! (req.url ~ "\.(php)")) { 
    unset beresp.http.set-cookie; 
    include "/etc/varnish/static.ttl.vcl"; 
} 
include "/etc/varnish/slashdot.fetch.vcl"; 
else { 
    include "/etc/varnish/dynamic.ttl.vcl"; 
} 

/* marker for vcl_deliver to reset Age: */ 
set beresp.http.magicmarker = "1"; 

# All tests passed, therefore item is cacheable 
set beresp.http.X-Cacheable = "YES"; 

return (deliver); 
} 

sub vcl_deliver { 

    # From http://varnish-cache.org/wiki/VCLExampleLongerCaching 
    if (resp.http.magicmarker) { 
    /* Remove the magic marker */ 
    unset resp.http.magicmarker; 

    /* By definition we have a fresh object */ 
    set resp.http.age = "0"; 
    } 
    set resp.http.Location = regsub(resp.http.Location, ":[0-9]+", ""); 

    #add cache hit data 
    if (obj.hits > 0) { 
    #if hit add hit count 
    set resp.http.X-Cache = "HIT"; 
    set resp.http.X-Cache-Hits = obj.hits; 
    } 
else { 
    set resp.http.X-Cache = "MISS"; 
    } 

} 

sub vcl_error { 

if (obj.status == 503 && req.restarts < 5) { 
set obj.http.X-Restarts = req.restarts; 
return (restart); 
} 

} 

# Added to let users force refresh 
sub vcl_hit { 

if (obj.ttl < 1s) { 
    return (pass); 
} 

if (req.http.Cache-Control ~ "no-cache") { 
# Ignore requests via proxy caches, IE users and badly behaved crawlers 
# like msnbot that send no-cache with every request. 
if (! (req.http.Via || req.http.User-Agent ~ "bot|MSIE|HostTracker")) { 
    set obj.ttl = 0s; 
    return (restart); 
} 
} 

return (deliver); 

} 

sub vcl_hash { 

    hash_data(req.http.cookie); 
} 
+0

如果我理解正確的情況下,您由於在客戶端瀏覽器上使用JavaScript處理GA cookie,因此不需要在請求中保留Google Analytics Cookie。你的問題到底是什麼? – Ketola

回答

1

你可以簡單地從請求刪除GA餅乾,他們不使用你的後端。

例如,你可以刪除所有的cookie,除了管理

if (!(req.url ~ ^/admin/)) { 
    unset req.http.Cookie; 
} 

或者丟棄用下劃線開頭的所有Cookie:

// Remove has_js and Google Analytics __* cookies. 
set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(_[_a-z]+|has_js)=[^;]*", ""); 
// Remove a ";" prefix, if present. 
set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", ""); 

https://www.varnish-cache.org/docs/4.0/users-guide/increasing-your-hitrate.html

相關問題