Nginx 在GCE中运行Kubernetes LoadBalancer服务的PHP应用程序中获取访问者的真实IP
我在PHP应用程序中获取访问者的真实IP时遇到问题。我让Kubernetes在Google容器引擎中运行(master:1.4.8,node:1.4.7) 服务定义:Nginx 在GCE中运行Kubernetes LoadBalancer服务的PHP应用程序中获取访问者的真实IP,nginx,kubernetes,google-kubernetes-engine,Nginx,Kubernetes,Google Kubernetes Engine,我在PHP应用程序中获取访问者的真实IP时遇到问题。我让Kubernetes在Google容器引擎中运行(master:1.4.8,node:1.4.7) 服务定义: apiVersion: v1 kind: Service metadata: name: app-service spec: type: LoadBalancer # spawning google loadbalancer selector: name: app # running sim
apiVersion: v1
kind: Service
metadata:
name: app-service
spec:
type: LoadBalancer # spawning google loadbalancer
selector:
name: app # running simple php/nginx container
ports:
- port: 80
targetPort: 80
X-Forwarded-For
标题等怎么可能没有传递到我的php应用程序?我只返回源ip(在phpREMOTE\u ADDR
),即10.0.1.1
。在谷歌云中,我可以看到该服务正在使用第4层负载均衡器。这可能是真正的源ip丢失和X-Forwarded-For
头从未设置的问题吗
如果有人能告诉我发生了什么,那将非常有帮助
为了实现其价值,我在我的应用程序容器中使用了以下nginx配置:
location ~ \.php$ {
fastcgi_pass php-upstream;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
}
编辑
我已经将我的整个应用程序放在CloudFlare后面,所以现在它指向CloudFlare http proxy->GCE负载平衡器。不知怎的,X-Forwarded-For
头文件和所有文件都出现了!对我来说,问题似乎出在GCE负载平衡器上,它不知何故无法设置这些头?一个新功能是:
由于实现了此功能,在目标容器中看到的会话的源IP将不是客户端的原始源IP。这是Kubernetes v1.5版的默认行为。但是,从v1.5开始,添加了一个可选的beta特性,该特性将为GCE/GKE环境保留客户端源IP。此功能将在后续版本中分阶段用于其他云提供商
更多详细信息可归结为为为loadbalancer
类型的服务添加注释:
$ kubectl annotate service loadbalancer service.beta.kubernetes.io/external-traffic=OnlyLocal
这将在节点上打开healthcheck端口,以验证节点上是否有可用的服务端点
有关如何将此问题推广到其他集群的更多详细信息,请参见问题跟踪功能
注意:问题类似于谢谢您的回答。虽然我对真正的源IP不太感兴趣。我只需要负载平衡器/反向代理设置正确的
X-Forwarded-For
头(使用源/用户ip)。看我对这个主题的编辑,我发现了一些奇怪的东西。