使用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;
}
}