代理分為正向代理和反向代理,本次就來演示一下Nginx配置正向代理和反向代理的場景。 順便講解一下正向代理和反向代理的區別正向代理和反向代理的區別
Nginx 反向代理與正向代理
Nginx
首先,我們需要知道什么是反向代理和正向代理區別
一、正向代理
正向代理簡單的來說就是我們的代理服務器代替用戶去請求后端節點
nginx正向代理代替工具還有goproxy
為什么要使用正向代理
用戶無法直接訪問服務器B?(常見例子就是我們使用的Shadowsocks)
Cache緩存作用
cache緩存技術和代理服務技術是緊密聯系的(不只是正向代理使用cache緩存,反向代理同時也使用緩存)簡單的來說就是用戶A訪問了代理服務器,那么代理服務器會將用戶A的數據保存一段時間,如果該時間段呢用戶B同時也訪問了代理服務器,那么代理服務器將不會直接請求服務器B,而是直接將緩存直接返回給用戶A
攔截訪問
假設用戶A和用戶B都設置了代理服務器,用戶A允許訪問互聯網,而用戶B不允許防火互聯網(這個代理服務器Z上做限制)這樣用戶A因為授權,可以通過代理服務器訪問到服務器C,而用戶B因為沒有被代理服務器授權時,數據包會直接丟棄
隱藏訪問者
我們可以看出服務器C并不知道訪問自己的實際是用戶A,因為代理服務器Z代替用戶A去直接與服務器C進行交互,如果代理服務器Z完全被用戶A控制(或不完全控制)會慣以肉雞術語稱呼
正向代理總結
正向代理是一個位于客戶端和原始服務器(origin server)之前的服務器,為了從原始服務器獲取內容,客戶端向代理發送一個請求并指定目標,然后代理服務器向原始服務器轉交請求并將獲得的內容返回給客戶端。客戶端必須設置正向代理服務器。(類似于我們的ss服務)
二、反向代理
反向代理正好與正向代理相反,對于客戶端而言代理服務器就像是原始服務器,并且客戶端不需要進行任何特別的設置。客戶端向反向代理發送普通請求,接著反向代理將判斷向何處(后端節點)轉交請求,并將獲得的內容返回給客戶端
通常的代理服務器,只用于代理內部網絡對Internet的連接請求,客戶機必須指定代理服務器,并將本來要直接發送到Web服務器上的http請求發送到代理服務器中,當一個代理服務器能夠代理外部網絡上的主機,訪問內部網絡時,這種代理服務的方式成為反向代理服務
透明代理
透明代理的意思是客戶端根本不需要指定有代理服務器的存在,改變你的request fields(報文),并會傳送真實IP,注意加密的透明代理則屬于匿名代理,意思是不用設置代理了。透明代理實踐的例子就是很多公司所使用的行為管理軟件
當用戶A和用戶B并不知道行為管理設備充當透明代理行為,用戶A或者用戶B向服務器A或者服務器B提交請求的時候,透明代理設備根據自身策略攔截并修改用戶A或B的報文,并作為實際的請求方,向服務器A或者B發送請求,當接受信息回傳,透明代理再根據自身的設置把允許的保存發回至用戶A或B,如果透明代理設置不允許訪問服務器B,那么用戶A或者用戶B就不會得到服務器B的數據
三、正向代理配置測試
我們使用nginx代理上網為例子進行演示nginx正向代理
下載并安裝nginx (正向代理不需要單獨的模塊)
我們使用2臺服務器都進行如下操作
10.4.82.140 tomcat.i4t.com 為后端應用服務(域名為tomcat.i4t.com)
10.4.82.142 nginx.i4t.com 為代理服務器(域名為nginx.i4t.com)
請仔細閱讀本段?首先我們代理服務器幾乎不進行任何配置,只是一個普通的nginx代理,所有修改nginx的配置都是在代理服務器上添加
兩臺nginx默認配置如下
1.nginx版本沒有太大要求
wgethttp://nginx.org/download/nginx-1.10.3.tar.gz
#按照依賴包
yuminstall-ygccglibcgcc-c++prce-developenssl-develpcre-devel
useradd-s/sbin/nologinnginx-M
tarxfnginx-1.10.3.tar.gz&&cdnginx-1.10.3
#編譯
./configure--prefix=/usr/local/nginx-1.10.3--user=nginx--group=nginx--with-http_ssl_module--with-http_stub_status_module
檢查
/usr/loca/nginx/sbin/nginx-t
啟動
/usr/local/nginx/sbin/nginx
查看服務器是否啟動
netstat-lntp|grepnginx
tcp000.0.0.0:800.0.0.0:*LISTEN? ? ? 7058/nginx:master
接下來是配置nginx代理
首先我們先配置2臺nginx服務器
1.先配置nginx.i4t.com nginx信息
#配置10.4.82.142 后端服務器
cat /usr/local/nginx/conf/nginx.conf
user? nginx;
worker_processes? 1;
events {
? ? worker_connections? 1024;
}
http {
? ? include? ? ? mime.types;
? ? default_type? application/octet-stream;
log_format? main'$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
? ? access_log? logs/access.log? main;
? ? sendfile? ? ? ? on;
? ? tcp_nopush? ? on;
? ? keepalive_timeout? 65;
? ? gzip? on;
? ? server {
? ? ? ? listen? ? ? 80;
? ? ? ? server_name? nginx.i4t.com;
? ? ? ? location / {
root? /usr/local/nginx/html;
? ? ? ? }
? ? }
}
echo"nginx.i4t.com">/usr/local/nginx/html/index.html
/usr/local/nginx/sbin/nginx -s reload
此時nginx.i4t.com域名訪問如下
接下來配置后端服務器
代理服務器默認配置
10.4.82.140
以下是后端服務器默認配置
usernginx;
worker_processes1;
events{
worker_connections1024;
}
http{
includemime.types;
default_typeapplication/octet-stream;
log_formatmain'$remote_addr-$remote_user[$time_local] "$request" '
'$status$body_bytes_sent"$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_loglogs/access.log? main;
sendfileon;
keepalive_timeout65;
server{
listen80;
server_nametomcat.i4t.com;
location/ {
roothtml;
indexindex.html index.htm;
}
}
}
echo" tomcat.i4t.com">/usr/local/nginx/html/index.html
/usr/local/nginx/sbin/nginx? -s reload
tomcat.i4t.com后端服務器的訪問內容如下
接下來我們將tomcat.i4t.com 也就是10.4.82.140進行配置權限
#只允許10.4.82.142訪問
cat /usr/local/nginx/conf/nginx.conf
user? nginx;
worker_processes? 1;
events {
? ? worker_connections? 1024;
}
http {
? ? include? ? ? mime.types;
? ? default_type? application/octet-stream;
????log_format? main'$remote_addr - $remote_user [$time_local] "$request" '
????'$status $body_bytes_sent "$http_referer" '
????'"$http_user_agent" "$http_x_forwarded_for"';
? ? access_log? logs/access.log? main;
? ? sendfile? ? ? ? on;
? ? tcp_nopush? ? on;
? ? keepalive_timeout? 65;
? ? gzip? on;
? ? server {
? ? ? ? listen? ? ? 80;
? ? ? ? server_name? tomcat.i4t.com;
? ? ? ? resolver 8.8.8.8;
? ? ? ? location / {
????????????????????proxy_pass$scheme://$host$request_uri;
????????????????????if($remote_addr!~*"10.4.82.142") {
????????????????????return403;
? ? ? ? }
????????root? /usr/local/nginx/html;
? ? ? ? }
? ? }
}
#proxy_pass $scheme://$host(請求的域名)$request_uri; 域名后面參數
#resolver DNS地址,可以不寫
我們可以看到我們現在電腦已經無法訪問tomcat.i4t.com,需要注意的是,我們只是修改了tomcat.i4t.com的代理,nginx.i4t.com依舊可以正常訪問的
現在我們進行代理配置
windows配置如下
IE-->Internet選項-->連接-->局域網設置-->代理服務器
mac設置如下
Linux
exporthttp_proxy=http://10.4.82.142:80
wget http://tomcat.i4t.com
這時候我們訪問tomcat.i4t.com就是200,狀態
四、反向代理配置測試
安裝和上面編譯安裝一樣,沒有特殊模塊。只需要修改配置文件
cat/usr/local/nginx/conf/nginx.conf
user? www;
worker_processes1;
events{
worker_connections1024;
}
http{
includemime.types;
default_typeapplication/octet-stream;
log_formatmain'$remote_addr-$remote_user[$time_local] "$request" '
'$status$body_bytes_sent"$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_loglogs/access.log? main;
sendfileon;
tcp_nopushon;
keepalive_timeout65;
gzipon;
server{
listen80;
server_namenginx.i4t.com;
location/ {
proxy_passhttp://abcdocker;
proxy_set_headerHost$host;
proxy_set_headerX-Real-IP$remote_addr;
proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;
}
}
upstreamabcdocker {
server10.4.82.140:8080;
server127.0.0.1:8080;
}
}
#proxy_pass 代理節點,可以用ip+端口
#upstream 后面寫名稱
#server 后端節點名稱
訪問驗證,我們訪問nginx.i4t.com域名打開的是tomcat后端節點
請注意緩存(google瀏覽器緩存不是很好清理)