nginx反向代理和ip透傳


nginx反向代理

反向代理:reverse proxy,可代理外網用戶的請求到內部的指定web服務器,並將數據返回給用戶
nginx除了可以在企業提供高性能的web服務之外,另外還可以將本身不具備的請求通過某種預定義的協議轉發至其它服務器處理,不同的協議就是nginx服務器與其他服務器進行通信的一種規范
主要在不同的場景使用以下模塊實現不同的功能:
  ngx_http_proxy_module: 將客戶端請求以http協議轉發至后端服務器
  ngx_http_fastcgi_module:將客戶端對php請求以fastcgi協議轉發至后端
  ngx_http_uwsgi_module:將客戶端對Python請求以uwsgi協議轉發至后端
  ngx_stream_proxy_module:將客戶端請求以tcp協議轉發至后端服務器
 
 

ngx_http_proxy_module

轉發請求至另一台主機

proxy_pass URL;

1、proxy_pass后面路徑不帶uri時,會將location的uri傳遞(附加)給后端主機
server {
    ...
    server_name HOSTNAME;
    location /uri/ {
    proxy_pass http://host[:port]; 注意:最后沒有/
    }
...
}
上面示例:http://HOSTNAME/uri --> http://host/uri ,功能類似 root;如果上面示例中有 /,即:http://host[:port]/ 此方式較少使用,意味着:http://HOSTNAME/uri --> http://host/ 即置換,功能類似 alias
2、proxy_pass后面的路徑是一個uri時,其會將location的uri替換為proxy_pass的uri
server {
    ...
    server_name HOSTNAME;
    location /uri/ {
        proxy_pass http://host/new_uri/;
    }
    ...
}
http://HOSTNAME/uri/ --> http://host/new_uri/
3、如果location定義其uri時使用了正則表達式的模式,則proxy_pass之后必須不能使用uri; 用戶請求時傳遞的uri將直接附加至后端服務器之后
server {
    ...
    server_name HOSTNAME;
    location ~|~* /uri/ {
    proxy_pass http://host; 不能加/ }
    ...
}

http://HOSTNAME/uri/ --> http://host/uri/    

實驗一實現反向代理

兩台服務器192.168.206.15作為nginx反代服務器,192.168.206.20作為httpd服務器;

nginx服務器配置

vim /etc/nginx/conf.d/proxy.conf
server { server_name www.testproxy.com; location
/dynamic/ { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://www.testdynamic.com; } }

httpd服務器配置

vim /etc/httpd/conf.d/server.conf 
<virtualHost *:80>
    ServerName www.testdynamic.com
    DocumentRoot "/apps/test.net/htdocs"
    <Directory "/apps/test.net/htdocs">
        options None
        AllowOverride None
        Require all granted
    </Directory>

</VirtualHost>
mkdir -p   /apps/test.net/htdocs
echo "for nginx proxy" > index.html

 

ip透傳

proxy_set_header field value;

設定轉發往后端主機的請求報文的請求首部的值; 
注意:因為其默認值是proxy_set_header Host $proxy_host;所以后端主機的訪問日志中記錄的IP都是代理服務器的。這樣不便於通過日志,去判斷服務訪問情況。
Context: http, server, location

proxy_set_header X-Real-IP $remote_addr; 

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

請求報文的標准格式如下:
X-Forwarded-For: client1, proxy1, proxy2

實驗一:實現ip透傳

兩台服務器192.168.206.15作為nginx反代服務器,192.168.206.20作為httpd服務器;

nginx配置

vim /etc/nginx/confi.d/proxy.conf 

server {
        server_name www.testproxy.com;
        location /dynamic/ {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_pass http://www.testdynamic.com;
        }

}

vim   /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.206.20 www.testdynamic.com

httpd服務器配置

/etc/httpd/conf/httpd.conf
 LogFormat "\"%{X-Forwarded-For}i\"  %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
vim /etc/httpd/conf.d/server.conf 
<virtualHost *:80>
    ServerName www.testdynamic.com
    DocumentRoot "/apps/test.net/htdocs"
    <Directory "/apps/test.net/htdocs">
        options None
        AllowOverride None
        Require all granted
    </Directory>

</VirtualHost>
mkdir -p   /apps/test.net/htdocs
echo "for nginx proxy" > index.html

 

反向代理緩存相關配置 

proxy_cache_path;

定義可用於proxy功能的緩存;Context:http
proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time]
[loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
示例:在http配置定義緩存信息
  proxy_cache_path /var/cache/nginx/proxy_cache #定義緩存保存路徑,proxy_cache會自動創建
  levels=1:2:2 #定義緩存目錄結構層次,1:2:2 可以生成2^4x2^8x2^8=1048576個目錄
  keys_zone=proxycache:20m #指內存中緩存的大小,主要用於存放key和metadata(如:使用次數)
  inactive=120s; #緩存有效時間
  max_size=1g; #最大磁盤占用空間,磁盤存入文件內容的緩存空間最大值

proxy_cache zone | off; 默認off

指明調用的緩存,或關閉緩存機制;Context:http, server, location

proxy_cache_key string;

緩存中用於“鍵”的內容
默認值:proxy_cache_key $scheme $proxy_host $request_uri;

proxy_cache_valid [code ...] time;

定義對特定響應碼的響應內容的緩存時長
定義在http{...}中
示例:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;

示例:在http配置定義緩存信息

proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2:2 keys_zone=proxycache:20m inactive=120s max_size=1g; 
proxy_cache proxycache;
proxy_cache_key $request_uri;
proxy_cache_valid 200 302 301 1h;
proxy_cache_valid any 1m;
說明:proxycache:20m 指內存中緩存的大小,主要用於存放key和metadata(如:使用次數)max_size=1g 指磁盤存入文件內容的緩存空間最大值
調用緩存功能,需要定義在相應的配置段,如server{...};

proxy_cache_use_stale;

proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...
在被代理的后端服務器出現哪種情況下,可直接使用過期的緩存響應客戶端

proxy_cache_methods GET | HEAD | POST ...;

對哪些客戶端請求方法對應的響應進行緩存,GET和HEAD方法總是被緩存

proxy_hide_header field;

用於隱藏后端服務器特定的響應首部,默認nginx在響應報文中不傳遞后端服務
器的首部字段Date, Server, X-Pad, X-Accel等
示例:
  proxy_hide_header Etag;

proxy_pass_header field;

默認nginx在響應報文中不傳遞后端服務器的首部字段Date, Server, X-Pad, X-Accel等參數,如果要傳遞的話則要使用 proxy_pass_header field聲明將后端服務器返回的值傳遞給客戶端。

ngx_http_headers_module模塊

向代理服務器給客戶端的響應報文添加自定義首部,或修改指定首部的值

add_header name value [always];

添加自定義首部
  add_header X-Via $server_addr;
  add_header X-Cache $upstream_cache_status;
  add_header X-Accel $server_name;

add_trailer name value [always];

添加自定義響應信息的尾部, 1.13.2版后支持

proxy_connect_timeout time;

  定義與后端服務器建立連接的超時時長,如超時會出現502錯誤,默認為60s,一般不建議超出75s

proxy_send_timeout time;

  對后端服務器send,將請求發送給后端服務器的超時時長;默認為60s

proxy_read_timeout time;

  從后端服務器read,等待后端服務器發送響應報文的超時時長,默認為60s

proxy_ignore_client_abort off;

  當客戶端網絡中斷請求時,nginx服務器中斷其對后端服務器的請求。即如果此項設置為on開啟,則服務器會忽略客戶端中斷並一直等着代理服務執行返回,如果設置為off,則客戶端中斷后nginx也會中斷客戶端請求並立即記錄499日志,默認為offngx_http_headers_module

proxy_http_version 1.0;

  用於設置nginx提供代理服務的HTTP協議的版本,默認http 1.0

proxy_headers_hash_bucket_size 128;

  當配置了 proxy_hide_header和proxy_set_header的時候,用於設置nginx保存HTTP報文頭的hash表的上限

proxy_headers_hash_max_size 512;

  設置proxy_headers_hash_bucket_size的最大可用空間

server_namse_hash_bucket_size 512;

  server_name hash表申請空間大小

server_names_hash_max_size 512;

  設置服務器名稱hash表的上限大小

ngx_http_fastcgi_module模塊

轉發請求到FastCGI服務器,不支持php模塊方式

fastcgi_pass address;

  address為后端的fastcgi server的地址
  可用位置:location, if in location

fastcgi_index name;

  fastcgi默認的主頁資源
  示例:fastcgi_index index.php;

fastcgi_param parameter value [if_not_empty];

  設置傳遞給 FastCGI 服務器的參數值,可以是文本,變量或組合

示例1:

1)在后端服務器先配置fpm server和mariadb-server
2)在前端nginx服務上做以下配置:
location ~* \.php$ {
  root /data/php; #$document_root 調用root目錄
  fastcgi_pass 后端fpm服務器IP:9000;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  #fastcgi_param SCRIPT_FILENAME /data/php$fastcgi_script_name;
  #如果SCRIPT_FILENAME是絕對路徑,則可以省略root /data/php;
  include fastcgi_params;
}

示例2:

通過/pm_status和/ping來獲取fpm server狀態信息
location ~* ^/(fpm_status|ping)$ {
  fastcgi_pass 后端fpm服務器IP:9000;
  fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
  include fastcgi_params;
}

fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time][purger_threshold=time];

  定義fastcgi的緩存;
  path 緩存位置為磁盤上的文件系統路徑
  max_size=size
    磁盤path路徑中用於緩存數據的緩存空間上限
  levels=levels:緩存目錄的層級數量,以及每一級的目錄數量,levels=ONE:TWO:THREE
  示例:
    leves=1:2:2
  keys_zone=name:size
    k/v映射的內存空間的名稱及大小
  inactive=time
    非活動時長

