访问 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的主要内容,如果未能解决你的问题,请参考以下文章
Kibana:为访问 Kibana 添加 https - Elastic Stack 8.0
从 .ebextensions 配置文件访问 Elastic Beanstalk 环境属性
无法访问 Elastic Beanstalk IP 地址之一?