Пол Кнулст в Докер • 5 сентября 2022 г. • 6 мин. чтения


Пытаясь повысить производительность своего блога и улучшить взаимодействие с пользователем для моих посетителей, я решил поискать возможность интегрировать кэш HTTP в мою среду Docker Swarm.

После долгих исследований, а также спрашивать других людей на Reddit (К сожалению, никто не смог мне помочь) Я нахожу решение, которое соответствует моим ожиданиям.

Во время исследования я узнал о Лак который представляет собой ускоритель веб-приложений, также известный как кэширующий обратный прокси-сервер HTTP. Его можно установить перед любым сервером, использующим HTTP для кэширования содержимого. Это очень, очень быстро и обычно ускоряет доставку в 300-1000 раз, сокращает время загрузки и может справляться с пиками трафика.

Общий обзор того, что делает Varnish, можно увидеть в этом видео:


Установка

Моя новая установка включает сервер Varnish HTTP Cache, который развернут с помощью Docker в моей среде Docker Swarm. Он расположен между моим прокси-сервером Traefik и моим блогом Ghost. В этой настройке Varnish используется для кэширования широкого спектра статического контента на странице, такого как JavaScript, CSS, изображения и текстовые файлы.

Служба Ghost Blog с Traefik до и после использования HTTP-кэша Varnish

Служба Ghost Blog с Traefik до и после использования HTTP-кэша Varnish


Бенчмаркинг

Для сравнения моего веб-сайта я использую Расширение Маяк от Google, giftofspeed.comа также инструменты.pingdom.com. Все тестовые сайты загружают весь сайт, как будто мы в браузере. Я проводил разные тесты из разных стран с включенным Varnish и без него. Во время тестирования Я мог видеть увеличение производительности примерно на 20%.

Например, на сайте giftofspeed.com я несколько раз протестировал один и тот же URL-адрес с включенным HTTP-кэшем Varnish и без него и получил следующие результаты:

Без HTTP-кеша Varnish:

Тест производительности без HTTP-кэша Varnish с сайта giftofspeed.com

Тестирование производительности без HTTP-кэша Varnish

С HTTP-кэшем Varnish:

Протестируйте производительность с помощью Varnish HTTP Cache от giftofspeed.com

Тестирование производительности с HTTP-кэшем Varnish


Настройте это для себя

Во-первых, убедитесь, что у вас установлены docker и docker-compose. Кроме того, вам нужно балансировщик нагрузки Traefik который перенаправляет запросы в мой блог Ghost. Все правила (метки) в файле Compose будут основаны на моей личной установке Traefik.

Теперь, чтобы настроить HTTP-кэш Varnish между моим блогом Ghost и прокси-сервером Traefik, я расширяю файл Compose для этого блога (читай как я его настроил здесь), сначала добавив varnish раздел, а затем перемещая все ярлыки из моего ghost обслуживание varnish оказание услуг. Затем я меняю порт сервера балансировщика нагрузки с 2368 (порт-призрак) на 80 (порт лака). Другое необходимое изменение заключается в том, что networks для ghost служба изменена тем, что имеет только default и varnish служба имеет default а также traefik-public. Последним изменением будет добавление конфигурации в файл Compose, который будет содержать конфигурацию Varnish.

Полученная часть файла Compose будет выглядеть так:

      varnish:
        image: varnish:stable
        container_name: varnish
        restart: unless-stopped
        configs:
          - source: varnish_cfg
            target: /etc/varnish/default.vcl
        networks:
          - default
          - traefik-public
        deploy:
          labels:
            - traefik.enable=true
            - traefik.docker.network=traefik-public
            - traefik.constraint-label=traefik-public
            - traefik.http.routers.blogs-knulst-http.rule=Host(`www.knulst.de`) || Host(`knulst.de`) || Host(`blog.knulst.de`)
            - traefik.http.routers.blogs-knulst-http.entrypoints=http
            - traefik.http.routers.blogs-knulst-http.middlewares=https-redirect
            - traefik.http.routers.blogs-knulst-https.rule=Host(`www.knulst.de`) || Host(`knulst.de`) || Host(`blog.knulst.de`)
            - traefik.http.routers.blogs-knulst-https.entrypoints=https
            - traefik.http.routers.blogs-knulst-https.tls=true
            - traefik.http.routers.blogs-knulst-https.tls.certresolver=le
            - traefik.http.routers.blogs-knulst-https.tls.options=mintls12@file
            - traefik.http.services.blogs-knulst.loadbalancer.server.port=80
            - traefik.http.middlewares.redirect-blogs-knulst.redirectregex.regex=^
            - traefik.http.middlewares.redirect-blogs-knulst.redirectregex.replacement=
            - traefik.http.middlewares.redirect-blogs-knulst.redirectregex.permanent=true
            - traefik.http.middlewares.redirect-blogs-knulst-nosub.redirectregex.regex=^
            - traefik.http.middlewares.redirect-blogs-knulst-nosub.redirectregex.replacement=
            - traefik.http.middlewares.redirect-blogs-knulst-nosub.redirectregex.permanent=true
            - traefik.http.routers.blogs-knulst-https.middlewares=redirect-blogs-knulst, redirect-blogs-knulst-nosub
    configs:
      varnish_cfg:
        file: ./default.vcl
Войти в полноэкранный режим

Выйти из полноэкранного режима

В рамках ghost service мы определили конфигурацию, указывающую на default.vcl который будет выглядеть так:

    vcl 4.0;

    backend default {
        .host = "ghost:2368";
    }
    sub vcl_recv {
        # Do not cache the admin and preview pages
        if (req.url ~ "^/ghost($|/.*)" ||
            req.url ~ "^/p($|/.*)" ||
            req.url ~ "^/admin($|/.*)" ||
            req.url == "
            ) {
               return (pass);
        }
        if (req.url ~ "testclear") {
            ban("req.http.host == knulst.de");
            return(synth(200, "Cache was cleared by Rest call"));
        }
    }
Войти в полноэкранный режим

Выйти из полноэкранного режима

В этом файле я объявил несколько специальных правил для HTTP-кеша Varnish:

  • Установить backend к призрак: 2368 потому что внутри внутренней сети по умолчанию призрак доступен через ghost:2368.
  • Удалять /ghost/..., /p/...а также /admin/... из кэша, потому что меню администратора не должно кэшироваться.
  • Удалите корневой URL этого блога, чтобы никогда не иметь устаревший список статей из-за кэширования.
  • Добавьте URL-адрес (/testclear), чтобы вручную очистить кеш. Должен быть удален в производстве!

Я создаю файл конфигурации Varnish (default.vcl) в той же папке, что и файл docker-compose.


Теперь я мог развернуть полный файл Compose, который можно скачать на GitHub Gist с помощью этой команды:

    $ docker stack deploy -c docker-compose.yml blog
Войти в полноэкранный режим

Выйти из полноэкранного режима

Если вы хотите использовать его, обновите хост, базу данных (MySQL) и настройки почты.


Обработка ошибок


Настройка конфигурации Varnish

Если я когда-нибудь захочу изменить конфигурацию Varnish, необходимо изменить имя конфигурации из-за того, что вы не можете изменить конфигурации в среде Docker. Вы можете легко изменить его на новое имя в файле Compose, развернуть его, а затем удалить старый ключ, чтобы изменить два имени конфигурации.

После этого вам нужно перезагрузить конфигурацию, потому что она не будет применяться автоматически. Для этого я переключился на сервер, на котором развернут мой контейнер Varnish, и использую docker exec чтобы перезагрузить конфигурацию Varnish:

    $ docker exec YOUR_VARNISH_CONTAINER varnishreload
Войти в полноэкранный режим

Выйти из полноэкранного режима


Скачанный файл не работает

Если вы вслепую загрузили файл в GitHub Gist, он не будет работать без установки необходимых переменных для Mail, Mysql и Host. Посмотри на это руководство объясняет настройку Ghost с помощью Docker. Кроме того, настройте параметры Mysql, поскольку руководство по Ghost было создано до перехода на MySQL, и эта часть отсутствует. Но я работаю над простым руководством, которое будет опубликовано через несколько недель.


Заключительные примечания

Поздравляю, если вы последовали моему подходу, вы только что установили свой собственный блог Ghost с HTTP-кэшем Varnish, который улучшит производительность!

Полный файл Compose можно найти в GitHub Gist Я создал для этой статьи. Если у вас остались вопросы о настройке блога Ghost, вы можете следуйте моему руководству о том, как сделать это в Docker Swarm.

Это конец этого урока. Надеюсь, теперь вы можете настроить свою личную установку. Если вам понравилось читать эту статью, рассмотрите возможность комментирования ваших ценных мыслей в разделе комментариев. Я хотел бы услышать ваши отзывы о Varnish HTTP Cache. Кроме того, поделитесь этой статьей с другими блоггерами, чтобы помочь им повысить эффективность своего блога!

Эта запись в блоге была первоначально опубликована в моем собственном блоге:

Не стесняйтесь связаться со мной на мой личный блог, Середина, LinkedIn, Твиттера также Гитхаб.


Вы нашли эту статью ценной? Хотите поддержать автора? (… и поддержите разработку текущих и будущих руководств!). Вы можете спонсировать меня на Купи мне кофе или же Кофе . Кроме того, вы можете стать бесплатным или платным участником, регистрация на этом сайте. См. страницу вклада для всех (бесплатных или платных) способов сказать спасибо!


фото Джулиан Хохгесанг / Скрыть