fastcgi_cache zone | off;

  調用指定的緩存空間來緩存數據,可用位置:http, server, location

fastcgi_cache_key string;

  定義用作緩存項的key的字符串
示例:fastcgi_cache_key $request_uri;

fastcgi_cache_methods GET | HEAD | POST ...;

  為哪些請求方法使用緩存

fastcgi_cache_min_uses number;

  緩存項在inactive定義的非活動時間內至少要被訪問到指定的次數方可被認作活動項

fastcgi_keep_conn on | off;

  收到后端服務器響應后,fastcgi服務器是否關閉連接,建議啟用長連接

fastcgi_cache_valid [code ...] time;

  不同的響應碼各自的緩存時長
示例:
http {
  fastcgi_cache_path /var/cache/nginx/fcgi_cache levels=1:2:1 keys_zone=fcgicache:20m inactive=120s;

  server {
    location ~* \.php$ {

    fastcgi_cache fcgicache;
    fastcgi_cache_key $request_uri;
    fastcgi_cache_valid 200 302 10m;
    fastcgi_cache_valid 301 1h;
    fastcgi_cache_valid any 1m;
    } 
  }
}

ngx_http_upstream_module

  將多個服務器定義成服務器組,而由proxy_pass, fastcgi_pass等指令進行引用

