这篇文章上次修改于 2347 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
程序在进过nginx<nginx<apache这样的调度器后,无法获取客户端真实ip。
大家在开发过程中,如果需要获取用户的真实IP,需先判断X-FORWARDED-FOR是否存在,如果存在此header,则优先取这个值.获取逻辑大致如下:
(注意,经过多层代理后,X-Forwarded-For 字段可能包含多个IP,格式如下: X-Forwarded-For: clientIp, proxy1, proxy2 )
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip=$_SERVER['REMOTE_ADDR'];
}
解决办法:
在最靠近用户层的nginx上,设置一下header
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 $host;
解决办法:在最靠近应用程序后端的nginx上,通过以下header信息
proxy_pass_header X-Real-IP;
proxy_pass_header X-Forwarded-For;
real_ip_header X-Forwarded-For;
已有 2 条评论
我也用nginx 做了个二次反向代理,但是并发连300都过不了,单独测试后台的一个nginx并发可以很高,5000可以过4000多个,这不是问题,但是两台代理连起来测试时就在前一台proxy机器出现超时情况,不知道什么原因,
前端配置
server {
listen 81;
server_name 127.0.0.1;
location / {
proxy_pass http://10.0.0.2:81;
proxy_redirect default ;
proxy_set_header Host $host:81;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}后端配置
server {
listen 81;
server_name 10.0.0.2;
location / {
proxy_pass http://192.168.1.105:8000;
proxy_redirect default ;
proxy_set_header Host $host:81;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
就是这么简单的配置,并发量就过不了,是不是nginx本身的问题?配置文件怎么改都不起作用?
@二次反向代理性能很差,怎么优化的? 二次反向代理跟你应用程序得处理时间有关系吧?尤其是timeout相关参数。