CloudFlare CDN下Nginx正确获取真实IP教程

说到获取真实IP,我们不难想到nginx的http realip module,就是当遇到IP是设定范围内的地址时,就逆向递归获取源目标的真实IP。对于Cloudflare CDN而言,也是遵从行业标准的,即使用X-Forwarded-For header 和 CF-Connecting-IP header 。Cloudflare的真实IP地址可以从这里获取Cloudflare IP addresses,当然我们也可以查看文本格式的Cloudflare的IP段:

https://www.cloudflare.com/ips-v4
https://www.cloudflare.com/ips-v6

官方建议还是要定期更新这个IP范围的,以免范围改动影响使用效果。

奶牛找到了一个别人写好的sh脚本,可以自动生成一个Cloudflare真实IP的conf。

#!/bin/bash
echo "#Cloudflare" > /usr/local/nginx/conf/cloudflare_ip.conf;
for i in `curl https://www.cloudflare.com/ips-v4`; do
        echo "set_real_ip_from $i;" >> /usr/local/nginx/conf/cloudflare_ip.conf;
done
for i in `curl https://www.cloudflare.com/ips-v6`; do
        echo "set_real_ip_from $i;" >> /usr/local/nginx/conf/cloudflare_ip.conf;
done
echo "" >> /usr/local/nginx/conf/cloudflare_ip.conf;
echo "# use any of the following two" >> /usr/local/nginx/conf/cloudflare_ip.conf;
echo "real_ip_header CF-Connecting-IP;" >> /usr/local/nginx/conf/cloudflare_ip.conf;
echo "#real_ip_header X-Forwarded-For;" >> /usr/local/nginx/conf/cloudflare_ip.conf;

运行脚本后,我们可以得到一个/usr/local/nginx/conf/cloudflare_ip.conf的conf文件,在网站所在的nginx conf中添加字段:

include /usr/local/nginx/conf/cloudflare_ip.conf;

即可,添加完成后使用nginx t来验证配置文件是否正确,正确无误后重启或者重新载入nginx即可。

也可以使用cron计划任务来定期更新cloudflare_ip.conf文件。

0 5 * * 1 /bin/bash /location/to/update_cf_ip.sh

这样子就可以在每周1的5点进行自动更新Cloudflare的IP conf文件了。如果使用配置文件中的X-Forwarded-For参数,理论上对所有的执行标准的CDN都是有效的。

PHP7环境下使用OPcache提高WordPress网站性能8倍

奶牛一直以为自己的服务器都开了OPcache,但是后来发现只是编译了,但是没有启用,今天启用了PHP7的OPcache,来发一份儿体验报告。

配置OPcache

配置文件为/usr/local/php/etc/php.ini,添加内容

[zend opcache]
zend_extension="/usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/opcache.so"
opcache.force_restart_timeout=3600
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable=1
opcache.enable_cli=1

其中的zend_extension为你服务器编译后opcache.so文件的位置。

OPcache性能测试

载入时间数据比较:

OPcache载入时间比较

性能比较:

OPcache性能比较

测试结论

经过奶牛的测试,在服务器未启用WordPress cache插件的时候,CPU的飙升是非常厉害的,严重影响服务器性能,因此无WordPress插件的情况下,并未完全遵从1000次测试,但是图表已经完全可以说明性能的比较了。

WordPress的cache插件对网站性能提升至关重要,OPcache的存在也能最大性能的提升WordPress服务器的性能,对比而言,OPcache可以提升PHP7约3倍的性能,WordPress的cache插件可以提升约4~5倍的性能,WordPress启用cache插件并且在PHP7下启用OPcache,性能提升8倍。

所以,奶牛强烈建议WordPress的用户使用PHP7并开启OPcache,并且为WordPress安装一款cache插件,保证服务器的性能最优。

Sharktech鲨鱼机房VPS和独服8折永久优惠,奶牛专享

跟美国的Sharktech鲨鱼机房合作已经一年有余,今天凌晨鲨鱼的老朋友发来优惠信息,给了奶牛一个8折永久递减优惠。

