在Kubernetes Ingress Nginx服务器片段中使用位置块会导致404

时间:2018-10-30 23:45:21

标签: nginx kubernetes kubernetes-ingress

我希望有人可以在这里帮助我,因为我被困住了。

我正在从传统的nginx / node服务器配置转移到我们的nginx配置,其中nginx和node服务器都在同一台机器上。

在Kubernetes中,入口控制器(nginx)显然位于另一个容器中。

我遇到的困难是重新实施我们的规则,该规则禁止使用位置块对图像和资产进行访问日志记录。

我们的配置类似于

location ~* \.(?:jpg|jpeg|gif|png|ico|cur|mp4|ogg|ogv|webm|htc)$ {
  access_log off;
  expires 2M;
  add_header Cache-Control "public, max-age=5184000"; # 5184000 is 60 days
}

当我在server-snippet中实现相同的块时,它会匹配,但是所有资产都会抛出404。

我做了一次谷歌搜索,发现了一个答案,可以在这里https://stackoverflow.com/a/52711388/573616

进行解释。

,但是建议的答案提示使用if块而不是location块,因为该位置会干扰上游的代理,但是,无法从{{1}内部禁用访问日志}块,仅来自if上下文。

其余的入口看起来像(其他所有设置都是默认的)

location

图像位于上游服务器路径上的/ images/。

所以我要重新尝试如何使这些位置块起作用,以便实际上可以从real_ip_header X-Forwarded-For; real_ip_recursive on; underscores_in_headers on; gzip_types text/css application/x-javascript application/javascript application/json image/svg+xml; client_max_body_size 5M; proxy_buffers 8 16k; proxy_set_header X-Request-Start "t=${msec}"; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_redirect off; 禁用这些图像的访问日志

那么有人能告诉我如何获取上面的位置块,以免在入口控制器中为资产抛出404吗?

1 个答案:

答案 0 :(得分:2)

我假设您的后端正在服务您的资产,所以我认为问题在于您的location {}块没有像nginx入口中定义的常规路径那样具有上游。

nginx-ingress-controller的nginx.conf中有很多lua代码,因此可能需要一些时间来理解,但是您可以在本地复制nginx.conf

$ kubectl cp nginx-ingress-controller-xxxxxxxxx-xxxxx:nginx.conf .

检查为当前服务定义的location {}块,然后将其复制到server-snippet location {}块的底部,如下所示:

我相信这样的server-snippet可以做到:

location ~* \.(?:jpg|jpeg|gif|png|ico|cur|mp4|ogg|ogv|webm|htc)$ {
  access_log off;
  expires 2M;
  add_header Cache-Control "public, max-age=5184000"; # 5184000 is 60 days
  <== add what you copied here
  set $namespace      "k8s-namespace";
  set $ingress_name   "ingress-name";
  set $service_name   "service-name";
  set $service_port   "80";
  set $location_path  "/images";
  ...
  ...
  ...
  proxy_http_version                      1.1;

  proxy_cookie_domain                     off;
  proxy_cookie_path                       off;

  # In case of errors try the next upstream server before returning an error
  proxy_next_upstream                     error timeout;
  proxy_next_upstream_tries               3;

  proxy_pass http://upstream_balancer;

  proxy_redirect                          off;
}