IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    WordPress4.0在LNAMP下获取ClientIP的Bug

    Mucid发表于 2014-10-24 09:18:14
    love 0

    虽然鹚酱一直都不怎么更新blog,但是并不代表没有用心去维护他。

    事情是这样的,虽然今年二月份从凤女王的凤凰城机房迁移到了MultaCom机房,
    然后八月末的晚上,凤女王突然hangout问我备份了VPS资料了没,
    “啥,备份VPS资料?”
    “MC机房被人DDOS攻击了,然后机房开了份罚单,但是招来DDOS的么客户却不肯交罚单,
    于是咱只能把服务器迁出了呗,今晚9点服务器就得下架了。”
    我一看表,都晚上8点一刻了:“卧槽!怎么不早告诉我”
    “我早就发邮件了,你们都不理我,只能一个个通知了!”

    立马SSH进去,把VPS上跑的应用打了个大包然后SCP回来,终于赶到9点之前完成了备份,
    然后满怀庄重的在SSH里面敲了一句 sudo rm -rf / –no-preserve-root ✌(´◓q◔`)✌

    总之这个机房确实不太平,先不说邻居被DDOS然后跟着遭殃,之前我的站也是被人狂扫,那个CPU和内存占用之高啊经常弄得VPS宕机。
    嘛也是我这个512内存的VPS东西跑得太多啦 Apache, Nginx, PHP, Python, Mysql, MongoDB, PureFTPd, Shadowsocks……

    我开始优化些东西,大概有这些吧,
    首先把William大师的遗产,有问题的gravatar的cache代码给删掉了,这段代码确实有问题php发出的请求过多导致内存CPU飙涨。
    然后就是把WP SuperCache这个插件卸了,说实在的这是我最喜欢的WP插件可以很大的提升WP的加载速度,但是这个插件会吃不少内存,嗯。
    关掉了Mysql的InnoDB引擎,继续使用古老的MyISAM,InnoDB是个吃内存大户。
    balabala的我也不记得还干了啥,总之现在的Blog也没少块肉。

    但是其实上面的优化只是在一阵子内有效果,面对海量的请求还是抗不住的,
    有我这边的问题也有KVM的问题,上面的优化其实是针对VPS优化的,因为凤凰君的KVM VPS控制不了CPU的使用率,
    也就是说不是给你分配1GHZ的CPU用量,而是分配了一个核心给你。
    是人写的代码都会出问题的,就算俺把乃的load艹到了10x倍,控制住Client的配额不就好了嘛。
    那阵子有点忙我说不太想改代码,请求帮忙限制住VPS的CPU配额,结果弄得凤凰君很生气,最后不知道凤女王用了什么方法调节了吾的CPU配额,
    其实就我个人感觉,根本就没控制住client的cpu用量啊,还是在怪我CPU用超了╮( ̄▽ ̄”)╭

    所以对于有人恶意的扫站,我进入VPS用top观察了会儿,发现一大堆apache和nginx进程,
    进程多不要紧,但是看起来是大部分都僵死了的节奏。
    得了,最后写了个守护脚本,把nginx,apache,mysql……xxx每隔半个小时都重启一次。
    扫站这些人咋就这么讨厌呢,想干下吾的服务器也不是件简单事儿呗。。

    下面说正事儿,折腾了一个月后凤凰君终于把服务器给迁移到了ChinaCache的米帝机房,也就是blog现在搁置的地方,
    出于对老客户补偿,凤凰說可以免费用到2016年6月,其实我没啥意见今年到期了就迁走吧。

    VPS用的是Ubuntu 14.04 LTS,其他都还好就是Apache 2.4的改动很大,很多指令都废弃了或者有替代的指令了,
    当然跟着遭殃的还有很多Apache的第三方Mod……

    我依旧喜欢用Linux +Nginx +Apache +PHP +Myql这样的架构,兼容性很好,性能也不错,就是配置稍微麻烦一点。
    但是我发现WP的评论IP又清一色的变成了 127.0.0.1,
    明明mod_rapf插件也通过apt-get装了啊,难道源里面的插件有bug依旧得自己重新编译么。
    于是把rpaf的代码下下来编译,但是发现编译通不过,得打个补丁就好了:
    git clone git://gist.github.com/2716030.git
    patch mod_rpaf-2.0.c 2716030/mod_rpaf-2.0.c.patch

    补丁打了,rapf也跑起来了但是WP的CientIP获取依旧死活都是 127.0.0.1,忘了说了apache的rapd就是用来修正apache位于proxy后的ClientIP获取问题的。

    我检查了一下apache的日志,发现日志里面的客户端ip毫无疑问是正常的,为了确定rpad模块是否工作正常,我先卸载了apache rapd模块,
    然后又重新载入apache rapf模块,对比前后的变化如下图,毫无疑问rapf模块工作正常。

    然后接下的问题可以确定了,要么是新版PHP的问题,或者问题就在WP上。
    所以检查是不是新版PHP的ClientIP获取有问题很简单,写个小测试脚本就可以了:

    echo ‘REMOTE_ADDR ‘ .$_SERVER[‘REMOTE_ADDR’] .'
    ';
    echo ‘HTTP_X_FORWARDED_FOR ‘ .$_SERVER[‘HTTP_X_FORWARDED_FOR’] .'
    ';
    echo ‘HTTP_CLIENT_IP ‘ .$_SERVER[‘HTTP_CLIENT_IP’] .'
    ';
    ?>


    如上图,PHP没有一点问题呀,所以毫无疑问的是WP自己在作死啊。
    因为LNAMP实际上就是个代理架构,前端的Nginx Proxy给后端的Apache传递了一些额外的字段,其中就包括正确的ClientIP信息,
    只是新版的Wordpress自己没去读这些字段而已。

    其实也没啥大不了的,我对人家访客的IP一点都不感兴趣,
    不像么朝廷的看板娘,总会用心的记录下你从哪里来的,和谐的很啦 (՞ةڼ◔)

    也不打算修这个bug,如果你有需要把Wordpress评论部分的代码稍微改几行就好了,
    但是估计乃改动WP的主题不太可能达到目的,得直接动WP的源码了,
    然后只要WP一升级就把乃改过的代码又给覆盖啦✌(´◓q◔`)✌

    说了这么多,其实不太想动WP的真正原因是——很久之前就有打算,不再使用Wordpress啦。
    并不是说他不好,而是他提供了太多的功能我用不到,相应的Wordpress吃资源是大家都知道的,
    强大的系统底层实现是比较复杂的,Wordpress提供插件系统,但是说老实话,
    很多时候直接改动WP的源码要比阅读庞大的Wordpress插件开发指南要轻松很多啊。

    实际上也确实如此,不仅仅是Wordpess,上次 玛格丽特·苏 姐姐要吾帮着弄下那susecn forum加点功能,
    但是吾看着BBPress的插件文档就蛋疼==|||
    然后问苏姐说可以直接改BBPress的代码,于是问题很快就解决了,,Ծ ◡ Ծ,,

    嗯,其实吾自用的Blog系统已经开始写了,以吾现在的能力开发出一套完整的web系统是毫无压力的,
    关键是自己写的东西想怎么弄就怎么弄,没有什么包袱,既不用考虑兼容也不用考虑如何协作,
    所以在这里做个约定吧,毕竟吾很少下决心做么些事,但是一旦下定决心就停不下来,
    挖坑不填可耻,就看什么时候能够写完啦~



沪ICP备19023445号-2号
友情链接