Nginx 反向代理與正向代理

代理分為正向代理和反向代理,本次就來演示一下Nginx配置正向代理和反向代理的場景。 順便講解一下正向代理和反向代理的區別正向代理和反向代理的區別

Nginx 反向代理與正向代理

Nginx


首先,我們需要知道什麼是反向代理和正向代理區別

一、正向代理

Nginx 反向代理與正向代理

正向代理簡單的來說就是我們的代理服務器代替用戶去請求後端節點

nginx正向代理代替工具還有goproxy

為什麼要使用正向代理

  • 用戶無法直接訪問服務器B (常見例子就是我們使用的Shadowsocks)
Nginx 反向代理與正向代理

  • Cache緩存作用

cache緩存技術和代理服務技術是緊密聯繫的(不只是正向代理使用cache緩存,反向代理同時也使用緩存)簡單的來說就是用戶A訪問了代理服務器,那麼代理服務器會將用戶A的數據保存一段時間,如果該時間段呢用戶B同時也訪問了代理服務器,那麼代理服務器將不會直接請求服務器B,而是直接將緩存直接返回給用戶A

  • 攔截訪問
Nginx 反向代理與正向代理

假設用戶A和用戶B都設置了代理服務器,用戶A允許訪問互聯網,而用戶B不允許防火互聯網(這個代理服務器Z上做限制)這樣用戶A因為授權,可以通過代理服務器訪問到服務器C,而用戶B因為沒有被代理服務器授權時,數據包會直接丟棄

  • 隱藏訪問者
Nginx 反向代理與正向代理

我們可以看出服務器C並不知道訪問自己的實際是用戶A,因為代理服務器Z代替用戶A去直接與服務器C進行交互,如果代理服務器Z完全被用戶A控制(或不完全控制)會慣以肉雞術語稱呼

  • 正向代理總結

正向代理是一個位於客戶端和原始服務器(origin server)之前的服務器,為了從原始服務器獲取內容,客戶端向代理發送一個請求並指定目標,然後代理服務器向原始服務器轉交請求並將獲得的內容返回給客戶端。客戶端必須設置正向代理服務器。(類似於我們的ss服務)

二、反向代理

反向代理正好與正向代理相反,對於客戶端而言代理服務器就像是原始服務器,並且客戶端不需要進行任何特別的設置。客戶端向反向代理發送普通請求,接著反向代理將判斷向何處(後端節點)轉交請求,並將獲得的內容返回給客戶端

通常的代理服務器,只用於代理內部網絡對Internet的連接請求,客戶機必須指定代理服務器,並將本來要直接發送到Web服務器上的http請求發送到代理服務器中,當一個代理服務器能夠代理外部網絡上的主機,訪問內部網絡時,這種代理服務的方式成為反向代理服務

Nginx 反向代理與正向代理

  • 透明代理

透明代理的意思是客戶端根本不需要指定有代理服務器的存在,改變你的request fields(報文),並會傳送真實IP,注意加密的透明代理則屬於匿名代理,意思是不用設置代理了。透明代理實踐的例子就是很多公司所使用的行為管理軟件

Nginx 反向代理與正向代理

當用戶A和用戶B並不知道行為管理設備充當透明代理行為,用戶A或者用戶B向服務器A或者服務器B提交請求的時候,透明代理設備根據自身策略攔截並修改用戶A或B的報文,並作為實際的請求方,向服務器A或者B發送請求,當接受信息回傳,透明代理再根據自身的設置把允許的保存發回至用戶A或B,如果透明代理設置不允許訪問服務器B,那麼用戶A或者用戶B就不會得到服務器B的數據

三、正向代理配置測試

我們使用nginx代理上網為例子進行演示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默認配置如下

<code>1.nginx版本沒有太大要求wget http://nginx.org/download/nginx-1.10.3.tar.gz#按照依賴包yum install -y gcc glibc gcc-c++ prce-devel openssl-devel pcre-develuseradd -s /sbin/nologin nginx -M tar xf nginx-1.10.3.tar.gz && cd nginx-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|grep nginx    tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      7058/nginx: master/<code>

接下來是配置nginx代理

首先我們先配置2臺nginx服務器

1.先配置nginx.i4t.com nginx信息

<code>#配置10.4.82.142 後端服務器cat /usr/local/nginx/conf/nginx.confuser  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/<code>

此時nginx.i4t.com域名訪問如下

Nginx 反向代理與正向代理

接下來配置後端服務器

代理服務器默認配置

10.4.82.140

以下是後端服務器默認配置

<code>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;    keepalive_timeout  65;    server {        listen       80;        server_name  tomcat.i4t.com;        location / {            root   html;            index  index.html index.htm;        }   }} echo " tomcat.i4t.com" >/usr/local/nginx/html/index.html /usr/local/nginx/sbin/nginx  -s reload/<code>

tomcat.i4t.com後端服務器的訪問內容如下

Nginx 反向代理與正向代理

接下來我們將tomcat.i4t.com 也就是10.4.82.140進行配置權限

<code>#只允許10.4.82.142訪問cat /usr/local/nginx/conf/nginx.confuser  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") {            return 403;        }        root   /usr/local/nginx/html;        }    }}#proxy_pass $scheme://$host(請求的域名)$request_uri; 域名後面參數#resolver DNS地址,可以不寫/<code>

我們可以看到我們現在電腦已經無法訪問tomcat.i4t.com,需要注意的是,我們只是修改了tomcat.i4t.com的代理,nginx.i4t.com依舊可以正常訪問的

Nginx 反向代理與正向代理

現在我們進行代理配置

  • windows配置如下

IE-->Internet選項-->連接-->局域網設置-->代理服務器

Nginx 反向代理與正向代理

  • mac設置如下
Nginx 反向代理與正向代理

Nginx 反向代理與正向代理

  • Linux
<code>export http_proxy=http://10.4.82.142:80wget http://tomcat.i4t.com/<code>
Nginx 反向代理與正向代理

這時候我們訪問tomcat.i4t.com就是200,狀態

Nginx 反向代理與正向代理

四、反向代理配置測試

安裝和上面編譯安裝一樣,沒有特殊模塊。只需要修改配置文件

<code>cat /usr/local/nginx/conf/nginx.confuser  www;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 / {           proxy_pass http://abcdocker;           proxy_set_header   Host             $host;           proxy_set_header   X-Real-IP        $remote_addr;           proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;        }    }    upstream abcdocker {       server 10.4.82.140:8080;       server 127.0.0.1:8080;    }}#proxy_pass 代理節點,可以用ip+端口#upstream 後面寫名稱#server 後端節點名稱/<code>

訪問驗證,我們訪問nginx.i4t.com域名打開的是tomcat後端節點

Nginx 反向代理與正向代理

請注意緩存(google瀏覽器緩存不是很好清理)


分享到:


相關文章: