请选择 进入手机版 | 继续访问电脑版

kangle软件 是一款高性能跨平台web服务器

 找回密码
 注册
kangle web软件将启用新域名 kangleweb.com 作为kangle软件官方网站网址
kangle web服务器最新版下载
kangle访问控制模块介绍 -  kangle设置优化原则
kangle中文帮助手册 -产品购买
easypanel 虚拟主机控制面板最新版
easypanel虚拟主机控制面板功能列表
easypanel中文帮助手册 - 讨论
   kangle虚拟主机管理下载 - 安装 - 帮助手册
    
   销售: 在线客服QQ   技术支持: 在线客服QQ
    kangle web (介绍, 功能特性, 运行环境, 安装说明, 常见问题, 使用教程)     easypanel主机控制面板 (介绍, 功能特性, 安装说明, 常见问题, 使用教程)
    vhms系统 (介绍, 安装说明, 常见问题, 使用教程)     [kangle软件交流QQ群:104434948]
查看: 7512|回复: 9

kangle在多层CDN下获取真实IP的正确解决方案,附DZX2.5的代码!

[复制链接]
发表于 2013-3-28 18:13:39 | 显示全部楼层 |阅读模式
本帖最后由 pop 于 2013-10-5 23:28 编辑

点击如下网址享受购买阿里云服务器95折优惠!!
http://www.aliyun.com/cps/rebate?from_uid=BabReKcQRWQ=



注意:本案例有一定特殊性:
  1. 该网站是某地最大的地方站,租用的是阿里云的服务器:
  2. 具体方案为前端4台服务器做前端负载均衡CDN服务器,由于阿里云5M以上的带宽非常贵,使用阿里云的SLB均衡负载,可以免费合并4台CDN服务器的带宽并轮询,末端为真正的服务器,数据库用的是阿里云的RDS关系数据库。
复制代码
首先给大家看下本次网站的网络结构,画的比较简单。
在使用教程http://www.kanglesoft.com/thread-8124-1-1.html

遇到了如下问题:
阿里云架构.jpg
在经过查阅多方面国内外资料得知,上述教程的方案对本次案例完全是反教程,建议大家绕过。正确的做法是

在阿里云的SLB均衡负载中开启获取真实访问IP,CDN服务器层无需设置,在网站服务器里设置如下

请求控制,插入,匹配模块选择scrs,输入你CDN服务器的IP以|符号为间隔,在标记模块选择reaplace_ip中输入X-Forwarded-For

QQ截图20130328181221.jpg

本次问题解决!

但是IP获取后会是如下格式,真实IP,SLB的IP或者CDN的IP(如真实IP是1.1.1.1,SLBIP为2.2.2.2,那么会是 1.1.1.1,2.2.2.2 )

所以程序中需要做相应修改
以discuz x 2.5为例
找到
\source\class\discuz\discuz_application.php
中的352行
  1. private function _get_client_ip() {
  2.                 $ip = $_SERVER['REMOTE_ADDR'];
  3.                 if (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
  4.                         $ip = $_SERVER['HTTP_CLIENT_IP'];
  5.                 } elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {
  6.                         foreach ($matches[0] AS $xip) {
  7.                                 if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) {
  8.                                         $ip = $xip;
  9.                                         break;
  10.                                 }
  11.                         }
  12.                 }
  13.                 return $ip;
  14.         }
复制代码
替换为
  1. private function _get_client_ip() {
  2.                 $ip = $_SERVER['REMOTE_ADDR'];
  3.                 if (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
  4.                         $ip = $_SERVER['HTTP_CLIENT_IP'];
  5.                 } elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {
  6.                         foreach ($matches[0] AS $xip) {
  7.                                 if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) {
  8.                                         $ip = $xip;
  9.                                         break;
  10.                                 }
  11.                         }
  12.                 }


  13.                 $ip=str_replace(",CDN IP1号", "", "$ip");
  14.                 $ip=str_replace(",CDN IP2号", "", "$ip");
  15.                 $ip=str_replace(",CDN IP3号", "", "$ip");
  16.                 $ip=str_replace(",CDN IP4号", "", "$ip");
  17.                 $ip=str_replace(",SLB IP", "", "$ip");


  18.                 return $ip;
  19.         }
复制代码
2013年10月5日 23:27:41 新用的正则过滤,因为阿里云的前端IP老变化
  1. private function _get_client_ip() {
  2.                 $ip = $_SERVER['REMOTE_ADDR'];
  3.                 if (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
  4.                         $ip = $_SERVER['HTTP_CLIENT_IP'];
  5.                 } elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {
  6.                         foreach ($matches[0] AS $xip) {
  7.                                 if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) {
  8.                                         $ip = $xip;
  9.                                         break;
  10.                                 }
  11.                         }
  12.                 }


  13. $ip=preg_replace("/,10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/","",$ip);


  14.                 return $ip;
  15.         }
复制代码
注意,上述代码中的CDN IP1号等 需要替换成你对应机器的内网IP(针对阿里云,其他的需要测试一下)

本次教程结束!

点击如下网址享受购买阿里云服务器95折优惠!!
http://www.aliyun.com/cps/rebate?from_uid=BabReKcQRWQ=




回复

使用道具 举报

发表于 2013-4-5 05:25:29 | 显示全部楼层
阿里云是VPS?我记得是虚拟主机吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-6 18:38:48 | 显示全部楼层
小樱 发表于 2013-4-5 05:25
阿里云是VPS?我记得是虚拟主机吧

云主机,跟VPS差不多道理,所谓的云主机就是服务器群集上的VPS。。。
回复 支持 反对

使用道具 举报

发表于 2013-4-6 23:34:14 | 显示全部楼层
pop 发表于 2013-4-6 18:38
云主机,跟VPS差不多道理,所谓的云主机就是服务器群集上的VPS。。。

哦,就是VPS上开的虚拟主机啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-28 00:23:27 | 显示全部楼层
小樱 发表于 2013-4-6 23:34
哦,就是VPS上开的虚拟主机啊

你要理解什么是云,云就是很多服务器联合起来处理数据,云主机就是这么多联合起来的服务器中虚拟的VPS。

传统的VPS是在单台服务器上虚拟的!
回复 支持 反对

使用道具 举报

发表于 2013-4-28 22:14:45 | 显示全部楼层
pop 发表于 2013-4-28 00:23
你要理解什么是云,云就是很多服务器联合起来处理数据,云主机就是这么多联合起来的服务器中虚拟的VPS。
...

你直接说CDN节点不就好了么
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-2 23:22:51 | 显示全部楼层
小樱 发表于 2013-4-28 22:14
你直接说CDN节点不就好了么

完全两码事。。。
回复 支持 反对

使用道具 举报

发表于 2013-5-17 01:14:59 | 显示全部楼层
小樱 发表于 2013-4-6 23:34
哦,就是VPS上开的虚拟主机啊

虚拟主机差远了,能装软件么?能重启么?
回复 支持 反对

使用道具 举报

发表于 2013-11-8 18:07:24 | 显示全部楼层
一头雾水啊 现在还是搞不懂 楼猪再说什么
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|Archiver|Bangteng Inc. ( 赣ICP备13005708号-5

GMT+8, 2017-10-19 04:13 , Processed in 0.062340 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表