Рейтинг:1

Varnish с базовой аутентификацией возвращает 401

флаг us

Я попытался настроить Varnish на сервере с базовой аутентификацией, используя следующие решения:

но это не помогает. Журналы Varnish по-прежнему показывают 401 ошибку:

лаклог -g сырой -i Backend_health

         0 Backend_health - mag2.default Все еще болен 4--X-R- 0 5 10 0.001574 0.000000 HTTP/1.1 401 Неавторизованный

Моя конфигурация Varnish (версия 4.0):

vcl 4.0;

импорт стандарт;
# Минимальная версия Varnish - 4.0.
# Для разгрузки SSL передайте следующий заголовок на ваш прокси-сервер или балансировщик нагрузки: 'X-Forwarded-Proto: https'

серверная часть по умолчанию {
    .хост = "127.0.0.1";
    .порт = "8080";
    .first_byte_timeout = 600 с;
    .зонд = {
        .url = "/health_check.php";
        .таймаут = 2с;
        .интервал = 5с;
        .окно = 10;
        .порог = 5;
   }
}

очистка списка {
    "локальный хост";
}

суб vcl_recv {
    if (! req.http.Authorization ~ "Basic ZGV2OmRldg=") {
    return(synth(401, "Запрещено"));
    }

    если (треб. метод == "ОЧИСТИТЬ") {
        if (client.ip !~ очистить) {
            return (synth(405, "Метод не разрешен"));
        }
        # Чтобы использовать заголовок X-Pool для удаления лака во время автоматического развертывания, убедитесь, что заголовок X-Pool
        # был добавлен в ответ в конфигурации вашего внутреннего сервера. Этим пользуются, например,
        # capistrano-magento2 гем для очистки старого контента от лака во время процедуры развертывания.
        if (!req.http.X-Magento-Tags-Pattern && !req.http.X-Pool) {
            return (synth(400, "Требуется заголовок X-Magento-Tags-Pattern или X-Pool"));
        }
        if (req.http.X-Magento-Tags-Pattern) {
          ban("obj.http.X-Magento-Tags ~ " + req.http.X-Magento-Tags-Pattern);
        }
        если (треб.http.X-пул) {
          ban("obj.http.X-Pool ~ " + req.http.X-Pool);
        }
        возврат (синтез (200, "Очищено"));
    }

    если (треб.метод != "ПОЛУЧИТЬ" &&
        требуемый метод != "ГОЛОВА" &&
        req.method != "PUT" &&
        req.method != "POST" &&
        req.method != "TRACE" &&
        req.method != "ВАРИАНТЫ" &&
        req.method != "УДАЛИТЬ") {
          /* Не RFC2616 или CONNECT, что странно. */
          обратка (труба);
    }

    # По умолчанию мы работаем только с GET и HEAD
    if (req.method!= "GET" && req.method!= "HEAD") {
        вернуться (пройти);
    }

    # Обойти корзину и оформить заказ
    если (req.url ~ "/checkout") {
        вернуться (пройти);
    }

    # Обход запросов проверки работоспособности
    если (req.url ~ "/pub/health_check.php") {
        вернуться (пройти);
    }

    # Установить начальный статус использования льготного периода
    установить req.http.grace = "нет";

    # нормализовать URL в случае ведущей схемы HTTP и домена
    установить req.url = regsub(req.url, "^http[s]?://", "");

    # собрать все куки
    std.collect(req.http.Cookie);

    # Фильтр сжатия. См. https://www.varnish-cache.org/trac/wiki/FAQ/Compression.
    если (req.http.Accept-Encoding) {
        if (req.url ~ "\.(jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf|flv)$") {
            # Нет смысла сжимать эти
            отключить req.http.Accept-Encoding;
        } elsif (req.http.Accept-Encoding ~ "gzip") {
            установить req.http.Accept-Encoding = "gzip";
        } elsif (req.http.Accept-Encoding ~ "deflate" && req.http.user-agent !~ "MSIE") {
            установить req.http.Accept-Encoding = "deflate";
        } еще {
            # неизвестный алгоритм
            отключить req.http.Accept-Encoding;
        }
    }

    # Удалите все маркетинговые параметры get, чтобы свести к минимуму объекты кеша
    if (req.url ~ "(\?|&)(gclid|cx|ie|cof|siteurl|zanpid|origin|fbclid|mc_[az]+|utm_[az]+|_bta_[az]+)=" ) {
        установить req.url = regsuball(req.url, "(gclid|cx|ie|cof|siteurl|zanpid|origin|fbclid|mc_[az]+|utm_[az]+|_bta_[az]+)=[- _A-z0-9+()%.]+&?", "");
        установить req.url = regsub(req.url, "[?|&]+$", "");
    }

    # Кэширование статических файлов
    if (req.url ~ "^/(pub/)?(media|static)/") {
        # Статические файлы не должны кэшироваться по умолчанию
        вернуться (пройти);

        # Но если вы используете несколько локалей и не используете CDN, вы можете включить кеширование статических файлов, закомментировав предыдущую строку (#return (pass);) и раскомментировав следующие 3 строки
        #unset req.http.Https;
        #unset req.http.X-Forwarded-Proto;
        #unset req.http.Cookie;
    }

     # Аутентифицированные запросы GraphQL не должны кэшироваться по умолчанию
    if (req.url ~ "/graphql" && req.http.Authorization ~ "^Bearer") {
        вернуться (пройти);
    }

отключить req.http.Authorization;
    возврат (хэш);
}

