Мой контейнер varnish docker не может кэшировать. Получаю 404, а также кэш-промах и кэш-пропуск.

Вопрос или проблема

Я запускаю Varnish следующим образом:

 docker run -e VARNISH_BACKEND_HOST=pre.xplore.xircular.io -e VARNISH_BACKEND_PORT=9190 --tmpfs /var/lib/varnish/varnishd:exec -p 8080:80 varnish

Мой бэкенд – это Node.js, и он развернут на той же хост-машине на порту 9190, где контейнер Varnish также работает на порту 8080.

После настройки, когда я обращаюсь к https://pre.xplore.xircular.io, я ничего не вижу и получаю ошибку. Но когда я закомментирую proxy_pass http://127.0.0.1:8080;, тогда возвращается интерфейс веб-сайта.

Если я обращаюсь к http://pre.xplore.xircular.io, я получаю промах кэша.

*   << Request  >> 15369232
  • Начать req 15369231 rxreq
  • Время Начало: 1732686922.901961 0.000000 0.000000
  • Время Запрос: 1732686922.901961 0.000000 0.000000
  • VCL_use boot
  • ReqStart 198.235.24.126 57500 http
  • ReqMethod GET
  • ReqURL /
  • ReqProtocol HTTP/1.1
  • ReqHeader Host: 139.5.190.56:8080
  • ReqHeader User-Agent: Expanse, компания Palo Alto Networks, сканирует глобальное пространство IPv4 несколько раз в день, чтобы идентифицировать присутствие клиентов в Интернете. Если вы хотите быть исключенными из наших сканирований, пожалуйста, отправьте IP-адреса/домены по адресу: sc
  • ReqHeader Accept-Encoding: gzip
  • ReqHeader X-Forwarded-For: 198.235.24.126
  • ReqHeader Via: 1.1 474ba33d85b1 (Varnish/7.6)
  • VCL_call RECV
  • ReqUnset Host: 139.5.190.56:8080
  • ReqHeader host: pre.xplore.xircular.io:9190
  • VCL_return hash
  • VCL_call HASH
  • VCL_Log встроенное правило: хеширование URL
  • VCL_Log встроенное правило: хеширование заголовка Host
  • VCL_return lookup
  • VCL_call MISS
  • ReqHeader x-cache: miss
  • VCL_return fetch
  • Link bereq 15369233 fetch
  • Время Fetch: 1732686922.905815 0.003854 0.003854
  • RespProtocol HTTP/1.1
  • RespStatus 404
  • RespReason Не найдено
  • RespHeader X-Powered-By: Express
  • RespHeader Vary: Origin
  • RespHeader Content-Security-Policy: default-src ‘none’
  • RespHeader X-Content-Type-Options: nosniff
  • RespHeader Content-Type: text/html; charset=utf-8
  • RespHeader Content-Length: 139
  • RespHeader Date: Ср, 27 Ноя 2024 05:55:22 GMT
  • RespHeader X-Varnish: 15369232
  • RespHeader Age: 0
  • RespHeader Via: 1.1 474ba33d85b1 (Varnish/7.6)
  • VCL_call DELIVER
  • ReqUnset x-cache: miss
  • ReqHeader x-cache: miss cached
  • RespHeader x-cache: miss cached
  • VCL_return deliver
  • Время Process: 1732686922.905838 0.003876 0.000022
  • Фильтры
  • RespHeader Connection: keep-alive
  • Время Resp: 1732686922.905945 0.003983 0.000106
  • ReqAcct 349 0 349 351 139 490
  • Конец

Моя конфигурация nginx:

upstream xplore_server {
server localhost:9190;
}

server {
listen 443 ssl http2;
server_name pre.xplore.xircular.io;

ssl_certificate /etc/letsencrypt/live/pre.xplore.xircular.io/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pre.xplore.xircular.io/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

root /var/www/xplore/Divikit-campaigns;



location / {

Настройка Varnish

Передача запросов в Varnish (на порту 8080)

    #proxy_pass http://127.0.0.1:8080;


    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;


index index.html;
try_files $uri $uri/ /index.html;
}

location /campaign/d9ab0589-f2fe-4543-b643-787da711b0b8 {
return 301 https://appclip.apple.com/id?p=com.xircular.XplorePromote.Clip&campaignId=6700c20b-5e48-4e23-927c-930bc8e8db20;
}

location /.well-known/assetlinks.json {
root /var/www/xplore; # Путь к вашему файлу
default_type application/json;
add_header Content-Type application/json;
try_files $uri =404;
}
location /apple-app-site-association {
alias /var/www/xplore/.well-known/apple-app-site-association;
default_type application/json;
add_header Content-Type application/json;
try_files $uri =404;
}

location /.well-known/apple-app-site-association {
alias /var/www/xplore/.well-known/apple-app-site-association;
default_type application/json;
add_header Content-Type application/json;
try_files $uri =404;
}

location /socket.io/ {
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_set_header X-NginX-Proxy true;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_pass http://xplore_server/socket.io/;
    proxy_redirect off;
  proxy_read_timeout 86400;
  proxy_connect_timeout 7d;
  proxy_send_timeout 7d;

}

location /api/v1/ {
    rewrite ^/api/(.*) /$1 break;
    add_header 'Access-Control-Allow-Credentials' 'true' always;
    add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range,X-Auth-Token' always;
    add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH' always;

    proxy_connect_timeout 30s;
    proxy_read_timeout 300s;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_buffering off;

    proxy_pass http://xplore_server/;
    # Передача API-запросов через Varnish
    #proxy_pass http://127.0.0.1:8080;

    access_log /var/log/nginx/xplore-v1.log log_bodydata2;

    if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' '*' always;
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE, PATCH' always;
        add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range,X-Auth-Token' always;
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain charset=UTF-8';
        add_header 'Content-Length' 0;
        return 204;
    }
}

}

