Nginx 在GCE中运行Kubernetes LoadBalancer服务的PHP应用程序中获取访问者的真实IP

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

我在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 simple php/nginx container
    ports:
        - port: 80
          targetPort: 80
X-Forwarded-For
标题等怎么可能没有传递到我的php应用程序?我只返回源ip(在php
REMOTE\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)。看我对这个主题的编辑,我发现了一些奇怪的东西。