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. Visual Studio跨平台开发(1):Hello Xamarin!

    前言 应用程序发展的脚步, 从来没有停过. 从早期的Windows 应用程序, 到网络时代的web 应用程序, 再到近几年相当盛行的行动装置应用程序(Mobile Application), 身为C# ...

  2. uva10857(状态压缩DP)

    uva10857 题意 兔子希望在平面上 n 个点上放蛋,每个点最多放一个蛋,初始兔子在 (0, 0) 点,这里有无数个蛋,兔子可以回到这个点取蛋,兔子的速度为 \(v * 2^{-i}\)(i 为携 ...

  3. 浅析Oracle PL/SQL 学习--未完待续

    这是一篇关于Oracle Pl/SQL数据库编程的课程学习分享... 首先说明几点: 学习这门课程之前,已经学过并且掌握一些基础的SQL语句.数据库结构分析.ER图设计等知识: 这里也只是较为大概地将 ...

  4. Java 根据年月日精确计算年龄

    import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * Created b ...

  5. Word中如何公式居中标号右对齐

    1.鼠标居中 2.插入一行三列表格 3.选中第一个表格,右键-表格属性-单元格-选项:然后回到单元格设置垂直居中,宽度为15%,同理第三个单元格,不过中间单元格也要设置,宽度为70%,这个word没有 ...

  6. 【Linux】CentOS7上安装JDK 和卸载 JDK 【rpm命令的使用】

    之前有过一篇在CentOS7上安装JDK的文章:http://www.cnblogs.com/sxdcgaq8080/p/7492426.html 在这里又说一次,是要使用rpm命令安装JDK的rpm ...

  7. background属性总结,background-image路径问题相对于css和js

    (1)background属性总结 background 简写属性在一个声明中设置所有的背景属性. 可以设置如下属性:background-color规定要使用的背景颜色.background-pos ...

  8. BindDepthStencilState

    nx sdk里面有这么一个接口 真坑 对于stencil fun op有两组值分别对应front back face 现在调用这个接口只能设置back 不能设置front跟了memory 有段全是0把 ...

  9. JS方面重点摘要(二)

    1.函数声明与函数表达式 (1)变量声明会置顶提前,但赋值仍在原地方(2)函数声明同变量声明一样会提前:但是,函数表达式没有提前,就相当于平时的变量赋值(3)函数声明会覆盖变量声明,但不会覆盖变量赋值 ...

  10. ruby ide

    uby 是个动态面向对象.通用的编程语言.它支持多种编程范式,包括面向功能和面向对象.同时它也包括一个动态类型系统和自动内存管理. 编辑器和集成开发环境(IDE)有些不同,编辑器是用来添加,编辑,查看 ...