对于鲨鱼Sharktech来说,奶牛觉得最好的形容词就是稳定,这也是建站最需要的,合作一年来,无论从40Gbps的DDOS防御到60GbpsDDOS防御的免费高防升级,还是CN2 GIA BGP的接入,三网直连的美西洛杉矶服务器Sharktech鲨鱼一直在努力,致力于拓展中国市场,在使用过程中有7*24小时技术服务,售后无忧。

促销地址: https://www.affu.net/go/sharktech
促销码:nenew
适用范围:截止2019年5月底,所有VPS的月付、季付、半年付、年付套餐可享受持续递减8折优惠.

Sharktech鲨鱼机房独服促销

CPU:Dual E5-2670
内存:32GB
硬盘:2TB HDD
流量:不限流量
带宽:1Gbps
价格:$189/月 (6折限量供应)
促销码:E51G
购买地址:
https://www.affu.net/go/sharktech-2019-march-07

CPU:Xeon E3-1270v2
内存:16GB
硬盘:2TB HDD
流量:不限流量
带宽:10Gbps
价格:$588.60/月 (45折限量供应)
促销码:10G45
购买地址:
洛杉矶机房 https://www.affu.net/go/sharktech-2019-march-08
芝加哥机房 https://www.affu.net/go/sharktech-2019-march-09
丹佛机房 https://www.affu.net/go/sharktech-2019-march-10

CPU:Dual Xeon E5-2670
内存:32GB
硬盘:2TB HDD
流量:不限流量
带宽:10Gbps
价格:$624.6/月 (45折限量供应)
促销码:10G45
购买地址:
洛杉矶机房 https://www.affu.net/go/sharktech-2019-march-11
芝加哥机房 https://www.affu.net/go/sharktech-2019-march-12
丹佛机房 https://www.affu.net/go/sharktech-2019-march-13

奶小牛

奶牛当爹了,值得庆贺的一件事儿。已经有大半个月在忙了,没有任何心思做自己的事儿了,不,孩子现在是最重要的事儿了。

月嫂

对于月嫂,我是不敢苟同没有好坏之分的,虽然大部分月嫂会把自己份内的事儿做好,但是也绝对是能省则省,她们会告诉你尿不湿比戒子好,但是对于稚嫩的婴儿,红屁股很大原因也是因为尿不湿吧,还有就是婴儿不能经常洗屁屁,试想一下,如果你屁股上糊着尿液或者便便,然后干了,你会是什么感觉?所以呢,月嫂很多时候是对的,但是也不是全对的,自己的孩子还是得自己上心才行。怎么说,尽信书则不如无书。

名字

这也是一个大事儿,家里人想了半个多月还是定不下来,每个人都是有自己的想法的,想一家人认同还真的很难,就像自己的孩子,我选的名字都被否了,最后还是闹得不开心。我觉得吧,孩子的名字就该父母自己取,俩人同意就够了,家人参考参考就可以了,要不定个名字比什么都难。

眼屎

孩子一只眼总是被眼屎糊住,老是睡一觉就睁不开。处理方法就是生理盐水擦拭眼屎,擦干净后滴上托百士眼药水,一日三到四次,每次一到两滴,前提是不是出生后就眼屎严重,而且眼睛没有明显红肿,否则还是建议去医院找医生看。

最近还有好多事儿要忙,感觉没孩子的时候真的该好好享受生活,有了孩子感觉日子都过得比以前快多了。希望孩子健康成长,无忧无虑。

amazon s3针对用户共用bucket的policy

amazon s3的官方有一篇介绍文章,但是少了一个”,”,导致并不能成功导入。

amazon有提供policy的在线生成工具,地址是http://awspolicygen.s3.amazonaws.com/policygen.html

amazon针对用户共用bucket,指定用户目录的policy在https://aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/

具体policy可以使用下方的policy

{
  "Version":"2012-10-17",
  "Statement": [
    {
      "Sid": "AllowGroupToSeeBucketListInTheConsole",
      "Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::*"]
    },
    {
      "Sid": "AllowRootAnd<shared-folder-name>ListingOfCompanyBucket",
      "Action": ["s3:ListBucket"],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::<bucket-name>"],
      "Condition":{"StringEquals":{"s3:prefix":["","<shared-folder-name>/"],"s3:delimiter":["/"]}}
    },
    {
      "Sid": "AllowListingOfUserFolder",
      "Action": ["s3:ListBucket"],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::<bucket-name>"],
      "Condition":{"StringLike":{"s3:prefix":
                  [
                       "<shared-folder-name>/${aws:username}/*",
                       "<shared-folder-name>/${aws:username}"
                  ]
               }
        }
    },
    {
       "Sid": "AllowAllS3ActionsInUserFolder",
       "Action":["s3:*"],
       "Effect":"Allow",
       "Resource": ["arn:aws:s3:::<bucket-name>/<shared-folder-name>/${aws:username}/*"]
    }
  ]
}

