【问题标题】:414 Request URI too long using Nginx Ingress on Kubernetes414 在 Kubernetes 上使用 Nginx Ingress 请求 URI 太长
【发布时间】:2019-11-27 03:54:10
【问题描述】:

我们将 kubernetes/ingress-nginx 用于我们的 Azure AKS 实例。我有一个大约 9kb 长的 URI(它包含一个 post_logout_redirect_uri 和一个非常长的 id_token_hint 用于我们的身份服务器,在 .Net core 2.2 中运行)。

但是,我无法通过入口,因为 nginx 拒绝使用 414 URI Too Long 的查询。我可以在 Nginx 日志中看到请求,但在身份服务器日志中看不到,所以很明显之前被退回了。

我尝试使用配置映射更新 nginx 配置,但没有成功。这些设置已应用(并且之前帮助我解决了其他问题)。但是,在这种情况下,我尝试的任何方法似乎都没有奏效。这是我正在使用的配置图:

apiVersion: v1
data:
  http2-max-header-size: "64k"
  http2-max-field-size: "32k"
  proxy-body-size: "100m"
  client-header-buffer-size: "64k"
  large-client-header-buffers: "4 64k"
kind: ConfigMap
metadata:
  name: nginx-ingress-controller
  namespace: kube-system

以下是身份服务器的入口注释:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: example-ingress-name
  annotations:
    kubernetes.io/ingress.class: nginx
    certmanager.k8s.io/cluster-issuer: letsencrypt
    nginx.ingress.kubernetes.io/send_timeout: "180"
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "180"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "180"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "180"
    nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/cors-allow-headers: "authorization,content-type"
    nginx.ingress.kubernetes.io/proxy-body-size: 250m
    nginx.ingress.kubernetes.io/proxy-buffer-size: "64k"

最后,如果我检查 pod 上的 nginx 配置,它确实包含我更新的值,在全局配置部分。

...
 keepalive_timeout  75s;
 keepalive_requests 100;

 client_body_temp_path           /tmp/client-body;
 fastcgi_temp_path               /tmp/fastcgi-temp;
 proxy_temp_path                 /tmp/proxy-temp;
 ajp_temp_path                   /tmp/ajp-temp;

 client_header_buffer_size       64k;
 client_header_timeout           60s;
 large_client_header_buffers     4 64k;
 client_body_buffer_size         8k;
 client_body_timeout             60s;

 http2_max_field_size            32k;
 http2_max_header_size           64k;
 http2_max_requests              1000;

 types_hash_max_size             2048;
 server_names_hash_max_size      1024;
 server_names_hash_bucket_size   64;
 map_hash_bucket_size            64;

 proxy_headers_hash_max_size     512;
 proxy_headers_hash_bucket_size  64;

 variables_hash_bucket_size      128;
 variables_hash_max_size         2048;

 underscores_in_headers          off;
 ignore_invalid_headers          on;
...

任何信息或建议将不胜感激,谢谢!

【问题讨论】:

  • 是的,这不是问题。 Chrome 可以支持 URL(不会太长)。这绝对是 nginx 方面的东西。哦,好吧,我们现在正在使用一种解决方法。
  • @TimTrewartha - 请分享用于它的解决方法。
  • @Karan 我不认为解决方法实际上是正确的词。我们基本上修改了我们的应用程序代码,使其不再需要这么长的 URI。所以基本上避免了这个问题,而不是任何实际的解决方案或解决方法。从那以后我也没有再看这个。祝你好运,如果你找到解决方案,请分享。
  • @TimTrewartha,你解决了这个问题吗?

标签: nginx kubernetes


【解决方案1】:

我还尝试了以下注释:

nginx.ingress.kubernetes.io/large_client_header_buffers: 200m
nginx.ingress.kubernetes.io/proxy-body-size: 200m

他们没有帮助,帮助的是我在 Ingress 控制器 yaml 中添加的 sn-p:

nginx.ingress.kubernetes.io/server-snippet: |
  http2_max_header_size 256k;
  http2_max_field_size 256k;

【讨论】:

    【解决方案2】:

    要解决此问题,请编辑您的 nginx.conf。打开终端或使用 ssh 客户端登录到远程服务器。输入以下命令,使用 vi 或 joe 或 nano 等文本编辑器编辑 nginx.conf:

    # vi /etc/nginx/nginx.conf
    

    使用 nano 文本编辑器:

    $ sudo nano /etc/nginx/nginx.conf
    

    必须以root身份运行:

    # vi /usr/local/nginx/conf/nginx.conf
    

    在http或server或location上下文中加入下面一行来增加nginx.conf中的大小限制,输入:

    # set client body size to 2M #
    client_max_body_size 2M;
    

    client_max_body_size 指令分配客户端请求的最大可接受正文大小,由请求标头中的 Content-Length 行指示。如果大小大于给定的大小,则客户端会收到错误“请求实体太大”(413)。 保存并关闭文件。重新加载nginx webserver,输入:

    # /usr/local/nginx/sbin/nginx -s reload
    

    使用 nginx 自己重新加载它:

    # /sbin/nginx -s reload
    

    对于 RHEL/CentOS/Debian/Ubuntu Linux,请尝试:

    # service nginx reload
    

    如果您使用的是基于 systemd 的系统运行:

    $ sudo systemctl reload nginx.service
    

    参考文献:

    【讨论】:

      猜你喜欢
      • 2019-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      相关资源
      最近更新 更多