用squid做http/https正向代理

之前用nginx做前向代理,但是发现不支持https的代理。也就是如果`proxies = {'https': 'http://127.0.0.1:64441'}` 是会出现问题的。好像在一个nginx group里面作者也说到不会支持https代理,因为squid已经很好地完成了这件事情。

用squid做https前向代理也不是特别麻烦的事情,虽然默认配置文件中选项很多,但是如果squid是躲在防火墙后面的话,其实只需要下面几行配置就行。

http_access allow all
http_port 64441

允许所有的连接,然后代理端口开在64441上。

配置完成后使用requests来试试

In [9]: import requests

In [10]: ss = requests.session()

In [11]: ss.proxies = {'http': 'http://127.0.0.1:64441', 'https':'http://127.0.0.1:64441'}

In [12]: ss.get('http://www.github.com')
Out[12]: <Response [200]>

In [13]: ss.get('https://www.github.com')
Out[13]: <Response [200]>

UDPATE @ 2016-06-24

此外squid还有一个非常牛的特性, 就是层次代理

假设我们需要定期地切换代理服务器的话, 一种方式是定期更新代码(或者配置)并且重启. 另外一种更好的方式是, 本地启动一个squid代理, 而这个代理会将请求转发到其他代理上面. 然后我们只需要定时更新本地squid代理的配置文件, 然后重启这个本地代理即可.

http_access allow all
http_port 64441
read_timeout 10 seconds
request_timeout 10 seconds

cache_peer ec2-52-197-85-24.ap-northeast-1.compute.amazonaws.com parent 64441 0 no-query round-robin
cache_peer ec2-52-69-241-115.ap-northeast-1.compute.amazonaws.com parent 64441 0 no-query round-robin
cache_peer ec2-52-197-74-230.ap-northeast-1.compute.amazonaws.com parent 64441 0 no-query round-robin
cache_peer ec2-52-196-170-84.ap-northeast-1.compute.amazonaws.com parent 64441 0 no-query round-robin

never_direct allow all
#prefer_direct off
#nonhierarchical_direct off

按照上面这个模板文件, 只需要重新生成`cache-peer`这个部分配置就行. aws-ec2支持脚本批量创建和删除ec2实例. 所以这个自动化应该不难做.