但是其实只保留最后两段是比较安全的,这样子无论是/根目录还是<shared-folder-name>共享目录都是不可以list的,只能list用户自己的名字命名的文件夹。

{
  "Version":"2012-10-17",
  "Statement": [
    {
      "Sid": "AllowListingOfUserFolder",
      "Action": ["s3:ListBucket"],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::<bucket-name>"],
      "Condition":{"StringLike":{"s3:prefix":
                  [
                       "<shared-folder-name>/${aws:username}/*",
                       "<shared-folder-name>/${aws:username}"
                  ]
               }
        }
    },
    {
       "Sid": "AllowAllS3ActionsInUserFolder",
       "Action":["s3:*"],
       "Effect":"Allow",
       "Resource": ["arn:aws:s3:::<bucket-name>/<shared-folder-name>/${aws:username}/*"]
    }
  ]
}

这样子可以非常安全的隔离用户,也不用为每个用户建立一个bucket桶,还是很方便的。经过奶牛的测试,ACL最好就用默认的private,这样子安全性会更高。

三十岁后悔的二十件事

马上三十岁了,看到了狠多真诚的答案,在我有限的人生经验中,错过可以说直接上一个阶层的机会,至今后悔不已,往事并不如烟。

一、

相信命,我反而认为信命并不是极致的悲观、灰暗和迷信,而是理性又成熟深刻的价值观,知道山外有山,才能云淡风轻,这个世界本质的是不公平,每个人的起跑线是不一样,个体的差异不为人的意志所转移,最终的结果大不相同,是客观事实,明白这个现实我们才能更好的活自己。

三十岁之后的使命是接受自己是一个普通人。

二、

趁早买房,越早越好,那些告诉你生活还有诗和远方,通通都是错的,害人不浅,成熟的观念是一定要先买房,越早越好,相信我们国家。在买房这件事上的错误判断让我需要多付出很多年的代价。只要经济在发展,城市化进程还在走,也许买房可能是这辈子最正确的决定。

三、

越早理财越好,有人说没有几十万就不要理财,去享受生活,去看看世界,去旅游,这些观点通通都是错的,年轻的时候一定要存钱,在没有结婚之前,把收入分成几个账户:消费账户,应急账户,储蓄账户。把50%以上的收入存起来,少折腾股票或其他投资,股市那点本金基本收益率和货币基金差不多,没必要折腾,老实存起来,你的账户数字越来越多,你的自信就会越来越多,你的思维就会越来越广。

四、

自我预期管理,降低自我预期的阀值,没有人可以随便成功,降低预期能让自己好过不少,至少在你失败的时候能够舒服一点,小的时候认为自己是最牛逼的,自己能够改变世界,长大世界的现实是残酷的,没有什么鸡汤,奇迹是不会发生在你身上,学会接受失败和面对现实。

我一以前认识的大佬,做到上市公司的高管了,这几年自己创业,凡事亲力亲为,用电话陌拜谈业务,对方三秒钟就挂了,他把这个事情发在了朋友圈,很难想象原来这样的大佬也需要自己这么去干。多问问自己凭什么是你?

五、

恋爱要参照最优停止理论,也就是说,前37%的人如果都不合适,那么之后的每一个只要比前37%的要好,那么果断的去结婚,爱情是有情饮水饱,真正的婚姻是门当户对,家庭合伙制是婚姻的本质,一定要选性格好的,性格好的女人比有钱、漂亮之类优势更加明显。

六、

不要和老板做朋友,很多时候打工的思维在于拼命的把事情做对,而老板更多的是做对的事情,所以在层次和思维上是不可能成为朋友的,跟老板称兄道弟那就犯了大忌,表面越好,后面撕逼的结果就更严重。开始很美丽,结束的没道理。

