squid是什么我这里就不说了,这不是本文的重点,总之它是一个集:代理、加速、缓存、负载均衡、防盗链、访问控制等多功能的一个超牛X开源软件,如今已经广泛应用于很多领域。对于缓存和加速这一领域,如今各大门户网站都是用它做的CDN服务。
我的网站由于访问量比较大,一台服务器根本支撑不起,所以我研究了一下它,并成功的搭建了CDN服务,由多台服务器组建了一个简单的CDN网络来达 到负载均衡的效果。但同时我也发现了一个问题,squid官方提供的最新稳定版本(squid-2.7stable4)默认的文件描述符(file descriptors)为2048个,一般来说一个HTTP请求会打开一个文件描述符,假如有一个网页,代码里有3个js,1个css,10张图片,那 么每个访问者打开这个页面都将打开15个文件描述符,这样当这台缓存服务器同时被很多人访问时,文件描述符很快就会被用完,接着网站偶尔就会打不开,日志 里会报WARNING! Your cache is running out of filedescriptors这样的错误。
到网上搜了一下,唯一的解决办法是重新编译一下squid的源代码,用参数--with-maxfd。但网上搜到的编译方法都是在linux下的, 我没有看到有哪个在windows下使用squid并且在windows下编译的。我经过大半个月的研究,克服了重重困难和问题,最终成功的在 windows下编译了squid,为了后人不像我这样由于搜不到任何资料,发贴询问也无人能解决,几乎绝望的放弃,所以我把自己成功的经验和走的一些弯 路发出来,希望以后搜索到这篇文章的人可以借鉴和参考。
我下载了官方提供的一份最新的源代码,首先要解决的问题是怎么编译。官方文档全英文的,看得我眼睛疼,看了半天终于看懂了,大致是说有2种环境可以 在windows下编译squid,一种是基于Microsoft Visual C++,另一种是基于MinGW。由于我不是搞C的,也没弄过linux,对于这些简直是七窍通了六窍。在此之前我请了一个搞C++的同事帮我编译,因为 他机器上装有Microsoft Visual C++。可是他说碰到太多错误了,压根通不过编译检测,后来就没弄了,所以我不得已自己硬着头皮研究。因为他是用Microsoft Visual C++没弄出来,所以这次我打算用另一种环境MinGW来编译。
在搭建编译环境这里,我走了许多弯路,比如我是先找到了这个页面
http://squid.acmeconsulting.it/buildenvironment.html
后
来才知道这个文档实际上是老版本的MinGW,需要依次安装多个东西,而新版的只有一个东西,在装的时候自己勾选相应的组件就行了。可我下到的版本却是最
新的,用老的办法去装,反而会使得环境内各组件的版本不一致。我编译的时候碰到了错误,搜google才知道原来是环境问题,后来又重新检查环境,我也不
懂,检查不出什么问题。只好又重新看官方文档,后来才发现了这个页面
http://squid.acmeconsulting.it/SquidNT27.html
也就是对于2.7版本的编译方法。看到这里我才发现原来还有第3种编译环境:Cygwin。不过我已经开始用MSYS + MinGW了,所以就先不考虑Cygwin。
在这个页面上,它讲的是搭建MinGW环境需要安装:
MSYS 1.0.9或更高
MinGW 3.1.0或更高
Windows API 2.4.0或更高
MSYS Developer Tool Kit 1.0.1或更高
这4个东西在官方网站上都有下载,不过我们只需要下124这3个就可以了,第3个Windows API在安装MinGW时会自动装上。首先是装MinGW,安装路径为C:msys1.0mingw,装的时候勾选MinGW base tools、g++ compiler、MingW Make这3个即可。然后装MSYS,按默认的路径C:msys1.0装。装完配置时会有3个问题,前2个按y回车,第3个让你输入mingw的路 径,C:/msys/1.0/mingw回车(注意是反斜杠),最后安装msysDTK。这样应该环境就搭建好了。
将下载的squid源代码解压至任何目录(所在路径中不能包含中文),例如c:squidsrc。从开始菜单>MinGW>MSYS启动msys,在命令提示符下输入cd c:squidsrc回车,这样就进入到了squidsrc目录。接下来输入
./configure --prefix=c:/squid --with-maxfd=20480 --disable-wccp --disable-wccpv2 --enable-win32-service --enable-default-hostsfile=none
--prefix=c:/squid表示将程序编译到哪个目录,这个目录也是你发布程序的安装目录。--with-maxfd=20480就是前面 说的文件描述符上限了。这里我把默认的2048改到了20480,应该足够了。--disable-wccp --disable-wccpv2 这2个参数非常重要。我在这个参数上走了很多弯路,主要是没有看到官方最新文档上说,windows下不支持wccp,必须禁掉才能编译。 --enable-win32-service表示可以配置为windows服务,这功能也是必须的, --enable-default-hostsfile=none表示启用但不设置默认的hosts文件路径。这个命令的含义就解释到这里。如果幸运的 话,我下面这段就可以不用看了。
不过我很不幸,又碰到了很多问题。第一个问题是我运行之后,马上报找不到cfgaux/install-sh这个文件,这个问题整了我很久,因为 cfgaux目录下根本没有install-sh这个文件,我去哪弄一个来呢。我先是自己建了个空的文件取名为install-sh,被我骗过去了,但后 面又出现了许多错误,让我明白骗过这一步是没用的。于是又开始google,在一个英文博客上,一个老外也碰到这个问题,另一个牛人解释说,这个可能是编 译环境的问题,说是缺少了一个是lib,但没说具体的解决办法,后来那家伙自己试了下执行bootstrap.sh这个文件,结果就可以了。于是我也找 bootstrap.sh这个文件,果然就在源代码的根目录下。用命令./bootstrap.sh回车执行成功,果然自动在cfgaux下生成了好几个 文件,其中就有install-sh这个东东。果然重新执行前面的./configure命令,就通过了。
如果配置开始了,但输出一小段后就报错结束了,显示什么gcc....no之类的东西,则说明是环境没有搭建成功。我先前就因为环境问题,一直卡在 这里。问题在于我没有把mingw装在C:msys1.0mingw这个目录里,导致编译器找不到mingw的目录,后来我自己剪切过去了才好。
如果配置通过了,那胜利就在眼前了。接下来输入命令make回车。不过我在这一步也卡了很久,原因是一直报一个undefined reference to的错误,找了很久也没找到解决办法。后来无意中看到官方文档说这些文件都是linux下的,在windows下要用dos格式,而我用windows 下的记事本保存过几个源代码文件,尽管没改任何代码,但是一保存文件头就变了,这样导致预编译时将找不到那个文件里的函数,后来我发现只要用 editplus保存就没事了。
如果make也过了,那就接着输入make install命令,就可以把文件编译到c:squid目录了。这样整个编译过程就大功告成了。
看似简单的几个步骤,但是我却走了很大的弯路,其中最主要的原因是我不懂linux,没搞过C编程,所以这一切对我来说都非常陌生,只有摸着石头过河,所以走弯路也是很正常的。不过,经过我的总结,得出以下经验:
1.网络上搜到的资料也许都是过时了的,一定要注意其发表时间,错误的资料比没有资料更可怕。
2.一定要多看官方文档,哪怕它是全英文的,也得慢慢啃完。当然官方文档也要看最新的,最好别像我这么倒霉,总是先看到过时的
3.linux下的文件格式和windows下不同,如果要编辑,最好用editplus或其他专门的文本编辑软件来编辑和保存。
4.源代码的版本不要下错了。我一开始下到个vc++专用的版本,然后用mingw来编译,完全背道而驰,怎么可能成功呢,因为这个错误浪费了我好几天的时间
5.多问google,别轻易放弃,黄天不会负有心人