访问 Elastic Beanstalk/Docker Nginx/PHP-FPM 实例中的客户端 IP

Posted

技术标签:

【中文标题】访问 Elastic Beanstalk/Docker Nginx/PHP-FPM 实例中的客户端 IP【英文标题】:Access Client IP within Elastic Beanstalk/Docker Nginx/PHP-FPM instance 【发布时间】:2018-03-04 02:35:36 【问题描述】:

为了让我之后的部署和开发人员更容易,我使用他们的 Docker 容器服务在 Elastic Beanstalk 实例上部署了我们的 REST API。

除了获取连接到 API 的客户端 IP 以及我迄今为止尝试的所有尝试都导致返回相同的 Docker 容器 IP 或 HTTP 499 错误消息之外,所有工作都很好。

Nginx 配置

server 

    listen 80;

    server_name api.zecofrontend.local
    index index.php index.html;

    root /var/www/public;

    location / 
        try_files $uri /index.php?$args;
    

    location ~ \.php$ 
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        # fastcgi_param REMOTE_ADDR $http_x_real_ip;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    

Docker 编写

version: '2'
services:
    web:
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./src:/var/www
            - ./vhost.local.conf:/etc/nginx/conf.d/site.conf
        links:
            - app
        depends_on:
            - app
    app:
        image: php7.1-fpm-base
        volumes:
            - ./src:/var/www

运行上述配置,返回一个 172.18.0.1 的 IP 地址,即它自己的 docker 容器/主机的 IP 地址。

我对本地和 Elastic Beanstalk 部署的实例有不同的配置,但唯一的区别与 SSL 证书有关。

有什么建议吗?

【问题讨论】:

你在你的 nginx http 部分缺少两个指令real_ip_header X-Forwarded-For;set_real_ip_from 0.0.0.0/0;,基本上你需要告诉 nginx 如何获取那个真实的 ip。我使用过0.0.0.0/0,但曾经可以使用发送请求的LB的IP 【参考方案1】:

AWS ELB 会自动为每个请求添加一些标头。查看http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/x-forwarded-headers.html#x-forwarded-for上的文档

在您的情况下,您需要使用 X-Forwarded-For,其中包含通过您的 ELB 访问网站的客户端的 IP。

【讨论】:

以上是关于访问 Elastic Beanstalk/Docker Nginx/PHP-FPM 实例中的客户端 IP的主要内容,如果未能解决你的问题,请参考以下文章

AWS Elastic Beanstalk:访问系统变量

Kibana:为访问 Kibana 添加 https - Elastic Stack 8.0

从 .ebextensions 配置文件访问 Elastic Beanstalk 环境属性

无法访问 Elastic Beanstalk IP 地址之一?

限制对 Elastic Beanstalk 的 HTTP 访问

elastic search 设置外网访问