diff --git a/modules/undine/manifests/init.pp b/modules/undine/manifests/init.pp index ea303de..afb53b4 100644 --- a/modules/undine/manifests/init.pp +++ b/modules/undine/manifests/init.pp @@ -7,16 +7,16 @@ # === Examples # # The primary use of the Undine class is to encapuslate basic provisioning for -# the VM. It is intended to be declared in Puppet modules in the ./sites +# the VM. It is intended to be declared in Puppet modules in the ./sites # directory using the require syntax, typically followed by one or more # undine::drupal_instance resources. -# +# # require undine # undine::drupal_instance { "mysite": # ... # } # -class undine { +class undine { require undine_php require undine_git require undine_ssh @@ -26,6 +26,7 @@ class undine { require undine_drush require undine_xhprof require undine_xdebug + require undine_varnish require undine_sendmail file { "/etc/motd": diff --git a/modules/undine_varnish/files/default.vcl b/modules/undine_varnish/files/default.vcl new file mode 100644 index 0000000..8545903 --- /dev/null +++ b/modules/undine_varnish/files/default.vcl @@ -0,0 +1,158 @@ +# This is a basic VCL configuration file for varnish. See the vcl(7) +# man page for details on VCL syntax and semantics. + +# Default backend definition. Set this to point to your content +# server. +# +backend default { + .host = "127.0.0.1"; + .port = "1000"; +} + +# Respond to incoming requests. +sub vcl_recv { + # Use anonymous, cached pages if all backends are down. + if (!req.backend.healthy) { + unset req.http.Cookie; + } + + # Allow the backend to serve up stale content if it is responding slowly. + set req.grace = 6h; + + # Pipe these paths directly to Apache for streaming. + #if (req.url ~ "^/admin/content/backup_migrate/export") { + # return (pipe); + #} + + if (req.restarts == 0) { + if (req.http.x-forwarded-for) { + set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip; + } + else { + set req.http.X-Forwarded-For = client.ip; + } + } + + # Do not cache these paths. + if (req.url ~ "^/status\.php$" || + req.url ~ "^/update\.php$" || + req.url ~ "^/admin$" || + req.url ~ "^/admin/.*$" || + req.url ~ "^/flag/.*$" || + req.url ~ "^.*/ajax/.*$" || + req.url ~ "^.*/ahah/.*$") { + return (pass); + } + + # Do not allow outside access to cron.php or install.php. + #if (req.url ~ "^/(cron|install)\.php$" && !client.ip ~ internal) { + # Have Varnish throw the error directly. + # error 404 "Page not found."; + # Use a custom error page that you've defined in Drupal at the path "404". + # set req.url = "/404"; + #} + + # Always cache the following file types for all users. This list of extensions + # appears twice, once here and again in vcl_fetch so make sure you edit both + # and keep them equal. + if (req.url ~ "(?i)\.(pdf|asc|dat|txt|doc|xls|ppt|tgz|csv|png|gif|jpeg|jpg|ico|swf|css|js)(\?.*)?$") { + unset req.http.Cookie; + } + + # Remove all cookies that Drupal doesn't need to know about. We explicitly + # list the ones that Drupal does need, the SESS and NO_CACHE. If, after + # running this code we find that either of these two cookies remains, we + # will pass as the page cannot be cached. + if (req.http.Cookie) { + # 1. Append a semi-colon to the front of the cookie string. + # 2. Remove all spaces that appear after semi-colons. + # 3. Match the cookies we want to keep, adding the space we removed + # previously back. (\1) is first matching group in the regsuball. + # 4. Remove all other cookies, identifying them by the fact that they have + # no space after the preceding semi-colon. + # 5. Remove all spaces and semi-colons from the beginning and end of the + # cookie string. + set req.http.Cookie = ";" + req.http.Cookie; + set req.http.Cookie = regsuball(req.http.Cookie, "; +", ";"); + set req.http.Cookie = regsuball(req.http.Cookie, ";(SESS[a-z0-9]+|SSESS[a-z0-9]+|NO_CACHE)=", "; \1="); + set req.http.Cookie = regsuball(req.http.Cookie, ";[^ ][^;]*", ""); + set req.http.Cookie = regsuball(req.http.Cookie, "^[; ]+|[; ]+$", ""); + + if (req.http.Cookie == "") { + # If there are no remaining cookies, remove the cookie header. If there + # aren't any cookie headers, Varnish's default behavior will be to cache + # the page. + unset req.http.Cookie; + } + else { + # If there is any cookies left (a session or NO_CACHE cookie), do not + # cache the page. Pass it on to Apache directly. + return (pass); + } + } +} + +# Set a header to track a cache HIT/MISS. +sub vcl_deliver { + if (obj.hits > 0) { + set resp.http.X-Varnish-Cache = "HIT"; + } + else { + set resp.http.X-Varnish-Cache = "MISS"; + } +} + +# Code determining what to do when serving items from the Apache servers. +# beresp == Back-end response from the web server. +sub vcl_fetch { + # We need this to cache 404s, 301s, 500s. Otherwise, depending on backend but + # definitely in Drupal's case these responses are not cacheable by default. + if (beresp.status == 404 || beresp.status == 301 || beresp.status == 500) { + set beresp.ttl = 10m; + } + + # Don't allow static files to set cookies. + # (?i) denotes case insensitive in PCRE (perl compatible regular expressions). + # This list of extensions appears twice, once here and again in vcl_recv so + # make sure you edit both and keep them equal. + if (req.url ~ "(?i)\.(pdf|asc|dat|txt|doc|xls|ppt|tgz|csv|png|gif|jpeg|jpg|ico|swf|css|js)(\?.*)?$") { + unset beresp.http.set-cookie; + } + + # Allow items to be stale if needed. + set beresp.grace = 6h; +} + +# In the event of an error, show friendlier messages. +sub vcl_error { + # Redirect to some other URL in the case of a homepage failure. + #if (req.url ~ "^/?$") { + # set obj.status = 302; + # set obj.http.Location = "http://backup.example.com/"; + #} + + # Otherwise redirect to the homepage, which will likely be in the cache. + set obj.http.Content-Type = "text/html; charset=utf-8"; + synthetic {" + +
+The page you requested is temporarily unavailable.
+We're redirecting you to the homepage in 5 seconds.
+