суб vcl_hash {
    если (req.http.cookie ~ "X-Magento-Vary=") {
        hash_data(regsub(req.http.cookie, "^.*?X-Magento-Vary=([^;]+);*.*$", "\1"));
    }

    если (req.url ~ "/graphql") {
        вызвать process_graphql_headers;
    }

    # Чтобы убедиться, что пользователи http не видят предупреждение ssl
    если (req.http.X-Forwarded-Proto) {
        hash_data(req.http.X-Forwarded-Proto);
    }
    
}

подпроцесс_graphql_headers {
    если (треб.http.Store) {
        hash_data(req.http.Store);
    }
    если (req.http.Content-Currency) {
        hash_data(req.http.Content-Currency);
    }
}

суб vcl_backend_fetch {
    # авторизация с admin:admin
    установить bereq.http.Authorization = "Basic ZGV2OmRldg==";
}

суб vcl_backend_response {

    установить beresp.grace = 3d;

    если (beresp.http.content-type ~ "текст") {
        установить beresp.do_esi = true;
    }

    if (bereq.url ~ "\.js$" || beresp.http.content-type ~ "текст") {
        установить beresp.do_gzip = true;
    }

    если (бересп.http.X-Magento-Debug) {
        установить beresp.http.X-Magento-Cache-Control = beresp.http.Cache-Control;
    }

    # кешировать только успешные ответы и 404
    if (beresp.status != 200 && beresp.status != 404) {
        установить beresp.ttl=0s;
        установить beresp.uncacheable = true;
        вернуть (доставить);
    } elsif (beresp.http.Cache-Control ~ "частный") {
        установить beresp.uncacheable = true;
        установить beresp.ttl=86400s;
        вернуть (доставить);
    }

    # проверить, нужно ли нам кешировать его и запретить установку куки
    if (beresp.ttl > 0s && (bereq.method == "GET" || bereq.method == "HEAD")) {
        отключить beresp.http.set-cookie;
    }

   # Если страница не кэшируется, то отключите лакирование на 2 минуты как Hit-For-Pass.
   если (beresp.ttl <= 0s ||
       beresp.http.Surrogate-control ~ "без магазина" ||
       (!beresp.http.Surrogate-Control &&
       beresp.http.Cache-Control ~ "без кеша|без хранилища") ||
       beresp.http.Vary == "*") {
       # Отметить как Hit-For-Pass на следующие 2 минуты
        установить beresp.ttl=120с;
        установить beresp.uncacheable = true;
    }

    вернуть (доставить);
}

