LINUX.ORG.RU
решено ФорумAdmin

Varnish и несколько хостов

 


1

1

На сервере крутится apache и nginx, кэширую то что можно через varnish, не соображу как добовать поддержку нескольких виртуальных хостов. По примерам пробовал делать несколько именованых backend и в sub vcl_recv по домену менять переменную

if (req.http.host == "site1.ru") {
	set req.http.host = "127.0.0.1";
	set req.backend = site1ru;
	return (lookup);
}
if (req.http.host == "site2.ru") {
	set req.http.host = "127.0.0.1";
	set req.backend = site2ru;
	return (lookup);
}
Но вылетает с ошибкой Unknown variable 'req.backend' Видимо этот пример от старой vcl

Подскажите как правильно реализовать, вот мой конфиг на всякий случай.

# Сообщаем компилятору о том, что используется новая версия VCL 4
vcl 4.0;

include "devicedetect.vcl";

# Настройки бэкенда
backend default {
    .host = "127.0.0.1";
    .port = "8080";
}


# Диапазон IP/Хостов, которым разрешено выполнять PURGE-запросы для очистки кэша
acl purge {
    "localhost";
    "127.0.0.1";
}

# Получение запроса от клиента
sub vcl_recv {
		call devicedetect;

        # Разрешить очистку кэша вышеописанному диапазону
        if (req.method == "PURGE") {
                # Если запрос не из списка, то разворачивать
                if (!client.ip ~ purge) {
                        return(synth(405, "This IP is not allowed to send PURGE requests."));
                }
                return (purge);
        }

        # POST-запросы а также страницы с Basic-авторизацией пропускать
        if (req.http.Authorization || req.method == "POST") {
                return (pass);
        }

        # Пропускать админку и страницу входа
        if (req.url ~ "wp-(login|admin)" || req.url ~ "preview=true" || req.url ~ "(manager|php|assets|components)") {
			if( !(req.url ~ "\.html") ){
                return (pass);
            }
        }

        # Если установлены cookies "wordpress_" или "comment_" пропускаем напряиую к бэкенду
        if (req.http.Cookie ~ "wordpress_" || req.http.Cookie ~ "comment_" || req.http.Cookie ~ "modx_admin") {
                return (pass);
        }


        # Удаляем cookies, содержащие "has_js" и "__*", добавляемые CloudFlare и Google Analytics, так как Varnish не будет кэшировать запросы, для которых установлены cookies.
        set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(_[_a-z]+|has_js)=[^;]*", "");

        # Удаление префикса ";" в cookies, если вдруг будет обнаружен
        set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", "");

        # Удаляем Quant Capital cookies (добавляются некоторыми плагинами)
        set req.http.Cookie = regsuball(req.http.Cookie, "__qc.=[^;]+(; )?", "");
        # Удаляем wp-settings-1 cookie
        set req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-1=[^;]+(; )?", "");

        # Удаляем wp-settings-time-1 cookie
        set req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-time-1=[^;]+(; )?", "");

        # Удаляем wp test cookie
        set req.http.Cookie = regsuball(req.http.Cookie, "wordpress_test_cookie=[^;]+(; )?", "");

        # Удаляем cookie, состоящие только из пробелов (или вообще пустые)
        if (req.http.cookie ~ "^ *$") {
                unset req.http.cookie;
        }

        # Для статических документов удаляем все cookies, пусть себе кэшируются 
        if (req.url ~ "\.(css|js|png|gif|jp(e)?g|swf|ico|woff|svg|htm|html)" || req.url ~ "/") {
                unset req.http.cookie;
        }

        # Если cookie не найдено, удаляем данный параметр из пришедшего запроса как таковой
        if (!req.http.cookie) {
                unset req.http.cookie;
        }

        # Не кэшировать запросы с установленными cookies, это уже не касается WordPress
        if (req.http.Authorization || req.http.Cookie) {
                # Not cacheable by default
                return (pass);
        }

        # Кэшировать всё остальное
        return (hash);
}