upstream name { ... }

  定義后端服務器組,會引入一個新的上下文
  默認調度算法是wrr
  Context: http
  upstream httpdsrvs {
    server ...
    server...
    ...
  }

server address [parameters];

  在upstream上下文中server成員,以及相關的參數;Context:upstream
   address的表示格式
    unix:/PATH/TO/SOME_SOCK_FILE
    IP[:PORT]
    HOSTNAME[:PORT]
   parameters
    weight=number
    權重,默認為1
    max_conns
      連接后端報務器最大並發活動連接數,1.11.5后支持
    max_fails=number
      失敗嘗試最大次數;超出此處指定的次數時,server將被標記為不可用,默認為1
    fail_timeout=time
      后端服務器標記為不可用狀態的連接超時時長,默認10s
    backup
      將服務器標記為“備用”,即所有服務器均不可用時才啟用
    down
      標記為“不可用”,實現灰度發布
    ip_hash
      源地址hash調度方法
    least_conn
      最少連接調度算法,當server擁有不同的權重時其為wlc,當所有后端主機連接數相同時,則使用wrr,適用於長連接
    hash key [consistent]
       基於指定的key的hash表來實現對請求的調度,此處的key可以直接文本、變量或二者組合
      作用:將請求分類,同一類請求將發往同一個upstream server,使用consistent參數,將使用ketama一致性hash算法,適用於后端是Cache服務器(如varnish)時使用
      hash $request_uri consistent;
      hash $remote_addr;
      hash $cookie_name; #key為name的cookie
    kepalive 連接數N;
      為每個worker進程保留的空閑的長連接數量,可節約nginx端口,並減少連接管理的消耗
配置示例
upstream dynamic {
    zone upstream_dynamic 64k;

    server backend1.example.com      weight=5;
    server backend2.example.com:8080 fail_timeout=5s slow_start=30s;
    server 192.0.2.1                 max_fails=3;
    server backend3.example.com      resolve;
    server backend4.example.com      service=http resolve;

    server backup1.example.com:8080  backup;
    server backup2.example.com:8080  backup;
}

server {
    location / {
        proxy_pass http://dynamic;
        health_check;
    }
}
upstream webserver {
    server 192.168.206.20      weight=1;
    server 192.168.206.10  fail_timeout=5s;
}

server {
    location / {
        proxy_pass http://webserver;
    }
}

 

 
 


免責聲明!

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



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