платформа api: Ошибка (null) Не удалось получить серверную часть - PullRequest
0 голосов

Мы используем symfony с API платформы в docker, и у нас есть проблема с varni sh.

Для локальной разработки varni sh работает с default.vcl файл конфигурации (https://github.com/api-platform/api-platform/blob/master/api/docker/varnish/conf/default.vcl). При загрузке на сервер varni sh выдает ошибку «Ошибка (null) Backend fetch failed»

При отключении varni sh и перенаправлении на nginx с php -fpm , API-платформа работает правильно.

Я увеличил параметры http_resp_hdr_len до 131072 байт (128K) и http_rasp_size * От 1021 * до 10485760 байт (10Мб) , но это не помогает, и ошибка остается.

docker команда для запуска varni sh:

CMD ["varnishd", "-F", "-f", "/etc/varnish/default.vcl", "-p", "http_resp_hdr_len=131072", "-p", "http_resp_size=10485760"]

Также параметр - .first_byte_timeout = 600s; был добавлен в default.vcl varni sh

default.vcl

vcl 4.0;

import std;

backend default {
  .host = "api";
  .port = "80";
  .first_byte_timeout = 600s;
  # Health check
  .probe = {
    .url = "/";
    .timeout = 5s;
    .interval = 50s;
    .window = 5;
    .threshold = 3;
  }
}

# Hosts allowed to send BAN requests
acl invalidators {
  "localhost";
  "php";
  # local Kubernetes network
  "10.0.0.0"/8;
  "172.16.0.0"/12;
  "192.168.0.0"/16;
}

sub vcl_recv {
  if (req.restarts > 0) {
    set req.hash_always_miss = true;
  }

  # Remove the "Forwarded" HTTP header if exists (security)
  unset req.http.forwarded;

  # To allow API Platform to ban by cache tags
  if (req.method == "BAN") {
    if (client.ip !~ invalidators) {
      return (synth(405, "Not allowed"));
    }

    if (req.http.ApiPlatform-Ban-Regex) {
      ban("obj.http.Cache-Tags ~ " + req.http.ApiPlatform-Ban-Regex);

      return (synth(200, "Ban added"));
    }

    return (synth(400, "ApiPlatform-Ban-Regex HTTP header must be set."));
  }

  # For health checks
  if (req.method == "GET" && req.url == "/healthz") {
    return (synth(200, "OK"));
  }
}

sub vcl_hit {
  if (obj.ttl >= 0s) {
    # A pure unadulterated hit, deliver it
    return (deliver);
  }

  if (std.healthy(req.backend_hint)) {
    # The backend is healthy
    # Fetch the object from the backend
    return (restart);
  }

  # No fresh object and the backend is not healthy
  if (obj.ttl + obj.grace > 0s) {
    # Deliver graced object
    # Automatically triggers a background fetch
    return (deliver);
  }

  # No valid object to deliver
  # No healthy backend to handle request
  # Return error
  return (synth(503, "API is down"));
}

sub vcl_deliver {
  # Don't send cache tags related headers to the client
  unset resp.http.url;
  # Comment the following line to send the "Cache-Tags" header to the client (e.g. to use CloudFlare cache tags)
  unset resp.http.Cache-Tags;
}

sub vcl_backend_response {
  # Ban lurker friendly header
  set beresp.http.url = bereq.url;

  # Add a grace in case the backend is down
  set beresp.grace = 1h;
}

Посоветуйте, пожалуйста, в чем может быть проблема с varni sh и как заставить его работать корректно?

1 Ответ

0 голосов

Проблема решилась следующим образом - параметры для запуска varni sh я взял от thomasmoreaumaster (https://github.com/api-platform/api-platform/issues/1367).

CMD ["varnishd", "-F", "-f", "/etc/varnish/default.vcl", "-p", "http_resp_hdr_len=128k", "-p", "http_resp_size=128k", "-p", "http_req_hdr_len=64k", "-p", "workspace_backend=256k", "-p", "workspace_client=256k", "-p", "http_max_hdr=256"]

Также в проксировании nginx api-platform удалила привязку каталога с помощью ssl и сформировала nginx -proxy с ssl, включенным через том.

Теперь varni sh работает хорошо. Спасибо за вашу помощь и поддержку.

...