sub vcl_pass {
        return (fetch);
}

sub vcl_hash {
        hash_data(req.url);

        return (lookup);
}

# Приём ответа от бэкенда
sub vcl_backend_response {
        # Удаляем ненужные заголовки
        unset beresp.http.Server;
        unset beresp.http.X-Powered-By;
        
        # Для статических файлов, которые отдаёт бэкенд...
        if (bereq.url ~ "\.(css|js|png|gif|jp(e?)g)|swf|ico|woff|svg|htm|html" || bereq.url ~ "/" ) {
                # Удаляем все куки 
                #unset beresp.http.cookie;
                # Устанавливаем срок хранения в кэше - неделю
                set beresp.ttl = 1d;
                # Устанавливаем заголовки Cache-Control и Expires, сообщая браузеру о том, что эти файлы стоит сохранить в кэше клиента и не нагружать лишниий раз наш сервер
                unset beresp.http.Cache-Control;
                set beresp.http.Cache-Control = "public, max-age=604800";
                set beresp.http.Expires = now + beresp.ttl;
        }

        # Не кэшировать админку и страницу логина
        if (bereq.url ~ "wp-(login|admin)" || bereq.url ~ "preview=true" || bereq.url ~ "(manager|php|assets|components)") {
			if( !(bereq.url ~ "\.html") ){
                set beresp.uncacheable = true;
                set beresp.ttl = 30s;
                return (deliver);
            }
        }

        # Разрешить устанавливать куки только при обращении к этим путям, всё остальное будет резаться
        if (!(bereq.url ~ "(wp-login|wp-admin|preview=true|manager|php|assets|components)") || bereq.url ~ "\.html") {
                unset beresp.http.set-cookie;
        }

        # Не кэшировать результат ответа на POST-запрос или Basic авторизации
        if ( bereq.method == "POST" || bereq.http.Authorization ) {
                set beresp.uncacheable = true;
                set beresp.ttl = 120s;
                return (deliver);
        }

        # Не кэшировать результаты поиска
        if ( bereq.url ~ "\?s=" ){
                set beresp.uncacheable = true;
                set beresp.ttl = 120s;
                return (deliver);
        }

        # Не кэшировать страницы ошибок, только нужные вещи в кэше!
        if ( beresp.status != 200 ) {
                set beresp.uncacheable = true;
                set beresp.ttl = 120s;
                return (deliver);
        }

		if (bereq.http.X-UA-Device) {
			if (!beresp.http.Vary) { # no Vary at all
				set beresp.http.Vary = "X-UA-Device";
			} elsif (beresp.http.Vary !~ "X-UA-Device") { # add to existing Vary
				set beresp.http.Vary = beresp.http.Vary + ", X-UA-Device";
			}
		}
		# comment this out if you don't want the client to know your classification
		set beresp.http.X-UA-Device = bereq.http.X-UA-Device;        

        # Хранить в кэше всё прочее на протяжении одного дня
        set beresp.ttl = 1d;
        # Срок жизни кэша после истечения его TTL
        set beresp.grace = 30s;

        return (deliver);
}

# Действия перед отдачей результата пользователю
sub vcl_deliver {
		if ((req.http.X-UA-Device) && (resp.http.Vary)) {
			set resp.http.Vary = regsub(resp.http.Vary, "X-UA-Device", "User-Agent");
		}
		
        # Удаляем ненужные заголовки
        unset resp.http.X-Powered-By;
        unset resp.http.Server;
        unset resp.http.Via;
        unset resp.http.X-Varnish;

        return (deliver);
}

Поставь nginx как прокси с кэшем в tmpfs вместо varnish и будет тебе счастье.

anonymous
()
Ответ на: комментарий от commetaR37

Все, разобрался

sub vcl_hash {
        hash_data(req.url);

		if (req.http.host) {
			hash_data(req.http.host);
		}

        return (lookup);
}

commetaR37
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.