使用squid搭建http代理的方法_Linux

來源:互聯網
上載者:User

近期在做一些基礎設施搭建的過程中,又遭遇到了公司http代理的問題。主要是很多主機上的工具只支援不帶身份鑒權資訊的http_proxy設定,如只 支援諸如:export http_proxy='http://10.10.1.1:8090',而不支援export http_proxy='http://tonybai:passwd@10.10.1.1:8090'這種形式的配置。

或是其命令列選項中只提供了proxy_host和proxy_port兩個選項,但並不支援攜帶鑒權資訊。而公司內部要訪問外部資訊還必須通過公司的帶 有身份鑒權的Proxy 伺服器,總而言之,弄得我十分不爽。於是乎產生一個想法:是否可以搭建一個內部http中間代理,部門內部主機通過不帶身份鑒權資訊的代 理配置訪問該中間代理,而該中間代理將內部的所有http request都轉寄到公司代理,同時攜帶配置好的身分識別驗證資訊。

對http代理這事,我完全是個小白啊,於是乎Google開來(恰逢最近Google還不給力,原因你懂的)。

最先試用了一下tinyproxy,這個工具挺小巧簡單,在ubuntu下通過apt-get 可直接安裝,/etc/tinyproxy/tinyproxy.conf的配置也很簡單明了。但設定檔中涉及到轉寄到upstream proxy server的配置行只支援"Upstream host:port"而不支援"Upstream tonybai:passwd@host:port"形式,並且也沒有其他地方支援身份鑒權資訊的配置。在其官方bugzilla上有很多人反映這一情 況,但其最新版本似乎也沒有將這個功能加入,十分遺憾!

於是乎打算換一個重量級的代理工具-nginx。Ubuntu 9.04下預設安裝的nginx是0.65版本。nginx功能雖強大,配置倒並不那麼“複雜”,但問題在於nginx本身似乎更專註於負載平衡和反向代 理,而滿足我這個問題情境的資料甚少。nginx配置命令和變數太多,要想短時間搞清楚這些變數的含義還真是一件困難事。照貓畫虎的嘗試了幾種配 置,也均未能成功。翻閱了國內唯一一本nginx書籍 – 《實戰nginx》,但無奈太厚,翻了三章,索性放下了。換工具!

最傳統的開源免費http代理工具莫過於squid了。估計其市場佔有率也是名列前茅的。Ubuntu 9.04下預設安裝的squid是2.7版本,不算很老,squid官方站至今還提供2.7版本詳細的配置文檔。但squid預設的設定檔可是超級龐 大,總共有近5k行,雖然絕大部分內容都是被注釋掉的。於是乎先用命令過濾出未注釋行,這些行是真正生效的配置。

關於squid如何將收到的http request轉寄到帶身份鑒權的上級http proxy server,網上的資訊也較少,不過還是讓我發現一條。按照這條配置建議做了嘗試。/etc/squid/squid.conf的配置摘要如下:

access_log /var/log/squid/access.log squiddebug_options ALL,1hosts_file /etc/hostscoredump_dir /var/spool/squidacl all src allacl manager proto cache_objectacl localhost src 127.0.0.1/32acl to_localhost dst 127.0.0.0/8 0.0.0.0/32acl localnet src 10.0.0.0/8 # RFC1918 possible internal networkacl localnet src 172.16.0.0/12 # RFC1918 possible internal networkacl localnet src 192.168.0.0/16 # RFC1918 possible internal networkhttp_port 10.10.13.17:3128http_access allow localnethttp_access allow localhosthttp_access deny allcache_peer proxy.yourcompany.com parent port_of_company_httpproxy 0 no-query default login=user:passwdnever_direct allow localnet

配置後,重啟squid(sudo /etc/init.d/squid restart)。將Chrome瀏覽器的代理配置改為該代理,嘗試開啟"baidu.com",陷入漫長等待。於是開啟squid的訪問日誌/var /log/squid/access.log,看到如下失敗資訊:

1353476636.008 0 10.10.13.235 TCP_DENIED/400 1709 GET error:invalid-request – NONE/- text/html
1353476657.337 1 10.10.13.235 TCP_DENIED/400 1709 GET error:invalid-request – NONE/- text/html
1353476691.420 0 10.10.13.235 TCP_DENIED/400 1678 GET error:invalid-request – NONE/- text/htm

居然出錯!換成IE瀏覽器,現象一樣,都是這種錯誤。在/var/log/squid/cache.log中,還能發現下面錯誤:

2012/11/21 13:43:56| clientTryParseRequest: FD 12 (10.10.13.235:4247) Invalid Request

不斷的修改squid.conf配置,不斷地修改瀏覽器代理配置,不斷的失敗。總是修改瀏覽器的代理配置讓我感覺十分費勁,於是我換用curl工具來測試 該代理。curl是可以識別http_proxy環境變數的。將http_proxy環境變數改為export http_proxy=http://10.10.13.17:3128,在命令列敲入curl http://baidu.com,居然得到下面結果:

$ curl http://baidu.com<html><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></html>

再回到access.log觀察,居然看到了下面成功日誌:

1353476863.916 0 10.10.13.235 TCP_HIT/200 677 GET http://baidu.com/ – NONE/- text/html

於是又嘗試用wget下載外部檔案、用subversion訪問外部svn repository、rvm安裝ruby包均告成功!這不就是我想要的結果嗎!居然被我誤打誤撞到了!雖然到目前為止我仍然不知道為何瀏覽器發出的http request不能被識別^_^。

Squid這個http代理功能十分強大,本身就是被很多企業作為公司級http代理的工具的。其配置參考足足可以寫成一本厚厚的書(市面上已經有這種書),還好我的情境用不到那些稀奇古怪的配置,目前這種狀態足矣!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.