总结:正向非常简单理解,就是委托C帮我访问,出了事也都是C兜着,C这里仅仅是一个傻傻的替人干活和顶雷的工具,说白了就是A在本地wget拽B的资源不行,但在C上wget是可以拽下来B的资源的(当然这里C也得是一个server进程,因为要侦听端口等待A来访问,还要返回结果给A);干反向代理的C不再是那么简单的一个工具了,而是一个真正意义上的service,可以综合考虑A的需求和B的服务能力来做智能转发,因此会具有负载均衡的能力(当然这里也可以使用最简化版的C,即:C也只是一股脑的单纯的把请求转发给B,在这种意义上,貌似感觉反向干的还是正向干的事,实则不然,关键在于B,对于正向而言B是一个特定的资源,例如B可以是https://www.zhihu.com/question/19761434,也可以是http://blog.csdn.net/physicsdandan/article/details/45667357;对于反向而言,B只能是一个或几个特定的服务地址,例如http://10.138.20.241:8834/,请求都是转给这一个或这几个特定服务地址的,当然这个特定服务地址也有可能又是proxy)
反向:把内网的资源暴露给外部访问;
3。能做代理的软件:
a. nginx:正反都可以,但不支持https;
b. 正向代理支持https的:http://www.oki-osk.jp/esc/python/proxy/TinyHTTPProxy-0.2.1.zip就一个python文件,最简单易用,已经测试过svn可以用它(配置下~/.subversion/servers里的[global]下的http-proxy-host和http-proxy-port就可以了),更多的参见https://www.zhihu.com/question/19871146;
4。一句话总结:
都是把http请求进行转发,调整几个header字段而已;反向代理主要干内网暴露和负载均衡这两件事;
最后附上nginx正反向代理的配置模板:
正向代理:
server {
resolver 8.8.8.8;
resolver_timeout 5s;
listen 8081;
location / {
proxy_pass $scheme://$http_host$request_uri;
proxy_set_header Host $http_host;
proxy_buffers 256 8k;
proxy_max_temp_file_size 0;
proxy_connect_timeout 30;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;
}
}
反向代理:
upstream apachephp {
server ip:8080;
}
server {
listen 80;
server_name www.myblog.cn;
access_log logs/quancha.access.log main;
error_log logs/quancha.error.log;
root html;
index index.html index.htm index.php;
## send request back to apache ##
location / {
proxy_pass http://apachephp;
#Proxy Settings
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}