【问题标题】:Getting client IP with Azure CLI - Dockerised nginx+Flask+Gunicorn使用 Azure CLI 获取客户端 IP - Dockerised nginx+Flask+Gunicorn
【发布时间】:2019-02-20 15:12:43
【问题描述】:

我在 azure 云上成功配置了两个图像多容器实例,但在我的 nginx 访问日志中,我只检索了我认为是内部 IP (10.240.xxx.xx) 的内容。在为 nginx 实现了真正的 IP 包之后,这已经发生了。

我的猜测是容器实例隐藏在专用于特定池的公共负载均衡器后面。

我通过命令实例化容器实例:

az container create

这里是我的默认nginx配置:

user  nginx;
worker_processes  1;

error_log  /preferred/path/nginx_error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format main '$proxy_add_x_forwarded_for - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent"' ;

    access_log /preferred/path/nginx_access.log main;

    sendfile        on;

    keepalive_timeout  65;

    include /etc/nginx/conf.d/*.conf;
}
daemon off;

这里是我的站点配置:

server {    
    listen 80;

    set_real_ip_from xxx.xx.xxx.x/xx;

    real_ip_header X-Forwarded-For;
    real_ip_recursive on;

    location / {        
        try_files $uri @proxy_to_app;
    }
    location @proxy_to_app {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;

        proxy_redirect off;
        proxy_pass http://localhost:5000;
    }
}

我从 cloudfare 帖子中设置了真实 IP。到目前为止,它似乎是最可靠和最新的。

有谁知道到底发生了什么?是否有可能通过任何其他标头获取真实的客户端 IP? 也有可能是我设置真实IP的方式有问题,但是我在网上找到的所有文档都让我很困惑。

【问题讨论】:

  • 你用什么服务来运行它?
  • 你到底是什么意思?正如我所写,我使用容器实例,如果这回答了您的问题。
  • 不清楚你的设置是什么,你能分享你正在使用的CLI代码吗?你在使用 Azure 容器实例吗?是这样的吗? azure.microsoft.com/en-us/blog/…
  • 我修改了帖子。我使用一个普通的容器实例。

标签: python azure docker nginx


【解决方案1】:

嗯,你可以通过Azure Container Instances and container orchestrators快速了解Azure Container Instance。

就像Docker一样,容器有IP,主机有IP,也会有公网IP帮助容器连接互联网。虽然容器实例的底层基础架构由 Azure 管理,但您可以知道并且只需要知道要连接的容器实例的公共 IP。

您可以从 CLI 命令中看到的所有内容都显示在 Azure Container Instance Template 中。对于 IP,只有公共 IP 可以显示给您。

【讨论】:

  • 我认为是有误会。重点是我通过 NGINX 从暴露端口收到的 IP 地址。 NGINX 与应用程序一起容器化,成为一个多容器实例,因此它们共享同一主机,然后可以通过 localhost 进行通信。
  • @Neo 好吧,你说的真实 IP 是什么意思?容器组内的应用容器?
  • 我想检索从实例外部收到的请求的 IP。正如我所写,我收到的总是相同的,要么是 NGINX 本身的 IP(然后我在配置上做错了),要么是与云相关的东西。
  • @Neo 您看到的IP是我认为的主机IP。而来自容器组外部的流量只是访问容器组的公共 IP。然后会路由到主机IP。这样您就可以看到IP没有改变。
  • 让我重新定义所有内容,我想要的是试图访问反向代理的人的 IP。我已经知道实例本身的 IP。
【解决方案2】:

结果表明,azure 生成的任何 CI(容器实例)都是更大 kubernetes 集群的一部分。然后由于CI过程中自动生成的服务中的设置,导致无法访问真实的客户端IP。 确实可以将行为复现到自己的kubernetes集群中,通过下面的回答How to get client IP address from inside a Azure Kubernetes with a LoadBalancer service得到源IP

【讨论】:

    猜你喜欢
    • 2017-10-02
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多