在使用Nginx做方向代理时,仅做下面的配置,如果在被代理的服务中有访问日志记录的操作,就会发现发现源ip地址全为127.0.0.1,源域名为localhost,全部都是本机。这完全失去了记录日志的意义,严重可能会造成安全隐患无法排查的后果。
原因就在于在进行反向代理没有将请求头中的ip和主机地址等信息一起转发。
location / {
proxy_pass http://your_backend_server;
}
解决办法
在Nginx配置文件中加入如下配置,这样就可以获取请求主机的真实信息了。
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
:此行设置代理请求中的Host
头,将其值设为$host
变量的值。Host
头通常包含目标服务器的域名。proxy_set_header X-Real-IP $remote_addr;
:此行设置代理请求中的X-Real-IP
头,将其值设为客户端的真实 IP 地址,通过$remote_addr
变量获取。proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
:此行设置代理请求中的X-Forwarded-For
头,将其值设为包含客户端真实 IP 地址的字符串。这是通过$proxy_add_x_forwarded_for
变量实现的,它会追加当前请求的来源 IP 地址到已有的X-Forwarded-For
头中。
全局配置
全局配置在http中,对于所有server模块都生效
http {
# 全局配置
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 其他 http 配置...
server {
listen 80;
server_name your_domain.com;
location / {
proxy_pass http://your_backend_server;
# 这里不需要再次设置 proxy_set_header,因为它在 http 配置块中已经设置过
# 其他代理配置...
}
# 其他服务器块或配置...
}
}
局部配置
只对相应配置的server或location模块生效
server {
listen 80;
server_name your_domain.com;
location / {
proxy_pass http://your_backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 其他代理配置...
}
# 其他服务器块或配置...
}