作者归档:zjqzxc

使用Nginx反向代理,Cloudflare反向代理后,Apache获取客户端真实IP问题

起因:

服务器端部署apache+php应用,使用$_server[‘remote_addr’]获取的ip为127.0.0.1。虽然说可以通过其他方案来获取正确的ip,但强迫症发作,觉得这是不可接受的。

解决方案:

作为反代服务器的NGINX配置:

确保server中包含以下内容:

server{
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

作为后端服务器的Apache配置:

1、启用mod_remoteip模块

a2enmod remoteip

或(debian系统有效):

sudo ln -s /etc/apache2/mods-available/remoteip.load /etc/apache2/mods-enabled/remoteip.load

2、修改配置文件(以debian为例)

方案一:在使用Cloudflare后,客户端的真实ip会被放在HTTP_CF_CONNECTING_IP中,直接使用即可

在apache2.conf中或虚拟主机的配置文件中添加以下内容

<IfModule remoteip_module>
RemoteIPHeader CF-Connecting-IP
RemoteIPInternalProxy 127.0.0.1/24
</IfModule>

修改apache access log格式(在/etc/apache2/site-enable/*.conf中添加或修改)

LogFormat "%{CF-Connecting-IP}i %l %u %t "%r" %>s %O "%{Referer}i" "%{User-Agent}i"" proxied
CustomLog ${APACHE_LOG_DIR}/access-example.com.log proxied

方案二:手动剔除Cloudflare所有的ip

Cloudflare使用的ip可以在https://www.cloudflare.com/ips/查询

<IfModule remoteip_module>
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 127.0.0.1/24
#CloudFlare IP Ranges
RemoteIPInternalProxy 103.21.244.0/22
RemoteIPInternalProxy 103.22.200.0/22
RemoteIPInternalProxy 103.31.4.0/22
RemoteIPInternalProxy 104.16.0.0/12
RemoteIPInternalProxy 108.162.192.0/18
RemoteIPInternalProxy 131.0.72.0/22
RemoteIPInternalProxy 141.101.64.0/18
RemoteIPInternalProxy 162.158.0.0/15
RemoteIPInternalProxy 172.64.0.0/13
RemoteIPInternalProxy 173.245.48.0/20
RemoteIPInternalProxy 188.114.96.0/20
RemoteIPInternalProxy 190.93.240.0/20
RemoteIPInternalProxy 197.234.240.0/22
RemoteIPInternalProxy 198.41.128.0/17
</IfModule>

其他:若未使用cdn:

<IfModule remoteip_module>
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 127.0.0.1/24
</IfModule>

3、补充:若后端服务器为NGINX

在配置文件中添加:

set_real_ip_from 127.0.0.1/24;
real_ip_header X-Forwarded-For;

 

个人邮件服务器——一、概述

前言:

大概5年以前,一个偶然的机会,看到了腾讯提供了免费的企业邮箱,只要有域名就可以申请使用。上某宝,兴冲冲买了一个.info域名,回去注册,腾讯说这个域名后缀垃圾邮件太多,不让用了,心中顿时[哔]🐶。再后来,买了至今仍在使用的flagplus.net域名,总算是用上了一个可以自己随意指定用户名的邮件系统。

时间到了2016年,开始在net.cn上大量购买看起来好玩的低价域名后缀的域名后,想着要把其中某一个准备常用的域名开通一个域名邮箱,于是注销了当时申请的一个腾讯企业邮箱(提示只能注销域名3次,心中不爽),绑定新域名,提示不支持,心中[哔]🐶。

半年后的2016年底,随着希拉里邮件门事件的爆出,便萌生了搭建自己的邮件服务器的想法。于是乎开始查资料。本来以为只需要几条apt-get就能完成,后来发现原来远远低估了搭建邮件服务器的难度。陆陆续续又拖了半年,到2017年初,才最终付诸实践。

目前邮件系统已比较稳定运行几个月了,现在整理下整个配置过程,以防自己忘记。

继续阅读

使用插件显示博客阅读数量

博客的访问统计已借助第三方工具实现,但是参考了传统的公共博客系统,每篇博客都有阅读数量统计和显示。本着“WP插件无所不能”的信念(主要是懒得自己考虑如何把第三方工具的统计数据引入进来),经过一番搜索后问题解决。

 

用到的插件:

WP-PostViews:用于统计每篇博客的阅读数量(首页访问不计入统计范围)

PHP Code Widget(可选): 用于在小工具栏执行php代码

 

操作方法:

1、安装WP-PostViews并启用

2、(在合适位置)添加阅读数显示代码:

<?php if(function_exists('the_views')) { the_views(); } ?>

显示最受欢迎的日志:

<?php if (function_exists('get_most_viewed')): ?>
   <ul>
      <?php get_most_viewed(); ?>
   </ul>
<?php endif; ?>

2.1(可选):修改主题相关页面,如index.php, archive.php, single.php, post.php , page.php等,并添加以上代码,及适当的布局,此方法适用于对显示效果有严格要求的人

2.2(可选):因为之前的使用经验,修改主题布局后,再升级主题会导致修改的内容消失。所以考虑使用小工具来解决此问题。但是默认情况下,小工具并不支持执行php代码。搜索后使用插件PHP Code Widget解决问题

3、使用小工具显示博客浏览数

搜索安装并启用PHP Code Widget后,在外观——小工具页面,拖动一个PHP Code标签到小工具栏的合适位置,并根据自己的需求设置合适的内容,保存后测试

 

一些问题:

1、与WP Super Cache的兼容问题:

博客使用了WP Super Cache,但WP-PostViews可以采用ajax方式,使得即使启用了缓存,统计依然可以准确进行。

此外,在小工具栏设置的显示访问数量代码,依然会收到cache影响。负面影响使会使阅读数显示不实时,正面影响是即使开启了这个插件,也可以做到全页面缓存

2、关于增加的数据库操作:

每次访问,会导致一次数据库wp-postmeta表中,post_id为对应博客id,meta_key为views的记录的update操作。由于update操作会导致一次随机读,操作代价比较大,当博客负载较重时不宜采用本插件。当博客负载过重时,建议使用可以部署在其他机器上的软件来实现。

[小工具]Windows桌面窗体所属进程查看Process Explorer

在使用Windows操作系统的过程中,经常会遇到,因为“误装”了一些国产的“全家桶”程序,导致了桌面上或者桌面右下角经常(有规律地)弹出一些奇奇怪怪的窗体,之前的方法一般是手动排除:即看看自己最近装了啥,以及目视分析任务管理器里那些不眼熟的进程来瞎猜。今天在论坛中突然看到有人推荐了微软提供的Process Explorer,在Windows10下测试后觉得很好用。

工具下载地址:

https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

备份下载:ProcessExplorer

使用截图:

通过表单提交simditor中的内容

使用中发现,simditor并没有自动将编辑器中的内容同步到textarea中,内容只能通过api获取,这使得无法直接使用表单的submit提交。

解决方法:editor在值改变时实时同步到textarea的中

补充:为了方便在后端语言直接向编辑器写入默认值,在编辑器加载时将textarea中的值默认传递给simditor;在自动保存插件启用时,优先保证自动保存的内容被加载到simditor中

关键代码如下:

<textarea id="editor" placeholder="Balabala" autofocus>123</textarea>

<script type="text/javascript">
var editor = new Simditor({
    textarea: $('#editor'),
});
if(editor.getValue() == ''){//当自动保存插件开启时
    //无自动保存数据,将textarea中的值赋值给editor
    editor.setValue(document.getElementById("editor").innerHTML)
}else{
    document.getElementById("editor").innerHTML = editor.getValue();
}
editor.on("valuechanged",function(){//simditor窗口内容改变实时同步至textarea
    document.getElementById("editor").innerHTML = editor.getValue();
})
</script>

 

折腾NAS之路

NAS毁一生,单反穷三代 ;两者均不沾,也成不了高富帅    —沃·兹基硕德

这篇博客仅仅是回顾事件,并不涉及具体技术细节。

0x00 为什么会有这么蛋疼的一篇博客?

这不最近又组了一台NAS嘛,趁热回顾一下自己瞎折腾的历程。
不过说到为啥会有组NAS的需求,额,好吧,台式机,笔记本,surface,手机要共享文件实在是麻烦,外加备份需求,一个nas还是很必要的。

0x01 折腾NAS,从折腾校网开始。

事情大概是这样的。那是很久很久以前,久到大概是在2012年初。那年我大一还没结束。因为学习无线网络覆盖不到宿舍区,在宿舍手机没wifi外加校园网20元一个月不限流量这么一个神一般的套餐存在,于是考虑把校网变成无线网来给手机(及其他设备)使用。
然而学校使用的深澜计费认证系统并不希望我这么做。在一不小心的一个机缘巧合,认识了某大胖子学长。在大胖子不厌其烦地指导下,终于买了一台tplink tl-wr703n 3g路由器并成功刷机openwrt,装python登陆上了校网并成功发射出无线信号,从此以后,在移动电源的助力下,宿舍实现7*24h无线网覆盖,当然这是后话。跑题了。

刚才好像提到了这么几个关键字:3g路由,openwrt;3g路由意味着这个路由上有一个usb接口,可以接U盘或者移动硬盘(外部供电的那种),可以接存储设备唉,这不就是nas嘛~虽然当时对nas毫无概念,虽然当时也就开了个http服务和ftp服务,不过不管怎么说,可以算作是一个nas了;openwrt嘛,一个linux内核的路由操作系统,成功将我带入了linux的世(大)界(坑)。

第一台(非现代意义上的)NAS长这样:

0N[TQ9]3DQTIP38Q9AIKK~T
额,不对,放错图了;上图为大胖学长在群里发的图,在看了这张图后我厚着脸皮请教了一系列相关问题并最终入坑。此图需永久珍藏。

97Y@[V4$$GAMZI~UM658B[X
这个才是我的设备;左上角为一个3.5英寸硬盘盒,曾经用把它接到路由器上并成功安装了discuz。

啊呀呀,说起折腾校网又是一堆回忆,都可以另开几篇博客说明情况了。

后续:一共买过3台703n(一台阵亡,其余两台从通州搬家后就收起来吃灰了),一台743n(一周内刷机刷错了,阵亡;直到毕业都没修好),一台大亚db120(双usb接口,用来跑打印服务器并顺便给台式机当无线网卡;毕业搬家通州后该路由作为主路由(两台703n当作ap扩展无线信号)高强度服役半年后阵亡;接班设备为一台小米mini)。

0x02 小插曲:镜像站那些年

时间大概是2012年中旬,在开始折腾前文所述的那个小路有后不久。经大胖(博客)牵线,与玉贤大大(博客)开始给学校折腾镜像站。不久后认识了李吉吉明(博客)大大,之后的数年里生活轨迹完全被改变了。

内容是在太多太乱,另开一篇慢慢说。

0x03 一台小主机

一台VIA芯片的x86主机,512M DDR一代笔记本内存条,板载CF卡槽;曾经通过外接U盘的形式跑Debian一年左右,后来因为种种原因一直没有发挥太大作用;毕业时送范神(博客)了。

0x04 一台龙芯2F CPU的主机

起源:大概是大三的某一台能,某日某qq群中突然有人发了一个链接,一台售价300元左右的,使用国产龙芯2F cpu的笔记本有团购活动。作为一个伪技术宅,果断购入,以供折(吹)腾(牛)。

结果:试着装了下debian,感觉有点费劲;用原生操作系统带出去装逼数次后,因为性能太差就垫枕头了,直到毕业。毕业后考虑用它作为监控机,试装debian后感觉版本有点老,遂放弃,并购入ATOM工控机一台完成此工作(下文又述)。后来的后来,就真的没再开过机了。再后来的后来,用来装debian的硬盘被我拆了装回老笔记本里,老笔记本里的1T硬盘被我拆出来当移动硬盘了,当然,这都是后话。

0x05 ATOM N270工控机

当主力NAS服役将近一年。

从监控机到NAS
原本从淘宝上买的时候是为了跑cacti监控vps的状态,回来后把手边剩下一个160G硬盘塞进去,装32位Debian 8 ,把cacti配置完成后就那么跑着实在是无聊;同时因为手里有surface有需求躺在床上看美剧/电源,平时又主力使用台式机下载,两者间共享实在不方便,便考虑把这台监控机加上nas功能。因为已经在跑cacti了,而且CPU是32位的,开虚拟化也不方便,就直接装samba来当一个简单的nas。

从NAS到下载机
后来的后来,感觉开着台式机下载太费电且噪音过大影响睡眠,于是考虑把这台小主机改装成一台下载机;下载默认目录就是samba的根目录,下载都东西也不用费劲从台式机再经过这台小主机可怜的百兆网卡上传进去了。
各种百度+谷歌,安装transmission,amule,aria2分别下载bt,ed2k和百度网盘/qq旋风离线文件。24H不间断bt下载,那段时间下载了不少“好东西”。啊,跑题了,说好的nas呢。

0x06 联想Q77+I5 3470s Micro-ATX主机

断断续续折腾了小半年,最终决定把NAS部署到ESXi上,一台机器同时当服务器/NAS/软路由(入手华硕路由后放弃该软路由)。

核心配置:
主板:联想Q77
CPU:Intel I5 3740s
内存:ADATA 8G DDR3
硬盘:东芝 饥饿鲨TR150 240G SSD
电源:长城HOPE-5500ZK智控0分贝(配高了,有点浪费)
网卡:Intel 82546GB 双千兆网卡

机器上运行ESXi 6.0系统,开若干虚拟机支持各类服务。主板板载网卡做软路由WAN口,独立网卡连接交换机并作为软路由LAN口,双口预留作为端口聚合使用。主板板载网卡接交换机,独立网卡闲置已暂时拆除。

邮件服务器配置SPF和DKIM防止被误认为垃圾邮件

参考资料:

spf语法:http://www.openspf.org/SPF_Record_Syntax
spf验证:http://www.kitterman.com/spf/validate.html
dkim.org:http://www.dkim.org/
Debian下配置Postfix+dkim:https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy
Centos下配置Postfix+dkim:https://kn007.net/topics/postfix-advanced-to-use-the-new-dkim-signature-opendkim/

Debian下配置postfix+dkim+dmarc:https://www.skelleton.net/2015/03/21/how-to-eliminate-spam-and-protect-your-name-with-dmarc/

配置验证测试:http://www.mail-tester.com/

NFS 写入速度缓慢及解决

怀疑可能是由于默认挂载选项下读块过小导致的

mount -t nfs ip:/mnt/nfs /mnt/nfs_t -o nolock, rsize=1024,wsize=1024,timeo=15

相关参数:

timeo:如果超时,客户端等待的时间,以十分之一秒计算。
retrans:超时尝试的次数。
bg:后台挂载,很有用
hard:如果server端没有响应,那么客户端一直尝试挂载。
wsize:写块大小
rsize:读块大小
intr:可以中断不成功的挂载
noatime:不更新文件的inode访问时间,可以提高速度。
async:异步读写。

暂作记录,以后整理

Windows下右键菜单添加Open with Cygwin

Windows下cmd因过于难用,且命令与Unix-like系统稍有差别,使用起来不太顺手;
有时候需要在当前目录下以命令行执行一些东西,使用cmd再cd较为麻烦;
综合以上原因,考虑在右键菜单中添加Open with Cygwinl来用cygwin代替cmd使用;

Cygwin安装步骤略

添加到右键菜单操作步骤如下:

1、regedit,打开注册表编辑器。

2、找到[HKEY_CLASSES_ROOT\Directory\Background\Shell]。

3、在下右键-New-Key,命名为“Cygwin”或其他。

4、单击[Cygwin],在右侧设置(Default)值为:Open with Cygwin

5、在[Cynwin]下右键-New-String Value,设置其值为‪”D:\cygwin64\Cygwin-Terminal.ico”或相应图标路径。

6、在[Cygwin]上右键-New-Key,命名为”commadn“,其(default)值为”D:\cygwin64\bin\mintty.exe”。

完成以上步骤即可实现。