Nginx代理后服务端使用remote_addr获取真实IP

Nginx是一个高性能的Web服务器和反向代理服务器,常用于前端服务器与应用服务器之间的通信。在使用Nginx进行代理时,我们常常需要获取客户端的真实IP地址。服务端获取客户端真实IP地址的常用方法是使用request的remote_addr属性,但是由于Nginx进行了代理,因此获取的IP地址可能并不是真实的,需要进行配置才能获取到真实IP地址。

## Nginx代理后获取真实IP的配置方法

### 第一步:在Nginx中配置real_ip_module模块

使用 real_ip_module 模块可以将客户端真实IP地址的信息传递给后端应用程序,以确保应用程序获取客户端真实IP地址。下面是使用 real_ip_module 模块的配置方法。

1. 在Nginx的配置文件中添加以下指令,启用 real_ip_module 模块:

```

load_module /usr/lib/nginx/modules/ngx_http_realip_module.so;

```

2. 在http或server或location配置块中添加以下指令,设置真实IP来源,如下:

```

http {

# 伪装的IP地址

set_real_ip_from 192.168.1.0/24;

# 将真实IP地址存入 X-Real-IP 头信息

real_ip_header X-Real-IP;

}

```

其中 set_real_ip_from 指令指定允许转换成真实IP地址的IP地址段。如果不需要限制IP地址段,可以配置为0.0.0.0/0,允许全部IP地址段。real_ip_header 指令指定真实IP地址的来源头信息,需要根据实际情况进行配置。

### 第二步:在后端应用程序中获取真实IP地址

配置完Nginx后,需要在后端应用程序中获取客户端真实IP地址。在许多Web框架中,使用 request.remote_addr 属性获取客户端IP地址。

比如在Flask中,可以使用如下方法获取客户端真实IP地址:

```

from flask import request

@app.route('/')

def index():

# 获取客户端真实IP地址

real_ip = request.headers.get('X-Real-IP', default=request.remote_addr)

return "The real IP address is %s" % real_ip

```

在其他Web框架中也可以采用类似的方法获取真实IP地址。

## Nginx代理后获取真实IP的案例说明

下面以Nginx作为反向代理服务器,Flask作为后端Web框架,演示获取客户端真实IP地址的过程。

### 第一步:在Nginx中启用real_ip_module模块

nginx.conf文件配置:

```

user nginx;

worker_processes auto;

error_log /var/log/nginx/error.log warn;

pid /var/run/nginx.pid;

load_module /usr/lib/nginx/modules/ngx_http_realip_module.so;

events {

worker_connections 1024;

}

http {

include /etc/nginx/mime.types;

default_type application/octet-stream;

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;

# 配置 real_ip_module 模块

set_real_ip_from 192.168.1.0/24;

real_ip_header X-Real-IP;

upstream backend {

server 127.0.0.1:5000;

}

server {

listen 80;

server_name example.com;

location / {

proxy_pass http://backend;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

}

}

}

```

### 第二步:在Flask中获取真实IP地址

Flask代码:

```

from flask import Flask, request

app = Flask(__name__)

@app.route('/')

def index():

real_ip = request.headers.get('X-Real-IP', default=request.remote_addr)

return "The real IP address is %s" % real_ip

if __name__ == '__main__':

app.run()

```

启动Flask服务器:

```

$ export FLASK_APP=app.py

$ flask run --host=127.0.0.1 --port=5000

```

### 第三步:测试获取真实IP地址的结果

使用curl模拟客户端访问:

```

$ curl http://example.com/

```

返回结果:

```

The real IP address is 192.168.1.10

```

可以看到,Flask成功获取了客户端的真实IP地址。

## 总结

使用Nginx进行代理时,获取客户端真实IP地址需要进行特定的配置。Nginx可以使用 real_ip_module 模块将客户端真实IP地址的信息传递给后端应用程序,以确保应用程序获取客户端真实IP地址。同时,在后端应用程序中也需要根据实际情况进行获取真实IP地址的方法,以便正确获取客户端真实IP地址。

壹涵网络我们是一家专注于网站建设、企业营销、网站关键词排名、AI内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。

我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!

点赞(46) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部