使用squid、nginx实现代理服务器内网转发

这周要上线一个项目,有台服务器是内网的所以弄起来比较复杂,搞了好几天才搞好,讲下需求以及解决方案。

客户的其它机器都是在内网环境下的,不可访问外网,a(58.212.225.181)为内网服务器,可通过网闸请求到一台外网服务器c(192.168.158.211),因为网站有很多的外链图片,以及接口请求,把所有的图片都抓回来当然也是可以的,但是我觉得用代理的方式解决更好一些,况且很多接口也是必须要请求外网的,这个时候就要想办法通过代理来出去了。

1
a(58.212.225.181) --> 通过网闸 192.168.1.100 访问--> c(192.168.158.211)的80 3128端口

首先,我们要解决图片的问题,我们项目会有很多诸如 http://img11.360buyimg.com/n1/g14/M04/0E/0F/rBEhVVInCfkIAAAAAADYUmG1fPoAAC07QGslDkAANhq075.jpg 此类的外链图片,因为客户本地的电脑是内网环境,不能直接访问外网,这个时候我们就要对所有的图片链接进行处理了,代码为:

1
product.image_url = product.image_url.gsub(/(http:.*\.jpg)/){|m| "/emall_image?url=#{$1}" }

在所有图片url之前加上/emall_image?url= 这样所有的图片请求就都会请求内网服务器a,这个时候看一下内网服务器a(58.212.225.181)的nginx配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
##为所有图片请求添加cache,加快响应速度##
proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_temp_path /home/temp_dir;
proxy_cache_path /home/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
##end##
resolver 8.8.8.8;
server {
listen 80;
server_name localhost 58.212.225.181;
location /emall_image {
proxy_pass http://192.168.1.100/emall_image?url=$arg_url; #如果没有缓存,获取到url,转发到外网服务器c
proxy_cache cache_one;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 301 1d;
proxy_cache_valid any 1m;
expires 30d;
}
}

这个时候,所有的图片请求就会转发到外网服务器c,这个时候我们在来配置一下,外网服务器c(192.168.158.211)的nginx,配置如下:

1
2
3
4
5
6
7
8
resolver 8.8.8.8;
server {
listen 80;
server_name localhost 192.168.1.100;
location /emall_image {
proxy_pass $arg_url; #获取到图片参数url,直接转发
}
}

到此,内网图片就可以通过两次正向代理转发出去。

接下来说下,内网服务器a接口的请求,因为很多接口请求都是https,搜了下nginx对https支持的不是很好,所以就舍弃了通过nginx来转发https的接口请求,后来选择了squid代理http请求,虽说有点大材小用了,不过用着目前还可以。

在外网服务器c(192.168.158.211)上安装squid

1
$sudo apt-get install squid3

一路默认安装完成后,默认路径为 /etc/squid3,修改squid.conf配置文件,如果没有配置文件,就新建一个,然后添加一下两句最简单的。

1
2
http_port 3128 #端口号
http_access allow all #允许所有请求代理

配置完成后,启动squid

1
2
3
$ sudo service squid3 start
$ sudo service squid3 stop
$ sudo service squid3 restart

这个时候代理服务器c就配置好了,然后配置一下内网服务器a,让a(58.212.225.181)请求接口以及apt-get的时候通过代理服务器c(192.168.158.211),来请求外网。
修改 vim .bashrc 添加如下三句

1
2
3
export http_proxy = http://192.168.1.100:3128
export https_proxy = http://192.168.1.100:3128
export ftp_proxy = http://192.168.1.100:3128

然后source .bashrc,这个终端就可以通过代理服务器直接访问外网了,输入命令

1
$ curl http://www.baidu.com

如果请求到了,恭喜你,已经配置成功了,当然我们安装软件的时候也需要用到外网,这个时候就需要配置apt-get 的配置了

1
$ vim /etc/apt/apt.conf

添加如下

1
2
3
Acquire::http::Proxy "http://192.168.1.100:3128"
Acquire::https::Proxy "http://192.168.1.100:3128"
Acquire::ftp::Proxy "http://192.168.1.100:3128"

到此,已经配置完成,就可以直接使用 apt-get install 、git pull等命令了^~^。