nginx反向代理获取真实ip的方法与配置


在使用Nginx作为反向代理时,由于请求首先经过Nginx,然后再转发到后端应用,因此后端应用接收到的请求头中的IP地址是Nginx的IP地址,而不是原始客户端的IP地址。为了获取真实的客户端IP地址,我们需要对Nginx进行特定的配置。

1. 使用`X-Real-IP`和`X-Forwarded-For`头:

当Nginx作为反向代理时,它会添加两个头到请求中:`X-Real-IP`和`X-Forwarded-For`。`X-Real-IP`包含了原始客户端的IP地址,而`X-Forwarded-For`包含了经过的所有代理的IP地址。

你可以在后端应用中读取这两个头来获取真实IP。例如,在PHP中,你可以使用`$_SERVER['HTTP_X_REAL_IP']`和`$_SERVER['HTTP_X_FORWARDED_FOR']`来获取。

在Nginx的配置中,你可以这样设置:

nginx

server {

listen 80;

server_name example.com;

location / {

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass http://backend_server;

}

}

2. 使用`proxy_protocol`:

`proxy_protocol`是一个由Nginx支持的协议,它允许Nginx和后端应用之间直接传递原始客户端的IP地址。使用这种方法,后端应用不需要读取任何头,因为它直接从协议中读取IP地址。

要在Nginx中启用`proxy_protocol`,你需要确保你的后端应用也支持这个协议。

Nginx配置示例:

nginx

server {

listen 80 proxy_protocol;

server_name example.com;

location / {

proxy_protocol on;

proxy_pass http://backend_server;

}

}

3. 使用`trusted_proxy`模块:

如果你的Nginx版本支持`trusted_proxy`模块,你可以使用它来指定一组可信任的代理服务器。这样,Nginx会信任这些代理,并自动将客户端IP地址从`X-Real-IP`或`X-Forwarded-For`头中读取。

nginx

server {

listen 80;

server_name example.com;

set_real_ip_from 192.168.1.0/24; 信任的代理IP范围

real_ip_header X-Real-IP;

location / {

proxy_pass http://backend_server;

}

}

注意:

在使用`X-Forwarded-For`头时,需要注意它可能包含多个IP地址,因为请求可能经过多个代理。你应该使用`X-Real-IP`头来获取原始客户端的IP地址。

当使用`proxy_protocol`时,确保你的后端应用也支持这个协议,否则它无法正常工作。

使用`trusted_proxy`模块时,确保只信任你控制的代理服务器,以防止IP地址被。

选择哪种方法取决于你的具体需求和你的后端应用的特性。如果你需要获取真实IP地址,最好在Nginx和后端应用之间使用一种可靠的机制来传递这个信息。