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

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

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

Nginxconfiguration

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 

运行上面的configuration,返回一个172.18.0.1 IP地址,它是自己的docker container / host的IP地址。

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

有什么build议么?

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

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