api平台:错误(空)后端获取失败

时间:2020-05-08 14:12:45

标签: rest symfony api-platform.com

我们将symfony与docker中的平台api一起使用,我们遇到了清漆问题。

对于本地开发,清漆可以使用 default.vcl 配置文件(https://github.com/api-platform/api-platform/blob/master/api/docker/varnish/conf/default.vcl)。当上传到服务器时,清漆会显示错误“错误(空)后端获取失败”

在禁用清漆并使用 php-fpm 重定向到 nginx 时,api平台正常工作。

我将 http_resp_hdr_len 参数增加到 131072字节(128K),并将 http_rasp_size 增加到 10485760字节(10Mb) ,但无济于事,并且错误仍然存​​在。

docker命令启动清漆:

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 清漆

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;
}

请告知清漆可能是什么问题以及如何使其正常工作?

1 个答案:

答案 0 :(得分:1)

问题已解决如下-我从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的目录绑定,并形成了通过volume启用ssl的nginx-proxy。

现在清漆效果很好。 感谢您的帮助和支持。