nginx的proxy_pass使用https(SSL加密)

写这个文章的原因是因为今晨解决了一个电影FM网友经常访问网站502的问题。最近电影FM粉丝交流群越来越活跃了,感谢Rachel妹纸每周举行的猜电影活动。热衷电影的网友可以加入电影FM的交流QQ群:471644884。最近电影FM的访问量也上升了,高峰时候接近2w一天的IP。今晚美女主持人Kiki来访电影FM时,登录的时候遇到了502,其实我今天访问的时候也出现过一次。为什么会这样呢?

因为电影FM没有网站备案(做电影推荐也需要视听许可证???搞不懂),所以前端流量入口的机器放在阿里云的香港主机,后端也就是网站程序运行的主机在邻近的深圳机房。阿里云的主机之间互相访问速度还是可以的,就是香港主机的线路偶尔也会抽风(比较慢)。当然这些都问题不大,最大问题是香港和深圳的主机之间,多了一道墙。如果我们访问墙外的网站,如果带有敏感词,会被墙挡下来,并且1分钟内都无法访问,不过只是单个人的,还不至于影响所有人。现在问题是墙的工作室双向的,假如有个人在墙外输入了敏感词,墙就会把香港主机和深圳主机的连接挡下来,这时候会让所有用户都上不了网站了。所以为了解决这个问题,要么抛弃墙熟悉的HTTP通信,要么使用HTTPS加密传输(墙绝对不会解密HTTPS)。所以我最后决定在香港和深圳主机之间使用自签名的HTTPS。

回归正题,先生成一个RSA的key,加密算法选择aes也行,des3也行。这里使用1024位的des3。

openssl genrsa -des3 -out ssl.key 1024

会提示必须输入一个密码,随便输入一个就行了,下面我们要解密后才给nginx使用。

继续阅读

Python里使用zbar识别二维码

今天研究数据库里的微信群二维码图片,很多人上传的图片并不是正确的群二维码,而是个人微信、公众号或者是一个手机充值流量的入口。为了把这些不合格的二维码挑选出来,只能一个个识别了。找了网上一些接口的,测试了一下不但限制频率为一秒2个,还很多识别不出来,看报错用的是zxing这个库,最后只能想其他方法。

在CentOS7上安装了zbar,没有找到el7的rpm,只好自己编译。研究出编译时使用一些参数可以避免安装一些不必要的包。为了virtualenv里的python能用,编译时候要指定安装到/usr。

编译文件不多,一下就完了。步骤如下:

./configure –disable-video –without-qt –without-gtk –without-x –prefix=/usr
make
sudo make install

继续阅读

CentOS7上MySQL返回Too many connections

被这个问题困扰了一天,今天做微信开发,流量一大,django占用CPU很大,这个比较好解决,加进程加硬件即可。然而数据库连接开始报Too many connections,查了网上一些文章,直接改/etc/my.cnf加入max-connections=3000,无果。又查,在mysql里输入set GLOBAL max-connections=3000,数值是变了,然并卵。

刚才找到一个文章,才想起原来是CentOS7的systemd限制了服务进程的NOFILE,导致每次启动mysql服务后,查询max-connections一直是214,这个数字可能是默认的最大值吧。解决方法如下:

编辑 /usr/lib/systemd/system/mysqld.service,加入:
LimitNOFILE=infinity
LimitMEMLOCK=infinity

困扰整天的问题终于解决,撰文记下。

参考文献:

http://www.nethings.eu/quick-picks/mysql-max-connections/

发现一个不需要打密码的sudo方法

平常在在 /etc/sodoers 添加管理员时,一般这样写:

xiaoxia    ALL=(ALL)    ALL

虽然看不懂这句里面三个ALL表示什么意思,每次都这样写。最近在公子龙七的强烈推荐下,玩起了树莓派2(一个信用卡大小的微型计算机,不用200块就能买到),官方的raspbian系统(发展debian)不能用root,但sudo不需要密码。看了一下它的sudoers文件。Mark下来。

xiaoxia    ALL=(ALL)    NOPASSWD:    ALL

还是看不懂这三个ALL表示什么意思,也懒得去翻阅了,UNIX世界里学海无涯。有了这个东西,平常在我个人的MacBook Air上操作网卡路由表之类的方便多了 😀

继续阅读

手撕包菜磁力搜索引擎的开源说明

已经一年半载没有写博客了,搞得上来不知道写些什么。博客上的内容还时不时有人评论,大部分我还是会一一回复的。有些人会关注我的博客用什么主机,我的博客现在是用Linode的主机,因为现在很便宜,而且配置不差。另外比较多的是问手撕包菜的源代码能否提供,能否出售。今天我写这个文章就是把手撕包菜的网站开源了,包括网站页面,DHT爬虫和搜索引擎相关部分。