server {
listen 80;
server_name pre.xplore.xircular.io;

location / {
    return 301 https://$server_name$request_uri;
}

}

Я хотел бы кэшировать данные с бэкенда, и каждый раз, когда пользователь обращается к моему веб-сайту https:pre.xplore.xircualr.io, он должен получать ответы быстрее как часть кэширования Varnish.

Спасибо

Ответ или решение

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

1. Проблемы с окружением Varnish

На первом этапе проверьте, правильно ли указаны переменные окружения для Varnish в Docker-контейнере:

docker run -e VARNISH_BACKEND_HOST=pre.xplore.xircular.io -e VARNISH_BACKEND_PORT=9190 --tmpfs /var/lib/varnish/varnishd:exec -p 8080:80 varnish

По всей видимости, вы должны использовать 127.0.0.1 или localhost в Varnish для указания внутреннего бекенда (Node.js). Попробуйте заменить pre.xplore.xircular.io на 127.0.0.1, если это возможно, именно в этом контексте. Это гарантирует, что Varnish будет корректно направлять запросы в ваш Node.js сервер на локальном хосте.

2. Ошибка 404 на бекенде

Вы получаете ошибку 404, что указывает на то, что сервер не может найти запрашиваемый ресурс. Убедитесь, что ваш Node.js сервер действительно активен на порту 9190 и что стандартные пути (например, /) возвращают ответы. Возможно, вашему Node.js приложению не хватает маршрутов для обработки главной страницы или других конечных точек, что приводит к ошибке 404.

3. Конфигурация Nginx

Судя по вашему конфигуратору Nginx, у вас есть закомментированная строка proxy_pass для Varnish:

#proxy_pass http://127.0.0.1:8080;

Если вы хотите использовать Varnish в качестве прокси между клиентом и вашим Node.js сервером, то эту строку следует раскомментировать. Обратите внимание на порядок обработки запросов: убедитесь, что запросы обрабатываются сначала через Varnish, а затем передаются на Nginx (если это нужно):

location / {
    proxy_pass http://127.0.0.1:8080;  # Разкомментируйте эту строку
    ...
}

4. Ошибки в VCL

Проверьте ваш VCL код на наличие возможных ошибок в настройках кеширования. Возможно, вам нужно настроить правила в VCL для того, чтобы контролировать поведение кеша (например, устанавливать заголовки кеширования или игнорировать определенные запросы). Пример простого VCL:

vcl 4.0;

backend default {
    .host = "127.0.0.1";
    .port = "9190";
}

sub vcl_recv {
    if (req.method == "GET") {
        return (hash);
    }
}

sub vcl_backend_response {
    set beresp.ttl = 5m;  # Установите TTL для кеширования
}

5. Проверка заголовков

Помимо прочего, убедитесь в корректности заголовков входящих запросов от клиента. Проверьте, что они содержат необходимые Cookies и другие данные. Если ваш Node.js сервер зависит от определенных заголовков, их отсутствие может приводить к 404 ошибкам.

6. Логи и мониторинг

Изучите логи как Nginx, так и Varnish. Это даст вам больше информации о том, что происходит с вашими запросами и почему возвращаются коды ошибок. Логи могут предоставить ключ к пониманию проблемы с 404.

Заключение

В вашем случае для успешной реализации кеширования через Varnish необходимо убедиться, что:

  • Он корректно настроен на взаимодействие с вашим бекендом.
  • Nginx правильно конфигурирован для проксирования через Varnish.
  • Наличие ошибок налагает ограничения на кеширование, поэтому важно обеспечить правильную обработку запросов при помощи исправного VCL кода.

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

Оцените материал
Добавить комментарий

Капча загружается...