EKS集群中Nginx Ingress Controller的WordPress大文件上传问题
我来帮你梳理下这个大文件上传失败的问题——核心问题应该出在Ingress注解的使用上,你混用了不同Nginx Ingress项目的配置注解,导致部分限制规则没有被正确识别生效。
1. 修正Ingress注解前缀
官方维护的Nginx Ingress Controller(就是你集群里用的这个)只识别nginx.ingress.kubernetes.io/前缀的注解,而你当前配置里用了nginx.org/(属于另一个Nginx Kubernetes Ingress项目)和旧版的ingress.kubernetes.io/前缀,这些注解不会被你的Ingress Controller解析,自然起不到限制作用。
比如你设置的nginx.org/client-max-body-size: "50m"其实完全没生效,正确的写法应该是nginx.ingress.kubernetes.io/proxy-body-size: "50m",而且你重复设置了这个参数,需要统一。
2. 修正后的Ingress配置
把所有注解替换为正确的前缀,调整后的配置如下:
apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/ssl-redirect: "true" nginx.ingress.kubernetes.io/force-ssl-redirect: "true" nginx.ingress.kubernetes.io/proxy-body-size: "50m" nginx.ingress.kubernetes.io/proxy-connect-timeout: "30s" nginx.ingress.kubernetes.io/proxy-read-timeout: "20s" name: wordpress namespace: test spec: rules: - host: test.mrcartr.nl http: paths: - backend: serviceName: wordpress-mrcartr servicePort: 80 path: /
3. 验证配置是否生效
修改Ingress后,你可以进入Nginx Controller的Pod,查看实际生成的Nginx配置文件,确认规则是否生效:
# 替换成你的Ingress Controller Pod名称 kubectl exec -it <nginx-ingress-controller-pod-name> -n ingress-nginx -- cat /etc/nginx/nginx.conf
在文件里搜索client_max_body_size,看是否已经设置为50m,同时检查proxy_connect_timeout等参数是否正确加载。
4. 额外排查点
- 查看POST请求日志:你当前提供的日志只有GET请求,上传文件是POST请求,建议过滤查看POST请求的日志,确认是否出现
413 Request Entity Too Large错误:kubectl logs <nginx-ingress-controller-pod-name> -n ingress-nginx | grep POST - ELB超时设置:虽然你跳过Ingress后正常,但ELB的空闲超时时间也可能影响大文件上传,建议将ELB的idle timeout设置为60秒以上,避免上传过程中连接被断开。
5. 全局配置补充(可选)
如果你想让所有Ingress都继承大文件上传限制,可以在nginx-configuration ConfigMap中添加全局设置:
kind: ConfigMap apiVersion: v1 metadata: name: nginx-configuration namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx data: use-proxy-protocol: "false" use-forwarded-headers: "true" proxy-body-size: "50m" # 添加全局代理体大小限制
注意:Ingress级别的注解优先级高于ConfigMap的全局设置。
内容的提问来源于stack exchange,提问作者Adriano S. Fonseca