2年前的那篇跟磁力搜索相关的文章在这里:
写了个磁力搜索的网页 - 收录最近热门分享的资源

作为最早在国内研究和实践DHT爬虫的人,我的灵感是来自芬兰Helsinki大学的这篇论文:
Real-World Sybil Attacks in BitTorrent Mainline DHT

英文好的同学应该很容易读懂,跟我写的不到300行的爬虫代码大致原理一样。初次接触DHT网络的可以结合我之前的文章阅读,或者拜读Kevin Lynx的博客。所以具体原理在这里就不再阐述了。

继续阅读

Windows上最小的Python运行环境,700KB

之前还没有编译过Windows上的Python,打包发布一般使用py2exe和pyinstaller,生成的文件至少有3MB。而且Python只有VS的Project文件,也就是说,如果自己要用GCC来编译,就需要自己编写或者修改Makefile了。我是在Debian上安装了Mingw32之后,修改默认的Makefile来让它支持编译成Windows版本,而且源代码有大幅度改动,所以这里就不把过程写出来了,我也忘了做了多少修改。编译方法可以参考我的上一篇博文。建议有VS的同学还是选择VS编译比较方便,不用改动那么多。

python23

继续阅读

继续玩路由器,交叉编译Python 3.3,压成1.5MB

昨天在研究如何在嵌入式Linux上搭建Python运行环境,因为有了Python之后,很多工具例如GoAgent之类的东西就可以用上场了。昨天成功编译了Python2.6,参考了网上很多方法,但最后无果而终,现在总结了一套自己的编译方法,基本上可以秒杀所有Python版本的交叉编译,这里做一个总结。我的编译环境是Debian64位 无桌面版本,体积很小巧,安装在办公室电脑虚拟机里,在家里也可以远程编译代码。

首先在Python网站下载最新版源代码,这里我使用Python 3.3版本。解压下,有下面这堆东西。

download

 

继续阅读

无聊开始玩路由器,入门Tomato固件

在Wordpress上消失了一段时间,其实我最近几个月都比较宅。相信最近大家都了解过新出的一款很NB的路由器叫极路由,功能很强大,8G的可存储空间,可以安装路由apps也可以下载资源,据说翻墙插件还很给力。对新鲜事物一直保持着高度兴趣的我,却没有机会买到这款路由,而且据说价钱会越来越贵,说不定之后还有收费的apps。想在路由器上翻墙嘛,自己动手实践一下就可以了 :)

在之前的《路由器上写CMCC自动登录验证脚本》  这篇文章中,我尝试了在使用openWRT的WR703N上接入8G的U盘也实现了在路由上安装和运行Python应用。不过当时很有目的性的玩玩,所以没有怎么深入探究底层的东西。

昨天在ziv同学的陪同下,搞来了两个Tenda的路由器,老板邓先生帮我刷了Tomato的固件。话说,以前我的703N也是在他这里网购的,不过这次路过实体店了。在他的店里,看着他轻轻松松的拆掉里面的电子元件,然后放到一个地方进行编程,接着又轻轻松松的安装回去。我呆呆的看着,觉得很酷。突然想起初中的时候,自己拆开一个mp3.5为了刷固件,短路两条引脚结果太暴力被我弄断了,为了修好到处找店铺想方设法焊接上那块芯片上的引脚,到最后还是放弃了。邓先生说这个Tenda的路由只能刷Tomato的固件,刷openWRT固件的路由价格贵,稳定性也不高,所以我就看着便宜的捡了70块钱的Tenda回去。

继续阅读

HTTPS与SNI扩展,一个IP多个证书

在搭建支持HTTPS的前端代理服务器时候,通常会遇到让人头痛的证书问题。根据HTTPS的工作原理,浏览器在访问一个HTTPS站点时,先与服务器建立SSL连接,建立连接的第一步就是请求服务器的证书。而服务器在发送证书的时候,是不知道浏览器访问的是哪个域名的,所以不能根据不同域名发送不同的证书。用过GoAgent的人都知道需要给浏览器导入证书才能使用HTTPS正常登录Twitter等网站。

SNI(Server Name Indication)是为了解决一个服务器使用多个域名和证书的SSL/TLS扩展。一句话简述它的工作原理就是,在连接到服务器建立SSL连接之前先发送要访问站点的域名(Hostname),这样服务器根据这个域名返回一个合适的证书。目前,大多数操作系统和浏览器都已经很好地支持SNI扩展,OpenSSL 0.9.8已经内置这一功能,据说新版的nginx也支持SNI。


继续阅读