nginx remote_addr
什么是nginx remote_addr
在使用Nginx过程中,remote_addr是指客户端的IP地址,也就是客户端的访问原地址。一般情况下,这个IP地址是客户端所在的网络中的IP地址,但在某些情况下,它也可能是其他的IP地址。
remote_addr和反向代理
在使用反向代理的场景中,remote_addr的表现形式就发生了变化。由于反向代理的存在,客户端通过代理服务器来访问服务器上的资源,这时remote_addr所示的IP地址可能不是客户端的真实IP地址,而是代理服务器的地址。为了解决这种情况,可以在Nginx配置文件中添加如下代码:
set_real_ip_from proxy_server_ip;real_ip_header X-Forwarded-For;
这样配置后,就可以通过X-Forwarded-For头信息从代理服务器中获取到客户端真实的IP地址了。
remote_addr记录日志
Nginx的access_log默认会记录每个访问请求的remote_addr,可以方便地帮助管理员分析每个请求的来源,以及对于拒绝访问或者限制访问的情况下,可以方便地区分是指定IP被拒绝还是其他原因。
access_log记录remote_addr的方法如下:
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 logs/access.log main;
remote_addr限制访问
当需要限制某个IP或者IP段的访问时,可以使用Nginx的limit_conn或者limit_req模块来进行限制。这些模块限制的对象是remote_addr,可以通过配置Nginx的server、location或http模块来实现访问限制。
以limit_conn模块为例,可以使用如下配置实现限制:
http { limit_conn_zone $binary_remote_addr zone=addr:10m; server { location / { limit_conn addr 10; } }}
这个配置会将每个remote_addr视为唯一的访问对象存入到名为addr的内存区域中,在每个location中使用limit_conn指令限制并发连接数量不超过10个。
remote_addr和CDN加速
在使用CDN加速服务的场景下,remote_addr可能不是直接来自客户端。在这种情况下,可以通过验证请求的X-Forwarded-For头信息来获取真正的客户端IP地址,另外还可以考虑使用HTTP_X_REAL_IP头信息获取真实客户端的IP地址,来解决remote_addr不准确的问题。
location / { set_real_ip_from 10.0.0.0/8; real_ip_header X-Forwarded-For; real_ip_recursive on; }
这个配置会设置从10.0.0.0/8网段内的任何代理服务器发送的请求都被视为正常请求,将X-Forwarded-For作为客户端IP地址读取,如果需要递归处理,则设置real_ip_recursive为on即可。