суб vcl_deliver {
    если (соответственно http.X-Magento-Debug) {
        если (соответственно http.x-лак ~ "") {
            установить соотв. http.X-Magento-Cache-Debug = "HIT";
            установить соотв.http.Grace = req.http.grace;
        } еще {
            установить соотв. http.X-Magento-Cache-Debug = "MISS";
        }
    } еще {
        сбросить соответственно http.Age;
    }

    # Не позволять браузеру кэшировать нестатические файлы.
    if (соответственно http.Cache-Control !~ "private" && req.url !~ "^/(pub/)?(media|static)/") {
        установить соотв. http.Pragma = "без кеша";
        установить соотв. http.Expires = "-1";
        set resp.http.Cache-Control = "без хранения, без кеша, обязательная повторная проверка, максимальный возраст = 0";
    }

    отключить соответствующий http.X-Magento-Debug;
    сбросить соответствующие http.X-Magento-теги;
    сбросить настройки http.X-Powered-By;
    отключить соотв.http.Server;
    сбросить настройки http.X-Varnish;
    сбросить настройки http.Via;
    отключить соответствующую http.ссылку;
}

суб vcl_hit {
    если (obj.ttl >= 0s) {
        # Попадание в течение периода TTL
        вернуть (доставить);
    }
    если (std.healthy(req.backend_hint)) {
        если (obj.ttl + 300 с > 0 с) {
            # Хит после истечения TTL, но в течение льготного периода
            set req.http.grace = "нормальный (работоспособный сервер)";
            вернуть (доставить);
        } еще {
            # Хит после истечения TTL и льготного периода
            вернуть (забрать);
        }
    } еще {
        # сервер неисправен, извлечь из кеша
        set req.http.grace = "неограниченно (неработоспособный сервер)";
        вернуть (доставить);
    }
}

суб vcl_synth {
  если (соответственно статус == 401) {
    установить соотв.статус = 401;
    set resp.http.WWW-Authenticate = "Basic";
    возврат (доставка);
  }
}
Рейтинг:1
флаг in

Проблема, с которой вы столкнулись, заключается в том, что ваш сервер также требует Базовая аутентификация. Когда ваш зонд проверки работоспособности опрашивает серверную часть, он возвращает HTTP/1.1 401 Неавторизованный потому что вы не предоставили заголовок авторизации.

Мы можем исправить это, отправив собственный заголовок запроса в ваш серверный зонд.

Вот код VCL:

серверная часть по умолчанию {
    .хост = "127.0.0.1";
    .порт = "8080";
    .first_byte_timeout = 600 с;
    .зонд = {
        .запрос =
            "HEAD /health_check.php HTTP/1.1"
            "Авторизация: базовая ZGV2OmRldg="
            «Хост: локальный хост»
            "Соединение: закрыть"
            «Агент пользователя: Varnish Health Probe»;
        .таймаут = 2с;
        .интервал = 5с;
        .окно = 10;
        .порог = 5;
   }
}

Как видите, мы отправляем следующий HTTP-запрос на ваш сервер:

ГОЛОВА /health_check.php HTTP/1.1
Авторизация: Базовая ZGV2OmRldg=
Хост: локальный
Подключение: закрыть
Агент пользователя: Varnish Health Probe

Мы проводим ГЛАВНЫЙ звонить, а не ПОЛУЧАТЬ, потому что нас не волнует полезная нагрузка, нас интересует только код состояния.

я также предполагаю Базовый ZGV2OmRldg= является правильным значением авторизации, которое требуется для вашего бэкэнда.

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

Видеть https://www.varnish-software.com/developers/tutorials/vcl-backend-probe-basic-authentication/ для учебника, который соответствует вашему варианту использования.

Major Kuprich avatar
флаг us
Большое спасибо за полное описание, теперь Varnish правильно настроен с BasicAuth :)

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.