Nginx反向代理本地Docker正常,部署至K8S后报404问题排查咨询
首先明确:第三方站点(google.com.hk)导致问题的概率极低——毕竟你本地Docker环境用同一个镜像能正常工作,说明核心配置逻辑是对的。问题更可能出在K8S集群的网络、路由转发或配置部署细节上,建议按以下步骤排查:
你的Nginx配置片段:
location /cs/outsession/products/ { proxy_buffers 16 4k; proxy_buffer_size 2k; proxy_http_version 1.1; proxy_pass 'https://www.google.com.hk/'; }
第一步:验证Pod内的网络连通性
先确认Nginx Pod能不能正常访问后端站点。进入Pod执行curl命令,查看完整的请求响应过程:kubectl exec -it <你的Nginx Pod名称> -- curl -v https://www.google.com.hk如果这一步返回正常的页面内容,说明Pod到后端的网络通路没问题;如果出现超时、无法解析或403/404,那大概率是K8S集群的出站网络受限(比如防火墙规则、集群代理配置)或DNS解析失败。
第二步:检查Nginx日志定位404来源
查看Nginx的访问日志和错误日志,明确404是Nginx自身返回的,还是后端站点返回的:kubectl logs <你的Nginx Pod名称>日志里如果看到类似
upstream response 404的记录,说明后端确实返回了404(这时候要检查转发的URL是否正确);如果没有上游响应记录,而是Nginx直接返回404,可能是路径匹配问题或K8S的Ingress/Service没有正确把请求转发到Nginx。第三步:测试Pod内部的请求转发
在Nginx Pod内部,直接访问自身的服务,验证配置是否生效:kubectl exec -it <你的Nginx Pod名称> -- curl -v http://localhost/cs/outsession/products/如果这里能正常返回google的页面,说明Nginx配置在Pod内部是正常的,问题出在K8S的Ingress或Service层;如果这里也返回404,那要检查Pod里的Nginx配置是否和本地完全一致(比如ConfigMap挂载是否正确、镜像构建时有没有漏掉配置文件)。
第四步:检查Ingress/Service配置(如果使用了Ingress)
如果是通过Ingress暴露Nginx服务,要确认:- Ingress的
path是否和你Nginx配置的location路径匹配(比如是不是/cs/outsession/products/) pathType设置是否合理(比如用Prefix而不是Exact,避免路径匹配过严)- Ingress的
backend是否正确指向了Nginx的Service,Service的端口是否和Nginx监听的端口一致
- Ingress的
第五步:验证DNS解析
在Nginx Pod里测试后端站点的DNS解析,确认能拿到正确的IP:kubectl exec -it <你的Nginx Pod名称> -- nslookup www.google.com.hk如果解析失败,说明K8S集群的DNS配置有问题,导致Nginx无法找到后端服务器的地址。
内容的提问来源于stack exchange,提问作者benone

