Nginx 之六: Nginx服務器的正向及反向代理功能


一:Nginx作為正向代理服務器:

1.正向代理:代理(proxy)服務也可以稱為是正向代理,指的是將服務器部署在公司的網關,代理公司內部員工上外網的請求,可以起到一定的安全作用和管理限制作用,正向代理不支持從外網向內網訪問資源,一般很少用,經本人測試,效果也不好,有很多頁面打不開,在百度搜索的頁面也無法返回。

server {
    server_name localhost;
    resolver 202.106.0.20 8.8.8.8; #只能有一個resolve,但是可以用空格隔開,繼續寫下一個
    resolver_timeout 5s;
    listen  8080;
    location / {
        proxy_pass   $scheme://$http_host/$request_uri;
        proxy_set_header Host $http_host;

        proxy_buffers 256 4k;
        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;
    }
}

2.錯誤碼502 :Nginx作為代理服務器向后端轉發請求過程中超時。

 

二:Nginx作為反向代理服務器:

反向代理:反向代理也叫reverse proxy,指的是代理外網用戶的請求到內部的指定web服務器,並將數據返回給用戶的一種方式,這是用的比較多的一種方式。

反向代理的常用指令:

1.proxy_pass:用來設置將請求轉發給的后端服務器的主機,可以是主機名、IP地址:端口的方式,也可以代理到通過upstream設置的主機組,如下:

upstream webserver {
        #ip_hash;  
        server  192.168.0.201 weight=1 max_fails=2  fail_timeout=2;
        server  192.168.0.202 weight=1 max_fails=2  fail_timeout=2;
        server 127.0.0.1:9008 backup;
}

server {
        server_name  hfnginx.chinacloudapp.cn;
        #access_log  logs/host.access.log  main;
        location / {  #靜態網頁在本機
            root   html;
            index  index.html;
        }
        location ~* ^/form {  #指定目錄在后端服務器
            proxy_pass  http://webserver; #此處http://webserver后面不能加/,如果加了會提示語法錯誤
            proxy_set_header X-Real-IP $remote_addr;
        }
}

 2:proxy_hide_header:用於nginx服務器作為反向代理的時候,在返回給客戶端http響應的時候,隱藏后端服務版本(如php版本)的信息,可以設置在http/server或location塊,如下:

Nginx會將上游服務器的響應轉發給客戶端,但默認不會轉發以下HTTP頭部字段:Date、Server、X-Pad和X-Accel-*。使用proxy_hide_header后可以任意地指定哪些HTTP頭部字段不能被轉發。例如:

proxy_hide_header Cache-Control;  
proxy_hide_header MicrosoftOfficeWebServer; 

注:如果是nginx直接作為web服務器,要隱藏版本信息的話,使用fastcgi_hide_header:

3:proxy_pass_header:與proxy_hide_header功能相反,proxy_pass_header會將原來禁止轉發的header設置為允許轉發,可以設置在http/server或location塊例如:

proxy_pass_header X-Accel-Redirect; 

4:proxy_pass_request_body:是否向后端服務器發送HTTP包體部分,可以設置在http/server或location塊,如下:

proxy_pass_request_body on|off;  #默認為on

5:proxy_pass_request_headers:是否將客戶端的請求頭部轉發給后端服務器,可以設置在http/server或location塊,如下:

proxy_pass_request_headers on | off; #默認為on

6:proxy_set_header:可以更改或添加客戶端的請求頭部信息內容,並轉發之后端服務器,比如在后端服務器想要獲取客戶端的真實IP的時候,就要更改每一個報文的頭部,如下:

proxy_set_header HOST  $remote_addr; #添加HOST到報文頭部,其值為客戶端的公網IP地址

7:proxy_set_body:更改nginx服務器接收到的客戶端請求的請求內容,然后將修改后的請求轉發給后端的服務器,用法如下:

proxy_set_body value;  #其中value為要修改的目標內容,可以是變量、文本或者變量的組合。

8:proxy_ip:Nginx 0.8.22版本及以上支持此功能,用於Nginx配置了多個基於域名或IP的主機的情況下,可以指定代理連接到特定的主機處理,就是強制將客戶端請求綁定到指定的IP地址:

proxy_bind x.x.x.x; 

9:proxy_connect_timeout:配置nginx服務器與后端服務器嘗試建立連接的超時時間,默認為60秒,用法如下:

proxy_connect_timeout 10s; #10s為自定義nginx與后端服務器建立連接的超時時間

10:proxy_read_time:配置nginx服務器向后端服務器或服務器組發起read請求后,等待的超時時間:

proxy_read_time 10s; #默認為60秒

11:proxy_send_time; 配置nginx項后端服務器或服務器組發起write請求后,等待的超時時間:

proxy_send_time 10s; #默認為60s

12:proxy_http_version:用於設置nginx提供代理服務的HTTP協議的版本:

proxy_http_version 1.0|1.1

13:proxy_method:設置nginx服務器請求后端服務器時使用的方法,一般為POST或者GET,客戶端的請求方法將被忽略:

proxy_method GET|PUT;

14:proxy_ignore_client_abort:設置在客戶端網絡中斷請求時,nginx服務器是否中斷對被代理服務器的請求:

proxy_ignore_client_abort off|on; #默認為off,當客戶端網絡中斷請求時,nginx服務器中斷其對后端服務器的請求。

15:proxy_ignore_headers:設置nginx不處理后端服務器返回的數據中包含某些指定字段的報文,可以指定的有:”X-Accel-Redirect”, “X-Accel-Expires”, “Expires”或”Cache-Control”:

proxy_ignore_headers Expires;

16:proxy_redirect:修改后端服務器返回的響應頭部中的location貨refresh,與proxy_pass配合使用:

 

17:proxy_intercept_errors:設置nginx服務器返回客戶端的錯誤狀態,當后端服務器返回大於等於400的錯誤碼的是,如果本功能是打開的,則nginx服務器返回自定義的錯誤頁面(使用error page定義的),如果沒有開啟就將后端服務器返回的HTTP狀態直接返回給客戶端,默認為關閉:

proxy_intercept_errors on | off;

18:proxy_headers_hash_max_size:設置nginx保存HTTP報文頭的hash表的上限,默認為512字節:

proxy_headers_hash_bucket_size 512;#申請nginx保存HTTP報文頭的hash表的空間大小,默認為64個字節
proxy_headers_hash_max_size 512; #上限
server_names_hash_max_szie 512; #設置服務器名稱的上限
server_namse_hash_bucket_size 512; #申請空間大小

19:proxy_headers_hash_bucket_size:#申請nginx保存HTTP報文頭的hash表的空間大小,默認為64個字節

proxy_headers_hash_bucket_size 512; #默認為64字節

20:proxy_net_upstream:當使用了upstream的時候,可以定義在發生了特定的情況下將請求依次交給下一個組內的服務器處理,狀態包括:

    proxy_next_upstream  http_404 http_502;  //讓404報錯進入max_fails計數 
        upstream online { 
        sticky; 
        server 172.28.70.161:8080 max_fails=0 fail_timeout=3s ; 
        server 172.28.70.163:8080  max_fails=0 fail_timeout=3s ; 
     
        check interval=3000 rise=2 fall=1 timeout=1000 type=http; 
        check_http_send "GET / HTTP/1.0\r\n\r\n"; 
        check_http_expect_alive http_2xx http_3xx; 
        } 
 
        upstream backup { 
        server 172.28.22.29:7777  max_fails=0 fail_timeout=3s; 
        } 

21:proxy_ssl_session_reuse:配置是否基於SSL協議與后端服務器建立連接,如下:

proxy_ssl_session_reuse on | off;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM