Эффективно пропускать первые N байтов потока

При использовании Varnish с Magento. Varnish действует как внешний/прокси-сервер, а Magento действует как внутренний сервер. Таким образом, всякий раз, когда пользователь обращается/запрашивает URL-адрес вашего веб-сайта, он сначала попадает на интерфейс Varnish (), затем передает запрос на сервер Magento (), затем Magento обрабатывает запрос и снова передает запрос Varnish и, наконец, Varnish отправляет запрос/страницу веб-сайта пользователю.

Вот поток запросов:

User request (website URL) --> Varnish (frontend) --> Magento (backend) --> Varnish (frontend) --> User requested page (website URL)

Итак, в вашем сценарии у вас есть 2 сервера, как показано ниже.

Varnish Server (frontend): 129.89.188.245 on port 80
Magento 2 Server (backend): 129.89.188.244 on port 80

Надеюсь, вы создали файл конфигурации лака из панели администратора Magento. Если нет, вы можете сгенерировать его, выполнив следующие шаги, и настроить Varnish.

 1. Log in to the Magento Admin as an administrator.
 2. Click STORES > Configuration > ADVANCED > System > Full Page Cache.
 3. From the Caching Application list, click Varnish Caching.
 4. Enter a value in the TTL for public content field.
 5. Expand Varnish Configuration and enter the following information:

    Access list: Enter the fully qualified hostname, IP address for which to invalidate
    content.

    Backend host: Enter the fully qualified hostname or IP address and listen port of the Varnish backend or origin server; that is, the server providing the content Varnish will accelerate. Typically, this is your web server.

    Backend port: Origin server's listen port.

 6. Click Save Config.

 7. Click on "Export VCL for Varnish 4" to create a default.vcl

 8. Replace Varnish current default.vcl configuration file with the generated one and restart the Varnish service.

После этого измените Magento Базовый URL-адрес и Безопасный базовый URL-адрес на Varnish IP/домен.

Теперь, когда первый пользователь заходит на ваш веб-сайт с помощью URL/IP, Varnish извлекает страницу/контент из Magento и кэширует их, а затем возвращает пользователю. Когда второй пользователь запрашивает ту же страницу/контент, Varnish обслуживает его из кеша.

Надеюсь, это объяснение рассеет ваши сомнения.

1
05.12.2020, 18:02
2 ответа

Mac OSX tailработает медленно.

brew install coreutils, затем переключение на gtailрешает проблему.

 leijurvs-MacBook-Pro:~ leijurv$ time cat /dev/zero | head -c 100000000 | tail -c +2 | shasum -a 256
f4be792b71a024a60d77b3ac4c1c2b88ac51480fa25f88d10865827f8c086506  -
cat /dev/zero  0.01s user 0.03s system 0% cpu 7.153 total
head -c 100000000  0.02s user 0.03s system 0% cpu 7.152 total
tail -c +2  7.07s user 0.03s system 99% cpu 7.159 total
shasum -a 256  0.51s user 0.06s system 7% cpu 7.154 total
 leijurvs-MacBook-Pro:~ leijurv$ time cat /dev/zero | head -c 100000000 | gtail -c +2 | shasum -a 256
f4be792b71a024a60d77b3ac4c1c2b88ac51480fa25f88d10865827f8c086506  -
cat /dev/zero  0.00s user 0.02s system 4% cpu 0.497 total
head -c 100000000  0.02s user 0.08s system 18% cpu 0.496 total
gtail -c +2  0.05s user 0.10s system 30% cpu 0.496 total
shasum -a 256  0.47s user 0.02s system 99% cpu 0.496 total
 leijurvs-MacBook-Pro:~ leijurv$ 
2
18.03.2021, 22:45

Если вы просто хотите пропустить первый байт файла перед передачей в shasum, вы можете просто сделать (здесь, используя синтаксис zsh, поскольку выходной формат timeпредполагает, что это оболочка, которую вы используете.):

time cat /dev/zero | head -c 100000000 |
   (LC_ALL=C read -u0 -k1 && shasum -a 256)

Тогда это означает отсутствие дополнительного процесса, этот первый байт был просто прочитан из конвейера с помощьюreadперед запуском shasum.

То, что LC_ALL=C read -u0 -k1является readвводом 1символа(kздесь для клавиши , поскольку read -kизначально предназначалось для чтения нажатий клавиш с терминала ), где символы здесь одиночные байт благодаря LC_ALL=C, из файлового дескриптора unit number0(stdin; здесь, чтобы сделать это явным, мы читаем из потока, а не из терминала ).

В оболочке bashэквивалентной командойreadбудет LC_ALL=C IFS= read -rd '' -n1.

Эквивалент read -kzsh обычно будет read -N, но это не будет работать для ввода, содержащего байты NUL, которые bashreadпросто удаляют (также -N, скопированные из ksh93. является относительно недавним дополнением, которое не было бы доступно в древней версии bash, найденной на macos ). Установив разделитель dна нулевой байт (, выраженный здесь как пустая строка ), мы избегаем этого. -n1означает чтение одного символа (, снова сделанного байтом благодаряLC_ALL=C)из первой записи с разделителями NUL. Однако это означает, что его нельзя адаптировать к другому количеству байтов, как в случае с -rd '' -n2, мы бы пропустили только один байт, если бы первый байт был равен 0.

В других оболочках вы можете заменить эту команду readнаdd bs=1 count=1 > /dev/null 2>&1(изменить count, а не bs, чтобы пропустить более одного байта ).head -c 1 > /dev/nullтакже будет работать с некоторыми из тех headреализаций, которые поддерживают эту не -стандартную -cопцию, но не со всеми (и, в частности, не с FreeBSD, поэтому, вероятно, не с macos ' либо ), так как некоторые будут читать ввод фрагментами фиксированного размера, даже если запрашивается вывод меньшего количества байтов. Однако обратите внимание, что, в отличие от readвыше, они не сообщают о статусе завершения с ошибкой, когда им не удается прочитать этот один байт, поэтому shasumбудет запущен в любом случае.

Когда контрольная сумма представляет собой обычный файл, а не канал, вы можете пропускать более эффективно (предполагая, что нужно пропустить более одного байта )путем поиска внутри файла, а не читать и отбрасывать часть для пропуска с (по-прежнему zshсинтаксисом):

zmodload zsh/system
{ sysseek 1234567 && shasum -a 256; } < some-big-file

Чтобы пропустить первые 1234567 байт.

Или с кш93:

shasum -a 256 < some-big-file <#((1234567))

С другими оболочками и с некоторыми реализациямиdd(про macos не могу сказать ), можно:

{ dd bs=1 skip=1234567 count=0 2> /dev/null; shasum -a 256; } < some-big-file

Однако использование count=0не является переносимым. Не все реализации ddбудут выполнять lseek()здесь, когда счетчик равен 0. Некоторые даже понимают это как count=infinity.

4
18.03.2021, 22:45

Теги

Похожие вопросы