總結:正向非常簡單理解,就是委托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;
}
}