414在Kubernetes上使用Nginx入口请求URI太长

时间:2019-07-18 08:56:00

标签: nginx kubernetes

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

但是,由于nginx拒绝了414 URI Too Long的查询,因此我无法越过入口。我可以在Nginx日志中看到该请求,但不能在Identity Server日志中看到该请求,因此该请求以前显然已经退回。

我尝试使用配置映射更新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;
...

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

1 个答案:

答案 0 :(得分:-1)

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

# vi /etc/nginx/nginx.conf

使用纳米文本编辑器:

$ sudo nano /etc/nginx/nginx.conf

必须以root身份运行:

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

将以下行添加到http或服务器或位置上下文中,以增加nginx.conf中的大小限制,输入:

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

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

# /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

参考文献: