如何基于路径配置ingress-nginx的分块传输与负载大小?
针对Ingress-Nginx特定端点配置大请求与分块传输的方案
要实现仅对部分API端点开放大文件传输和分块传输,避免全局宽松配置带来的攻击风险,有两种直接可行的方案:
方案一:拆分Ingress资源(推荐,配置更清晰)
将需要特殊配置的路径单独创建为一个Ingress资源,仅为该Ingress添加宽松的传输配置;其余路径保留在原有Ingress中,使用默认的严格请求限制。
原有Ingress(严格配置,适用于大多数端点)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-frontend-strict # 不添加大请求相关注解,使用Nginx默认的proxy-body-size(通常为1m)和缓冲配置 spec: rules: - host: apply-ingress-hostname-patch-here http: paths: - path: /api/orgs/v1 pathType: Prefix backend: service: name: organisations port: number: 80 # 其他不需要特殊配置的路径都放在这里 # ... more paths follow
专属Ingress(宽松配置,仅针对需要大文件的端点)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-frontend-large-files annotations: nginx.ingress.kubernetes.io/proxy-body-size: 1g nginx.ingress.kubernetes.io/server-snippet: | chunked_transfer_encoding on; proxy_buffering off; proxy_request_buffering off; proxy_max_temp_file_size 0; spec: rules: - host: apply-ingress-hostname-patch-here http: paths: - path: /api/lines/v1 pathType: Prefix backend: service: name: linejsonfiles port: number: 80
说明:Ingress-Nginx会自动合并同一主机下的多个Ingress规则,路径匹配遵循最长前缀优先原则,确保规则生效顺序正确。
方案二:在单个Ingress中通过Location块精准配置
如果不想拆分Ingress,可以在全局Ingress的server-snippet中,通过Nginx的location块匹配特定路径,覆盖全局配置。全局保持严格限制,仅匹配到的路径启用宽松传输规则。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-frontend annotations: # 全局设置严格的请求体大小限制(默认1m,可按需调整) nginx.ingress.kubernetes.io/proxy-body-size: 1m nginx.ingress.kubernetes.io/server-snippet: | # 全局保持默认缓冲配置,兼顾内存友好性与大请求拦截 proxy_buffering on; proxy_request_buffering on; # 针对特定路径覆盖配置 location ~^/api/lines/v1 { # 允许大请求体 client_max_body_size 1g; # 启用分块传输,关闭缓冲 chunked_transfer_encoding on; proxy_buffering off; proxy_request_buffering off; proxy_max_temp_file_size 0; # 必须添加proxy_pass指令,保证请求能正确转发到后端服务 proxy_pass http://$service_name:$service_port; } spec: rules: - host: apply-ingress-hostname-patch-here http: paths: - path: /api/orgs/v1 pathType: Prefix backend: service: name: organisations port: number: 80 - path: /api/lines/v1 pathType: Prefix backend: service: name: linejsonfiles port: number: 80 # ... more paths follow
说明:
- 使用
~^/api/lines/v1正则匹配确保前缀路径的精准匹配; - 全局配置保持严格,仅目标路径启用宽松规则,有效缩小攻击面;
proxy_pass指令是必填项,否则Nginx无法完成请求转发。
内容的提问来源于stack exchange,提问作者Christian Fuchs
相关产品推荐
相关产品推荐