七、

不要裸辞,一不爽就裸辞,会让自己的生活陷入一片慌乱,而后面的日子会越来越难过,辞职的前提一定是你学习不到任何东西了,没有任何成长,公司很垃圾,否则万不得已,必须要找到下一份工作再考虑辞职。

八、

少买知识付费的课程,市面上99%以上的课程本质上都是垃圾,对你没有任何好处,所有的方法论和成功方式都不适合你,基本连可应用的场景都没有,知识付费本质上是在贩卖焦虑,收智商税,省下的钱不如加入一些优质的社群,重复读几本经典的书并做总结来的划算。

九、

买保险,重要的事情要想三遍,保险不是骗子,保险是你人生变故后的最后一根救命稻草,是人生规划中必不可少的环节,如果你的经济实力不是特别的好,一定要买保险特别是重疾险,买消费型不买分红型,如果是家庭一定要给家庭中经济实力最强的人以及家庭的老人买好保险,人的一生中80%以上的概率都会得癌症。

十、

练习写作,好的文笔比好的数学重要多了,数学本质上来讲学到高中基本可以用来闯荡社会,你想想你这些年的数学丢到哪去了,数学老师的棺材板压不住了。

而写作是人生的必修课,而且每个人都需要写作,工作中你写的总结,计划,报告,邮件,微信等等都是写作,好的文笔能让你有更多的收入可能,说改变人生都不算夸张,见过很多原本普通的人,靠写作最后财富自由。

十一、

学习一项特长,你回头想想,你最牛逼的技能是什么?搜肠刮肚都想不到的时候,那么真的要趁早开始刻意练习了,在竞争领域,垂直擅长的领域,你的特长能够让你保持足够的竞争力和优势。

而且不觉得有特长的人特别的酷吗?

十二、

及时止损,很多事都需要成本代价,很多事没有任何的必要,及时止损的思维是为了不陷入损失黑洞陷阱,不一错再错,捡了西瓜丢了芝麻,错了就错了,失败了就是失败了,及时抽离。

十三、

明白人生而孤独,孤独的人并不可耻,每个人都是孤独的,享受孤独,人不能真正的去理解另外一个人,能明白自己的只有自己。

十四、

培养独立思考能力,在当下信息泛滥的时代,拥有独立思考的能力极其重要,做事之前多想想,事情真相是什么?为什么是这样?为什么不是这样?还有什么其他可能性吗?多种的思维方式去考虑问题,别让你的脑子成为别人的跑马场。

十五、

锻炼身体,好的身体绝对是本钱,高手的对决中,笑到最后的是看谁身体好,能够把对方熬败,好的身体是一种稀缺的资源,职场上更加如此,拼实力以外更多的是拼精力和体力,你想想再不锻炼能拼的过90后00后吗?你还能通宵吗?

十六、

尽量选择买贵的东西,为什么这么说,其实《断舍离》的本质,除了让我们明白人和物品的关系以外,更重要的是,物品是有能量的,如果你享受不了贵的物品,本质上是你内心觉得配不上这个物品,贵的东西能让你更加的自信,吸引力法则,你敢买宝马3以后一定买的起保时捷卡宴。其他东西同理。

十七、

学会演讲,无论在哪种场合我们需要演讲,开会发言,谈话,谈判,社交等都是演讲,生活中高频接触使用的技能一定要多训练。开不了口,害羞,害怕,会让自己人生丢分不少。

十八、

有条件就选择创业,其实是趁年轻多去折腾,多去试错才能知道自己究竟适合哪个方向,创业是改变限制条件,选择别人,而不是被人选择,做制定游戏规则的人。

当然,如果错了没关系,大不了还可以回头,到了四十岁,上有老下有小,车贷房贷,那真正是把人生困死,动不了,想都不敢想。

十九、

学会和自己相处,和自己内心的小宇宙相处,不执拗,不纠结,不自责,远离颠倒梦想,找到自己才能找到世界,千万不要和自己过不去。

二十、

自信,盲目的自信这也是自信,自信能让自己获得更多的资源和快感,自卑会让自己失去很多机会,自信让人进步,自卑让人退步。

本文作者:木木酱的小江湖 ,转载却未能找出原文出处。

WordPress的Google字体本地缓存方案

一直以来,Google字体都是困扰国内WordPress用户的一个问题。原因也很简单,载入慢,甚至可能由于载入慢导致页面卡死无法显示,这对于用户体验来说是很差的,disable google font这个插件也紧紧是对部分主题生效,对插件也没什么作用,而且测试下来效果很一般。如果你的主题还有禁止Google字体的选项那么就还挺好的,如果没有,奶牛建议可以试试Self-Hosted Google Fonts这个插件,效果很棒。

Self-Hosted Google Fonts的原理也很简单,首先就是扫描css文件里面的google fonts,然后把这些fonts下载到本地,之后把含有google fonts的css文件的链接替换掉,这样子下来,每次访问网站都是从本地读取Google字体,然后从本地分发至用户,虽然可能这样子会耗费很多流量在字体上,但是奶牛觉得还是挺值得的,至少网站的访问速度会提升很多,而且不用复杂地去修改css文件查找Google字体的链接然后本地话或者去除,而且也可以保存一个很好的字体显示效果。

最后附上链接:Self-Hosted Google Fonts

2018年总结

百度翻译总结是summary,我感觉用conclusion更贴切一些,今年感悟颇多。

刚才看电视剧《平凡的世界》,这是一部让我可以安静下来的电视剧,看过一遍,又在重看,拍的很好。

今年的思考很多,有过很多冲动,当然,我觉得有过更多的是想法,我不想再安于现状了。

人生到底该是个什么样子?我也不知道,现在,我只知时间金贵。有人说我很理想主义,确实是这样子,工作以来一直以为自己可以厚积薄发,但是发现厚积到是没做到,薄发就更不知道如何开始了。很无力,不知道该怎么开始,大概齐还是舍不得放下现在的安逸吧,但是说实话,现在的工作我真的是不想再做了,虽然我不知道我到底能不能成,能不能把自己的想法变成现实,但总归得试试看吧。在国企这种体制环境下,真的太难发育,跟自己的职业规划也相距颇远。

有时候想开个安逸的小店,就每天晒着太阳,有大把时间。

有时候就想写自己的程序,做自己看好的项目,一个人却很吃力。

最近喜欢上了一个字叫“芃”,感觉这才应该是一个人或者一个企业应有的态度。

关于亲情,友情,爱情以及2019年即将到来的baby,我心理上没做好太多准备,我可能一直都活在自己的世界里,很孤独。我希望每个人都是快乐的,每个人都可以一直笑。

我想做个有用的人,in other words,我想实现自己的人生价值,不想虚度人生,留下悔恨,已经错过了5年大好的人生,我还有多少5年可以浪费?

现在不止是有想法,也在回归,也在学习,只是慢一些,但希望结果不会让自己失望。我真心希望我可以有更多的时间去做自己喜欢的事儿,也有更多时间来陪伴我的家庭,我希望我可以有足够的精力来做这一切,我需要有精力,太需要了。这一年每天活得都很累,我想给自己放个假,思考下人生什么的。哪怕懒懒地睡上一个半月又能如何,只要能让自己振作起来又何尝不好。

2019年加油吧,奶牛。希望2018年的总结会让我在以后的日子里都如此充满动力。不悲观,做自己。

prism.js在ajax载入后失效问题解决方案

奶牛的小博客用了个ajax的主题,但是发现和prism.js有些小冲突,就是在ajax载入文章后,格式化的代码不能正常输出,其实解决方法也很简单,再次调用prism.js格式化一次即可。

Prism.highlightAll();

在ajax的回调函数里面重新highlight所有对象即可。

这个函数要放在ajax的回调函数里面,就是.done或者.success的回调函数里面,ajax升级的奶牛都快不认识了。

SSL证书的三个组成部分

今天签了几个证书,发现原来直接用crt文件的证书在部分手机上竟然显示证书不完整。仔细查了一下,原来ssl证书还有三个部分,一个是签发的crt,还有一个中间证书,还有一个根证书。但是对于桌面浏览器,只有crt证书部分就可以正常访问了,但是手机部分有时候会因为缺少中间证书和根证书导致证书不完整。

处理方法很简单:

cat ssl.ca-bundle >> ssl.crt

然后重启web服务器即可。