nginx反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求然后将请求转发给内部网络上的服务器并将从服务器上得到的结果返回给internet上请求连接的客户端目标人群并将从服务器上得到的结果返回给internet上请求连接的客户端此时代理服务器对外就表现为一个服务器。
一、概念正向代理:实现客户端上网
反向代理:代理访问后端web服务器,
区别:正向代理的对象是客户端反向代理的对象是服务器端
二、示例server { listen 80; server_name ; location / { proxy_pass :80; proxy_set_header Host $host; #多级代理需要添加该配置 proxy_set_header X-Real-IP $remote_addr; #只有1级代理获取客户端真实ip proxy_set_header X-Forwarded-For $remote_addr; #多级代理获取客户端真实ip proxy_http_version 1.1; #这两个最好也设置,HTTP协议中对长连接的支持是从1.1版本之后才有的 proxy_set_header Connection ""; proxy_redirect off; proxy_connect_timeout 600; } location /forum/ { proxy_pass ; } #访问 代理服务器会把url资源替换成 对应192.168.1.52的资源路径 是/usr/share/nginx/html/bbs/test/index.html # 注意: 这里的proxy_pass结尾要有/ location ~* \.(jpg|png|gif)$ { proxy_pass ; } #注意: 如果是正则匹配 proxy_pass 的url结尾不能有/ 或者其他的后缀 } 三、常用指令proxy_set_header:可以更改或添加客户端的请求头部信息内容并转发之后端服务器 #常用如下: proxy_set_header Host $host; #添加HOST到报文头部其值为客户端的URL, proxy_set_header X-Real-IP $remote_addr; #把客户端ip地址赋值给变量X-Real-IP, X-Real-IP的值是字符串类型; 客户端可以是用户客户端或代理服务器 proxy_set_header X-Forwarded-For $remote_addr; # #把客户端ip地址赋值给变量X-Forwarded-For, X-Forwarded-For的值是一个列表,客户端可以是用户客户端或代理服务器 proxy_set_header Connection ""; proxy_connect_timeout :配置nginx服务器与后端服务器尝试建立连接的超时时间默认为60秒 proxy_http_version:用于设置nginx提供代理服务的HTTP协议的版本: proxy_redirect off;四、PHP获取客户端IP地址方式1、如果没有使用代理服务器
REMOTE_ADDR = 客户端IP HTTP_X_FORWARDED_FOR = 没数值或不显示 $ip = $_SERVER['REMOTE_ADDR']; REMOTE_ADDR = 最后一个代理服务器 IP2、使用透明代理
HTTP_X_FORWARDED_FOR = 客户端真实 IP (经过多个代理服务器时这个值类似:221.5.252.160 203.98.182.163 203.129.72.215)这类代理还会将客户真实ip发送到请求对象无法隐藏真实ip。
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];3、使用普通匿名代理服务器
REMOTE_ADDR = 最后一个代理服务器 IP HTTP_X_FORWARDED_FOR = 代理服务器 IP (经过多个代理服务器时这个值类似:203.98.182.163 203.98.182.163 203.129.72.215)这样就隐藏了客户端的真实ip但服务器会知道客户端是通过代理服务器去访问的。
4、使用欺骗性代理服务器
REMOTE_ADDR = 代理服务器 IP HTTP_X_FORWARDED_FOR = 随机的 IP(经过多个代理服务器时这个值类似:220.4.251.159 203.98.182.163 203.129.72.215)5、使用高匿名代理
REMOTE_ADDR = 代理服务器 IP HTTP_X_FORWARDED_FOR = 没数值或不显示使用这种代理时不同浏览器不同设备会返回不同的ip头信息因此PHP使用$_SERVER["REMOTE_ADDR"] 、$_SERVER["HTTP_X_FORWARDED_FOR"] 获取的值可能是空值也可能是“unknown”值。
PHP获取ip代码如下:
function get_real_ip() { //判断服务器是否允许$_SERVER if (isset($_SERVER)) { if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $realip = $_SERVER['HTTP_X_FORWARDED_FOR']; } elseif (isset($_SERVER['HTTP_X_REAL_IP'])) { $realip = $_SERVER['HTTP_X_REAL_IP']; } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) { $realip = $_SERVER['HTTP_CLIENT_IP']; } else { $realip = $_SERVER['REMOTE_ADDR']; } } else { //不允许就使用getenv获取 if (getenv("HTTP_X_FORWARDED_FOR")) { $realip = getenv("HTTP_X_FORWARDED_FOR"); } elseif (getenv("HTTP_X_REAL_IP")) { $realip = getenv("HTTP_X_REAL_IP"); } elseif (getenv("HTTP_CLIENT_IP")) { $realip = getenv("HTTP_CLIENT_IP"); } else { $realip = getenv("REMOTE_ADDR"); } } return $realip; }本文链接: