现在我有二台服务器,一台192.168.1.6(WIN2008,NGINX),一台192.168.1.225(CENTOS7, NGINX)
外网地址 blog.niunan.net 访问到 192.168.1.6上,nginx做转发:
server
{
listen 80;#监听端口
server_name blog.niunan.net;#域名
location / {
proxy_redirect off;
proxy_set_header Host $host;#访问后端服务器的地址
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #告知后端服务器的访问来源
proxy_pass http://192.168.1.225/;#转发到哪里去
}
access_log logs/niunantest.log;
}
然后在192.168.1.225上的nginx再转一次:
server {
listen 80;
location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
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 X-Forwarded-Host $remote_addr;
proxy_cache_bypass $http_upgrade;
}
access_log logs/niunantest.log;
}
为什么我程序中取到的IP地址还是192.168.1.6呢?
使用wireshark抓包看看proxy_set_header 设置上头信息了吗
@牛腩: 最后不管了,把中间那一层去掉,然后就可以读到了。。
blog.niunan.net → 192.168.1.6:80 → 192.168.1.225:80 → 192.168.1.225:5000
我只接从.1.6:80 转向到 .1.225:5000, 然后就可以找到相应的IP地址了。
你是通过类似下面的代码获取IP地址的吗?
public static class HttpContextExtensions { public static string GetUserIp(this HttpContext context) { var ip = context.Request.Headers["X-Forwarded-For"].FirstOrDefault(); if (string.IsNullOrEmpty(ip)) { ip = context.Connection.RemoteIpAddress.ToString(); } return ip; } }
是的,几种取IP的方法我都试过了,都是只取到192.168.1.6,
下面是我的CORE代码:
我也试着把header都打印出来,结果还是发现全部是192.168.1.6
@牛腩: 在第2台nginx的配置似乎有问题
proxy_set_header X-Real-IP $remote_addr;
这里应该从第1台发过来的X-Real-IP请求头中获取,而不是从$remote_addr中获取。
@dudu: 改成$http_x_real_ip;了好像也不行呢?已经 nginx -s reload了