Как подключить контейнер Varnish к контейнерам PHP-FPM + NGINX?
Докер запустился корректно, сайт работает, но логи backendopen пусты.
Серверная часть исправна (возвращает статус HTTP 200).
лаклог -g сырой -i Backend_health
0 Backend_health — по умолчанию Все еще работоспособен 4---X-RH 7 5 10 0,048069 0,065633 "HTTP/1.1 200 OK"
Из контейнера http (nginx) я вижу запрос в журналах докера.
логи докера http
[10/Sep/2021:17:24:01 +0000] "GET /health_check.php HTTP/1.1" 200 5 "-" "-"
Но бэкэнд-соединение не открывает соединение, журналы пусты, проверено через: лаклог -i backendopen команда.
Я пробовал решение с этого сайта, но не работает: Php+Nginx+Varnish в docker-compose, ubuntu18.
докер-compose.yml
http:
    строить:
    контекст: докер/http
    имя_контейнера: http
    порты:
       - 80:80
       - 443:443
    зависит от:
       - пхп
    тома:
        - ./проект:/var/www/проект
php:
    строить:
        контекст: докер/php
    имя_контейнера: php
    рабочий_каталог: /var/www/project
    тома:
        - ./проект:/var/www/проект
    
лак:
    строить:
    контекст: докер/лак
    container_name: лак
    порты:
       - 6081:6081
       - 6082:6082
Конфигурация ВКЛ:
vcl 4.0;
импорт стандарт;
серверная часть по умолчанию {
    .хост = "http";
    .порт = "80";
    .first_byte_timeout = 600 с;
    .зонд = {
        #.url = "/health_check.php";
        .запрос =
                    «ПОЛУЧИТЬ /health_check.php HTTP/1.1»
                    "Хост: http"
                    "Соединение: закрыть";
        .таймаут = 2с;
        .интервал = 5с;
        .окно = 10;
        .порог = 5;
   }
}
очистка списка {
    "http";
}
суб vcl_recv {
    если (треб. перезапусков > 0) {
        установить req.hash_always_miss = true;
    }
    если (треб. метод == "ОЧИСТИТЬ") {
        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") {
        вернуться (пройти);
    }
    возврат (хэш);
}
суб vcl_hash {
    если (req.http.cookie ~ "X-Magento-Vary=") {
        hash_data(regsub(req.http.cookie, "^.*?X-Magento-Vary=([^;]+);*.*$", "\1"));
    }
    # Чтобы убедиться, что пользователи http не видят предупреждение ssl
    если (req.http.X-Forwarded-Proto) {
        hash_data(req.http.X-Forwarded-Proto);
    }
    
    если (req.url ~ "/graphql") {
        вызвать process_graphql_headers;
    }
}
подпроцесс_graphql_headers {
    если (треб.http.Store) {
        hash_data(req.http.Store);
    }
    если (req.http.Content-Currency) {
        hash_data(req.http.Content-Currency);
    }
}
суб 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 = "неограниченно (неработоспособный сервер)";
        вернуть (доставить);
    }
}