squid是什么我這里就不說了,這不是本文的重點(diǎn),總之它是一個(gè)集:代理、加速、緩存、負(fù)載均衡、防盜鏈、訪問控制等多功能的一個(gè)超牛X開源軟件,如今已經(jīng)廣泛應(yīng)用于很多領(lǐng)域。對于緩存和加速這一領(lǐng)域,如今各大門戶網(wǎng)站都是用它做的CDN服務(wù)。
我的網(wǎng)站由于訪問量比較大,一臺服務(wù)器根本支撐不起,所以我研究了一下它,并成功的搭建了CDN服務(wù),由多臺服務(wù)器組建了一個(gè)簡單的CDN網(wǎng)絡(luò)來達(dá)到負(fù)載均衡的效果。但同時(shí)我也發(fā)現(xiàn)了一個(gè)問題,squid官方提供的最新穩(wěn)定版本(squid-2.7stable4)默認(rèn)的文件描述符(file descriptors)為2048個(gè),一般來說一個(gè)HTTP請求會(huì)打開一個(gè)文件描述符,假如有一個(gè)網(wǎng)頁,代碼里有3個(gè)js,1個(gè)css,10張圖片,那么每個(gè)訪問者打開這個(gè)頁面都將打開15個(gè)文件描述符,這樣當(dāng)這臺緩存服務(wù)器同時(shí)被很多人訪問時(shí),文件描述符很快就會(huì)被用完,接著網(wǎng)站偶爾就會(huì)打不開,日志里會(huì)報(bào)WARNING! Your cache is running out of filedescriptors這樣的錯(cuò)誤。
到網(wǎng)上搜了一下,唯一的解決辦法是重新編譯一下squid的源代碼,用參數(shù)--with-maxfd。但網(wǎng)上搜到的編譯方法都是在linux下的,我沒有看到有哪個(gè)在windows下使用squid并且在windows下編譯的。我經(jīng)過大半個(gè)月的研究,克服了重重困難和問題,最終成功的在windows下編譯了squid,為了后人不像我這樣由于搜不到任何資料,發(fā)貼詢問也無人能解決,幾乎絕望的放棄,所以我把自己成功的經(jīng)驗(yàn)和走的一些彎路發(fā)出來,希望以后搜索到這篇文章的人可以借鑒和參考。
我下載了官方提供的一份最新的源代碼,首先要解決的問題是怎么編譯。官方文檔全英文的,看得我眼睛疼,看了半天終于看懂了,大致是說有2種環(huán)境可以在windows下編譯squid,一種是基于Microsoft Visual C++,另一種是基于MinGW。由于我不是搞C的,也沒弄過linux,對于這些簡直是七竅通了六竅。在此之前我請了一個(gè)搞C++的同事幫我編譯,因?yàn)樗麢C(jī)器上裝有Microsoft Visual C++??墒撬f碰到太多錯(cuò)誤了,壓根通不過編譯檢測,后來就沒弄了,所以我不得已自己硬著頭皮研究。因?yàn)樗怯肕icrosoft Visual C++沒弄出來,所以這次我打算用另一種環(huán)境MinGW來編譯。
在搭建編譯環(huán)境這里,我走了許多彎路,比如我是先找到了這個(gè)頁面
http://squid.acmeconsulting.it/buildenvironment.html
后來才知道這個(gè)文檔實(shí)際上是老版本的MinGW,需要依次安裝多個(gè)東西,而新版的只有一個(gè)東西,在裝的時(shí)候自己勾選相應(yīng)的組件就行了。可我下到的版本卻是最新的,用老的辦法去裝,反而會(huì)使得環(huán)境內(nèi)各組件的版本不一致。我編譯的時(shí)候碰到了錯(cuò)誤,搜google才知道原來是環(huán)境問題,后來又重新檢查環(huán)境,我也不懂,檢查不出什么問題。只好又重新看官方文檔,后來才發(fā)現(xiàn)了這個(gè)頁面
http://squid.acmeconsulting.it/SquidNT27.html
也就是對于2.7版本的編譯方法??吹竭@里我才發(fā)現(xiàn)原來還有第3種編譯環(huán)境:Cygwin。不過我已經(jīng)開始用MSYS + MinGW了,所以就先不考慮Cygwin。
在這個(gè)頁面上,它講的是搭建MinGW環(huán)境需要安裝:
MSYS 1.0.9或更高
MinGW 3.1.0或更高
Windows API 2.4.0或更高
MSYS Developer Tool Kit 1.0.1或更高
這4個(gè)東西在官方網(wǎng)站上都有下載,不過我們只需要下124這3個(gè)就可以了,第3個(gè)Windows API在安裝MinGW時(shí)會(huì)自動(dòng)裝上。首先是裝MinGW,安裝路徑為C:\msys\1.0\mingw,裝的時(shí)候勾選MinGW base tools、g++ compiler、MingW Make這3個(gè)即可。然后裝MSYS,按默認(rèn)的路徑C:\msys\1.0裝。裝完配置時(shí)會(huì)有3個(gè)問題,前2個(gè)按y回車,第3個(gè)讓你輸入mingw的路徑,C:/msys/1.0/mingw回車(注意是反斜杠),最后安裝msysDTK。這樣應(yīng)該環(huán)境就搭建好了。
將下載的squid源代碼解壓至任何目錄(所在路徑中不能包含中文),例如c:\squidsrc。從開始菜單>MinGW>MSYS啟動(dòng)msys,在命令提示符下輸入cd c:\squidsrc回車,這樣就進(jìn)入到了squidsrc目錄。接下來輸入
./configure --prefix=c:/squid --with-maxfd=20480 --disable-wccp --disable-wccpv2 --enable-win32-service --enable-default-hostsfile=none
--prefix=c:/squid表示將程序編譯到哪個(gè)目錄,這個(gè)目錄也是你發(fā)布程序的安裝目錄。--with-maxfd=20480就是前面說的文件描述符上限了。這里我把默認(rèn)的2048改到了20480,應(yīng)該足夠了。--disable-wccp --disable-wccpv2 這2個(gè)參數(shù)非常重要。我在這個(gè)參數(shù)上走了很多彎路,主要是沒有看到官方最新文檔上說,windows下不支持wccp,必須禁掉才能編譯。--enable-win32-service表示可以配置為windows服務(wù),這功能也是必須的, --enable-default-hostsfile=none表示啟用但不設(shè)置默認(rèn)的hosts文件路徑。這個(gè)命令的含義就解釋到這里。如果幸運(yùn)的話,我下面這段就可以不用看了。
不過我很不幸,又碰到了很多問題。第一個(gè)問題是我運(yùn)行之后,馬上報(bào)找不到cfgaux/install-sh這個(gè)文件,這個(gè)問題整了我很久,因?yàn)閏fgaux目錄下根本沒有install-sh這個(gè)文件,我去哪弄一個(gè)來呢。我先是自己建了個(gè)空的文件取名為install-sh,被我騙過去了,但后面又出現(xiàn)了許多錯(cuò)誤,讓我明白騙過這一步是沒用的。于是又開始google,在一個(gè)英文博客上,一個(gè)老外也碰到這個(gè)問題,另一個(gè)牛人解釋說,這個(gè)可能是編譯環(huán)境的問題,說是缺少了一個(gè)是lib,但沒說具體的解決辦法,后來那家伙自己試了下執(zhí)行bootstrap.sh這個(gè)文件,結(jié)果就可以了。于是我也找bootstrap.sh這個(gè)文件,果然就在源代碼的根目錄下。用命令./bootstrap.sh回車執(zhí)行成功,果然自動(dòng)在cfgaux下生成了好幾個(gè)文件,其中就有install-sh這個(gè)東東。果然重新執(zhí)行前面的./configure命令,就通過了。
如果配置開始了,但輸出一小段后就報(bào)錯(cuò)結(jié)束了,顯示什么gcc....no之類的東西,則說明是環(huán)境沒有搭建成功。我先前就因?yàn)榄h(huán)境問題,一直卡在這里。問題在于我沒有把mingw裝在C:\msys\1.0\mingw這個(gè)目錄里,導(dǎo)致編譯器找不到mingw的目錄,后來我自己剪切過去了才好。
如果配置通過了,那勝利就在眼前了。接下來輸入命令make回車。不過我在這一步也卡了很久,原因是一直報(bào)一個(gè)undefined reference to的錯(cuò)誤,找了很久也沒找到解決辦法。后來無意中看到官方文檔說這些文件都是linux下的,在windows下要用dos格式,而我用windows下的記事本保存過幾個(gè)源代碼文件,盡管沒改任何代碼,但是一保存文件頭就變了,這樣導(dǎo)致預(yù)編譯時(shí)將找不到那個(gè)文件里的函數(shù),后來我發(fā)現(xiàn)只要用editplus保存就沒事了。
如果make也過了,那就接著輸入make install命令,就可以把文件編譯到c:\squid目錄了。這樣整個(gè)編譯過程就大功告成了。
看似簡單的幾個(gè)步驟,但是我卻走了很大的彎路,其中最主要的原因是我不懂linux,沒搞過C編程,所以這一切對我來說都非常陌生,只有摸著石頭過河,所以走彎路也是很正常的。不過,經(jīng)過我的總結(jié),得出以下經(jīng)驗(yàn):
1.網(wǎng)絡(luò)上搜到的資料也許都是過時(shí)了的,一定要注意其發(fā)表時(shí)間,錯(cuò)誤的資料比沒有資料更可怕。
2.一定要多看官方文檔,哪怕它是全英文的,也得慢慢啃完。當(dāng)然官方文檔也要看最新的,最好別像我這么倒霉,總是先看到過時(shí)的
3.linux下的文件格式和windows下不同,如果要編輯,最好用editplus或其他專門的文本編輯軟件來編輯和保存。
4.源代碼的版本不要下錯(cuò)了。我一開始下到個(gè)vc++專用的版本,然后用mingw來編譯,完全背道而馳,怎么可能成功呢,因?yàn)檫@個(gè)錯(cuò)誤浪費(fèi)了我好幾天的時(shí)間
5.多問google,別輕易放棄,黃天不會(huì)負(fù)有心人