WordPress4.0在LNAMP下获取ClientIP的Bug

虽然鹚酱一直都不怎么更新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获取有问题很简单,写个小测试脚本就可以了:

<?php
echo ‘REMOTE_ADDR ‘ .$_SERVER[‘REMOTE_ADDR’] .'<br />’;
echo ‘HTTP_X_FORWARDED_FOR ‘ .$_SERVER[‘HTTP_X_FORWARDED_FOR’] .'<br />’;
echo ‘HTTP_CLIENT_IP ‘ .$_SERVER[‘HTTP_CLIENT_IP’] .'<br />’;
?>


如上图,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系统是毫无压力的,
关键是自己写的东西想怎么弄就怎么弄,没有什么包袱,既不用考虑兼容也不用考虑如何协作,
所以在这里做个约定吧,毕竟吾很少下决心做么些事,但是一旦下定决心就停不下来,
挖坑不填可耻,就看什么时候能够写完啦~

About Mucid

My life is brilliant !
This entry was posted in Technology and tagged , , , , , , . Bookmark the permalink.

40 Responses to WordPress4.0在LNAMP下获取ClientIP的Bug

  1. 笑笑笑 says: Firefox 37.0 Firefox 37.0 Windows 7 Windows 7

    lnamp,wp那个用.htaccess么。。还是主要是nginx

  2. 香港虚拟主机 says: Firefox 34.0 Firefox 34.0 Windows 7 Windows 7

    搬服务器感觉挺麻烦的,除非出了些什么大问题才会考虑这些事情的!!



    买主机送平板,最后2天!!

  3. devil says: Google Chrome 39.0.2171.71 Google Chrome 39.0.2171.71 GNU/Linux x64 GNU/Linux x64

    貌似很多人都愛用wordpress,試試jekyll也許是個不錯的選擇

  4. francis says: Firefox 33.0 Firefox 33.0 Mac OS X  10.7 Mac OS X 10.7

    呦,大哥你现身了终于?

  5. Tao Zhu says: Firefox 33.0 Firefox 33.0 Windows 7 Windows 7

    技术大神,问个问题:如果博主回复了某个用户的评论,并想让他收到邮件通知,用什么插件?我的WP博客貌似没这个功能,以前的插件也失效了,现在博客越来越荒芜了……

  6. YongQi says: Google Chrome 40.0.2209.0 Google Chrome 40.0.2209.0 Windows 7 x64 Edition Windows 7 x64 Edition

    小鹚,你是我的偶像 :cool:

  7. 雅岚 says: Firefox 28.0 Firefox 28.0 Windows 7 x64 Edition Windows 7 x64 Edition

    :?: 我…..弱弱地说一句没看懂。。。