我对 nginx 设置非常陌生。我的 API 应用程序在由我的 AWS Elastic Beanstalk 环境自动创建的 EC2 实例中运行。该应用程序使用 Nginx,实例位于 ELB 负载均衡器(经典)后面。Route 53 域将流量路由到 ELB。
我用Postman或者Packet Sender往该域名发送数据包,但是一直收不到响应。查看nginx错误日志,发现客户端IP显示为10.0.2.63
,不是我电脑的IP地址。我的真实IP地址149.15x.1xx.2xx
。我猜10.0.2.63
是VPC的IP地址。下面是nginx错误日志。
while reading PROXY protocol, client: 10.0.2.63, server: 0.0.0.0:80
据我了解,由于客户端 IP 是 VPC IP 地址,EC2 实例无法将回复发送到真实的客户端 IP 地址(我的 PC 的 IP 地址),因此 Postmand 或 Packet Sender 收到空响应。
我理解正确吗?如何让 EC2 实例接收真实的客户端 IP 地址?如下所示:
while reading PROXY protocol, client: 149.15x.1xx.2xx, server: 0.0.0.0:80
我不知道这是 AWS ELB 设置的问题还是 nginx 设置的问题。
我的 EC2 实例中的 nginx 配置是:
files:
/etc/nginx/conf.d/proxy.conf:
content: |
client_max_body_size 500M;
server_names_hash_bucket_size 128;
upstream backend {
server unix:///var/run/puma/my_app.sock;
}
server {
listen 80 proxy_protocol;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
large_client_header_buffers 8 32k;
set_real_ip_from 10.0.0.0/8;
real_ip_header X-Forwarded-For;
location / {
proxy_http_version 1.1;
proxy_set_header X-Real-IP $proxy_protocol_addr;
proxy_set_header X-Forwarded-For $proxy_protocol_addr;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_buffers 8 32k;
proxy_buffer_size 64k;
proxy_pass http://backend;
proxy_redirect off;
# Enables WebSocket support
location /v1/cable {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade "websocket";
proxy_set_header Connection "Upgrade";
proxy_set_header X-Real-IP $proxy_protocol_addr;
proxy_set_header X-Forwarded-For $proxy_protocol_addr;
}
}
}
答案1
您可以从X-Forwarded-For 标头。 这AWS 博客文章为您提供 Apache 和 Nginx 日志的配置。以下是 Nginx
http {
...
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
}
我在 Nginx 服务器前面使用 CloudFlare。下面介绍如何将 CloudFlare IP 替换为实际客户端 IP。您需要将“CF-Connecting-IP”替换为“X-Forwarded-For”,并将 IP CIDR 替换为您的 VPC 的 CIDR。
set_real_ip_from 173.245.48.0/20;
real_ip_header CF-Connecting-IP;