Рейтинг:0

Varnish не открывает серверное соединение

флаг us

Как подключить контейнер 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 = "неограниченно (неработоспособный сервер)";
        вернуть (доставить);
    }
}

Рейтинг:0
флаг in

Попробуйте запустить лаклог -g запрос -q "ReqUrl eq '/'" чтобы увидеть, что происходит при запросе домашней страницы.

Если вы выполните эту команду, когда кеш пуст, мы должны увидеть попытку Varnish подключиться к серверной части.

Пожалуйста, поделитесь выводом VSL здесь, и я помогу.

ОБНОВИТЬ

я заметил в твоем докер-compose.yml файл, который ваш http контейнер настроен для обработки трафика на портах 80 & 443.

Эта проблема

лак контейнер прослушивает порты 6081 & 6082. Если вы не направляете трафик напрямую на порт 6081 совершенно очевидно, что Varnish не получает никаких запросов.

Решение

Убедитесь, что ваш контейнер Varnish также прослушивает входящий трафик через порт. 80. В вашем VCL вы можете указать порт 80 на http контейнер.

Но что касается раскрытия портов, вы можете захотеть перенаправить http контейнерный порт 80 к 8080. Это позволит избежать столкновения с Varnish, находящимся в порту. 80 также.

Вы также можете напрямую запустить официальный Лак изображения вместо того, чтобы построить его самостоятельно.

Вот руководство по запуску и настройке официального образа Docker: https://www.varnish-software.com/developers/tutorials/running-varnish-docker/

Прекращение TLS

Текущий порт 443 связано с вашим http контейнер. Если вы можете обрабатывать завершение TLS и проксировать HTTPS-запросы к Varnish, это нормально.

Если нет, вы можете запустить контейнер сцепки который выполняет завершение TLS для вас.

Major Kuprich avatar
флаг us
Все еще пустые журналы: https://i.imgur.com/GFcDXEo.png Я попытался обновить раздел .probe до: а) удалить раздел .request и раскомментировать .url б) обновить хост в разделе .request до моего локального сопоставления из файла /etc/hosts (IP, имя хоста) Но никакого успеха. :( PS Обратите внимание, что внутри этих контейнеров я использую Magento2 CMS.
Major Kuprich avatar
флаг us
Попытался обновить docker-compose.yml, чтобы перенаправить порт 80 на порт 8080 в http-контейнере. Измените порт для Varnish на 80. Состояние серверной части неудовлетворительное: 404 Not Found. Бэкенд открыт не открывается, никакие логи не работают. :( Проверьте новый конфиг, пожалуйста: https://pastebin.com/BYi1cHgM
Thijs Feryn avatar
флаг in
@MajorKuprich Боюсь, вы перенаправили порты в неправильном порядке. Вы сделали «6081:80», но это должно быть «80:6081». То же самое относится к «80:8080», которое должно быть «8080:80». Надеюсь, это поможет. Если вы можете получить доступ к контейнеру http через порт 8080 и смоделировать ошибку 404, возможно, вы сможете исправить ее и заставить все работать.

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

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