这里要使用的是proxy_protocol,具体做法如下:
1.先要确保nginx支持Real‑IP modules
执行命令:
nginx -V 2>&1 | grep -- 'stream_realip_module' nginx -V 2>&1 | grep -- 'http_realip_module'
有说明支持,默认新版本的都支持。主要是http_realip_module 模块支持就行
2.代理服务器
stream { proxy_connect_timeout 300s; proxy_timeout 300s; #端口转发 server { listen 1.1.1.1:80; proxy_pass 2.2.2.2:80; proxy_protocol on; } server { listen 1.1.1.1:443; proxy_pass 2.2.2.2:444; proxy_protocol on; } log_format tcp_format '$time_local|$proxy_protocol_addr|$remote_addr|$protocol|$status|$bytes_sent|$bytes_received|$session_time|$upstream_addr|$upstream_bytes_sent|$upstream_bytes_received|$upstream_connect_time'; access_log /www/wwwlogs/tcp-access.log tcp_format; error_log /www/wwwlogs/tcp-error.log }
开启proxy_protocol,加参数
proxy_protocol on;
3.源站服务器
listen 80 proxy_protocol; listen 444 ssl proxy_protocol; set_real_ip_from 2.2.2.2; real_ip_header proxy_protocol; # 替换remote_addr
这样web日志remote_addr就可以获取客户端真实IP
注意源站不能使用443端口,否则会被入侵检测系统判断没有携带SNI而拒绝。如果源站只有一个网站,或者源站全部要转发,可以用443。
总结:
这里有一个坑,要使用Proxy protocol,就需要两个角色sender和receiver,服务端与接收端之间建立连接后,会先发送一个带有客户信息的tcp header,因为更改了tcp协议,所以接收端也需要支持Proxy protocol,否则不能识别tcp header,导致无法成功建立连接,访问就会出现连接重置的现象。而对于Nginx来说,listen配置中的proxy_protocol是针对监听端口生效的,所以虽然是在server的listen中配置,但实际上对于端口来说算是全局配置。
意思是如果配置了listen 80 proxy_protocol ,那么其他server中的配置的80端口都将受影响,所有请求都会转到proxy_protocol,但浏览器一般是不支持proxy_protocol的,所以会导致其他站点都将无法访问。
所以对于同一个Nginx服务端,如果有部分server需要代理协议,部分server不需要代理协议。他们所监听的端口一定要分开,例如:
listen 80;
listen 81 proxy_protocol;
代理服务器配置proxy_pass 2.2.2.2:81;通过转发81来读取数据,这样就把需要代理和不需要代理的区分开。
宝塔面板网站开启CDN后如何获取真实IP地址,nginx宝塔面板网站获取真实ip
nginx使用realip模块获取客户端真实ip,nginx绕过cdn获取真实ip
» 本文链接地址:https://blog.mydns.vip/4851.html
最新评论
我的站目前每天120个IP,其中刷的是100个。 不知道为什么升级到4H8G5M的标准服务器还是偶尔会崩,CPU占满,但是内存一般这种时候只占50%左右,这是为什么呢?max_children我也设
麻烦发下检测工具
让我下载