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:\msys\1.0\mingw,装的时候勾选MinGW base
tools、g++ compiler、MingW
Make这3个即可。然后装MSYS,按默认的路径C:\msys\1.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:\msys\1.0\mingw这个目录里,导致编译器找不到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,别轻易放弃,黄天不会负有心人

[分享]windows下编译squid的经验(转)的更多相关文章

  1. Windows下编译objective-C

    Windows下编译objective-C 2011-08-31 14:32 630人阅读 评论(0) 收藏 举报 windowscocoa工具objective clibraryxcode   目录 ...

  2. Windows下编译最新版ChezScheme

    据说ChezScheme是最快的神级编译器,一秒钟几百万行,王垠说的2秒内编译自身绝不是夸张(看这里<揭秘Chez Scheme>,Scheme中文社区).ChezScheme由美国印第安 ...

  3. [转] Windows下编译OpenSSL

    简述 OpenSSL是一个开源的第三方库,它实现了SSL(Secure SocketLayer)和TLS(Transport Layer Security)协议,被广泛企业应用所采用.对于一般的开发人 ...

  4. 在Windows下编译FFmpeg详细说明

    MinGW:一个可自由使用和自由发布的Windows特定头文件和使用GNC工具集导入库的集合,允许你生成本地的Windows程序而不需要第三方C运行时 MinGW,即 Minimalist GNU F ...

  5. 如何在WINDOWS下编译BOOST C++库 .

    如何在WINDOWS下编译BOOST C++库 cheungmine 2008-6-25   写出来,怕自己以后忘记了,也为初学者参考.使用VC8.0和boost1.35.0.   1)下载boost ...

  6. 在Windows下编译OpenSSL(VS2005和VC6)

    需要说明的是请一定安装openssl-0.9.8a .  openssl-1.0.0我没有编译成功. 如何在Windows下编译OpenSSL (Vs2005使用Vc8的cl编译器)1.安装Activ ...

  7. windows下编译java源文件的编码错误

    import java.util.Arrays;public class ArrayAsAReference{ public static void main(String[] args) { int ...

  8. Windows下编译SDL

    Windows下编译SDL的理由我就不多说了,无论用VS来编译或调试SDL库都是很方便的.而且SDL源代码中也包含了VC工程,你所要做的只是解压VC工程,进行适当的配置,然后编译.调试. 编译SDL大 ...

  9. Windows下编译安装 FFmpeg

    在Linux/Mac下编译 ffmpeg是非常方便的.但要在 Windows下编译 ffmpeg还真要花点时间.以下就是在 Windowns下编译ffmpeg的步骤: 一.安装Cygwin 在wind ...

随机推荐

  1. C#中使用7Z进行压缩解压

    SevenZipSharp相关文档下载地址: http://sevenzipsharp.codeplex.com/releases/view/51254 1. 解决方案中添加引用:SevenZipSh ...

  2. (20)C#泛型

    泛型的定义:通过参数化类型来实现在同一份代码上操作多种数据类型.泛型编程时一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用. 优点: 1.省去了拆箱.装箱 2.提高安全性 3. ...

  3. POJ 3470 Walls(线段树+扫描线)

    [题目链接] http://poj.org/problem?id=3470 [题目大意] 给出几面墙,均垂直于x轴或者y轴,给出一些鸟的位置(二维坐标点), 鸟只会垂直x轴或者y轴飞行,并且会撞上最近 ...

  4. 【面试题】2018年最全Java面试通关秘籍 四套!(无答案)

    http://mp.weixin.qq.com/s/RQMQUufCbwlkAK62y57DAw 第一套:<2018年最全Java面试通关秘籍第一套!> 第二套:<2018年最全Ja ...

  5. Bluetooth篇 开发实例之八 匹配

    自己写的App匹配蓝牙设备,不需要通过系统设置去连接. 匹配和通信是两回事. 用过Android系统设置(Setting)的人都知道蓝牙搜索之后可以建立配对和解除配对,但是这两项功能的函数没有在SDK ...

  6. SQL Server Profiler和数据库引擎优化顾问

    原文:SQL Server Profiler和数据库引擎优化顾问  简介 说到Sql的[性能工具]真是强大,SQL Server Profiler的中文意思是SQL Server事件探查,这个到底 ...

  7. java中终止线程的三种方式

    在java中有三种方式可以终止线程.分别为: 1.  使用退出标志,使线程正常退出,也就是当run方法完成后线程终止.  2.  使用stop方法强行终止线程(这个方法不推荐使用,因为stop和sus ...

  8. mipmap一

    讲一下mipmap 生成的时候 指定texture 的mipmaplevel 8 然后memory自动就会那么大的 画的时候要在lineraspace(因为我是gpucopy所以不涉及这个问题 可能) ...

  9. PC-LINT

    静态代码检查工具PC-Lint(一) 2006-12-07 23:50   C/C++语言的语法拥有其它语言所没有的灵活性,这种灵活性带来了代码效率的提升,但相应增加了代码中存在隐患的可能性.静态代码 ...

  10. oracle deadlock

    Basic operation su - oracle sqlplus / as sysdba show parameter background show parameter user_dump_d ...