nginx反向代理緩存服務器

一.正向代理和反向代理

正向代理: 用於代理內部網絡對 Internet 的連接請求(如 VPN/NAT),客戶端指定代理服務器,並
將本來要直接發送給目標Web服務器的HTTP請求先發送到代理服務器上, 然後由代理服務
器去訪問 Web 服務器, 並將 Web 服務器的 Response 回傳給客戶端。

反向代理: 與正向代理相反,如果局域網向Internet提供資源,並讓Internet上的其他用戶可以
訪問局域網內資源, 也可以設置一個代理服務器,
它提供的服務就是反向代理. 反向代理服
務器接受來自 Internet 的連接,然後將請求轉發給內部網絡上的服務器,並將 Response 回傳給
Internet 上請求連接的客戶端。

簡單理解,就是正向代理是爲客戶端做代理,代替客戶去訪問服務器,而反向代理是爲服務器做代理,代替服務器接受客戶的請求。

二.nginx反向代理服務器

反向代理服務器 192.168.1.61
web節點1 192.168.1.62
web節點2 192.168.1.63

所需包下載:baaj

1.安裝nginx

[root@lb ~]# yum -y install gcc gcc-c++ make libtool zlib zlib-devel pcre pcre-devel openssl openssl-devel  //安裝前提環境和軟件

[root@lb ~]# useradd -s /sbin/nologin nginx
[root@lb ~]# cd /usr/src/
[root@lb src]# ls
debug                nginx-goodies-nginx-sticky-module-ng-08a395c66e42.tar.gz
kernels              ngx_cache_purge-2.3.tar.gz
nginx-1.12.0.tar.gz
[root@lb src]# tar zxf nginx-goodies-nginx-sticky-module-ng-08a395c66e42.tar.gz 
[root@lb src]# tar zxf ngx_cache_purge-2.3.tar.gz 
[root@lb src]# tar zxf nginx-1.12.0.tar.gz 
[root@lb src]# cd nginx-1.12.0/
[root@lb nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx \
> --with-http_stub_status_module --with-http_realip_module --with-http_ssl_module \
> --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client \
> --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fcgi \
> --with-pcre --add-module=../ngx_cache_purge-2.3 --with-http_flv_module \
> --add-module=../nginx-goodies-nginx-sticky-module-ng-08a395c66e42 \
> && make && make install 
 

模塊解釋:結合 proxy 和 upstream 模塊實現後端 web 負載均衡
使用 proxy 模塊實現靜態文件緩存
結合 nginx 默認自帶的 ngx_http_proxy_module 模塊 和 ngx_http_upstream_module 模塊實現後端服務器的健康檢查,也可以使用第三方模塊 nginx_upstream_check_module
使用 nginx-sticky-module 擴展模塊實現 Cookie 會話黏貼(保持會話)
使用 ngx_cache_purge 實現更強大的緩存清除功能

 

添加nginx爲系統服務

[root@lb nginx-1.12.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@lb nginx-1.12.0]# mkdir -p /var/tmp/nginx/client
[root@lb nginx-1.12.0]# chown -R nginx:nginx /var/tmp/nginx/
[root@lb nginx-1.12.0]# vim /etc/init.d/nginx
//添加


#!/bin/bash
# chkconfig: 2345 99 20
# description: Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
 start)
 netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
 if [ $? -eq 0 ]
 then
 echo "Nginx service already running."
 else
 $PROG -t &> /dev/null
 if [ $? -eq 0 ] ; then 
 $PROG
 echo "Nginx service start success."
 else
 $PROG -t
 fi
 fi
 ;;
 stop)
 netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
 if [ $? -eq 0 ]
 then
 kill -s QUIT $(cat $PIDF)
 echo "Nginx service stop success." 
 else
 echo "Nginx service already stop"
 fi
 ;;
 restart)
 $0 stop
 $0 start
 ;;
 status)
 netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
 if [ $? -eq 0 ]
 then
 echo "Nginx service is running."
 else
 echo "Nginx is stop."
 fi
 ;; 
 reload)
 netstat -anplt |grep ":80" &> /dev/null && pgrep "nginx" &> /dev/null
 if [ $? -eq 0 ]
 then
 $PROG -t &> /dev/null
 if [ $? -eq 0 ] ; then
 kill -s HUP $(cat $PIDF)
 echo "reload Nginx config success."
 else
 $PROG -t
 fi
 else
 echo "Nginx service is not run." 
 fi 
 ;;
 *)
 echo "Usage: $0 {start|stop|restart|reload}"
 exit 1
esac

[root@lb nginx-1.12.0]# chmod +x /etc/init.d/nginx 
[root@lb nginx-1.12.0]# chkconfig --add nginx
[root@lb nginx-1.12.0]# systemctl start nginx
[root@lb nginx-1.12.0]# netstat -anput | grep nginx

[root@lb ~]# nginx -v  //查看nginx版本號

[root@lb ~]# nginx -V //查看模塊

2.在節點服務器上添加首頁

web1

[root@web1 ~]# echo "1.62" >/usr/share/nginx/html/index.html 
[root@web1 ~]# cat /usr/share/nginx/html/index.html
1.62

web2

[root@web2 ~]# echo "1.63" >/usr/share/nginx/html/index.html
[root@web2 ~]# cat /usr/share/nginx/html/index.html
1.63

3.反向代理

[root@lb ~]# vim /usr/local/nginx/conf/nginx.conf
//找到http字段並在裏面添加

http { 
       .............
   
upstream backend {
server 192.168.1.62:80 weight=1; //web節點
server 192.168.1.63:80 weight=1;

}

//添加web節點後找到server字段引用

server {
         ..................
        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://backend;   //引用upstream
        }
[root@lb ~]# nginx -t
[root@lb ~]# systemctl restart nginx.service

4.測試

[root@lb ~]# curl 192.168.1.61
1.62
[root@lb ~]# curl 192.168.1.61
1.63

三.其他

1.nginx-sticky-module 模塊

這個模塊的作用是通過 cookie 黏貼的方式將來自同一個客戶端(瀏覽器)的請求發送到同一個後端服務器上處理,這樣一定程度上可以解決多個 backend servers 的 session 同步的問題 —— 因爲不再需要同步,而 RR 輪詢模式必須要運維人員自己考慮 session 同步的實現。
另外內置的 ip_hash 也可以實現根據客戶端 IP 來分發請求,但它很容易造成負載不均衡的情況,而如果 nginx 前面有 CDN 網絡或者來自同一局域網的訪問,它接收的客戶端 IP 是一樣的,容易造成負載不均衡現象。nginx-sticky-module 的 cookie 過期時間,默認瀏覽器關閉就過期。

這個模塊並不合適不支持 Cookie 或手動禁用了 cookie 的瀏覽器,此時默認 sticky 就會切換成 RR。它不能與 ip_hash 同時使用。

nginx-sticky-module 的作用就是保持會話的。

[root@lb ~]# vim /usr/local/nginx/conf/nginx.conf
  ............
upstream backend {
        server 192.168.1.62:80;
        server 192.168.1.63:80;
        sticky; //配置起來超級簡單,一般來說一個 sticky 指令就夠了
}

2.load-balance 其它調度方案:

  • 輪詢(默認) : 每個請求按時間順序逐一分配到不同的後端服務器,如果後端某臺服務器宕機,故障系統被自動剔除,使用戶訪問不受影響。Weight 指定輪詢權值,Weight 值越大,分配到的訪問機率越高,主要用於後端每個服務器性能不均的情況下。
  • ip_hash : 每個請求按訪問 IP 的 hash 結果分配,這樣來自同一個 IP 的訪客固定訪問一個後端服務器,有效解決了動態網頁存在的 session 共享問題。當然如果這個節點不可用了,會發到下個節點,而此時沒有 session 同步的話就註銷掉了。
  • least_conn :請求被髮送到當前活躍連接最少的 realserver 上。會考慮 weight 的值。
  • url_hash : 此方法按訪問 url 的 hash 結果來分配請求,使每個 url 定向到同一個後端服務器,可以進一步提高後端緩存服務器的效率。Nginx 本身是不支持 url_hash 的,如果需要使用這種調度算法,必須安裝 Nginx 的 hash 軟件包 nginx_upstream_hash 。
  • fair :這是比上面兩個更加智能的負載均衡算法。此種算法可以依據頁面大小和加載時間長短智能地進行負載均衡,也就是根據後端服務器的響應時間來分配請求,響應時間短的優先分配。Nginx 本身是不支持 fair 的,如果需要使用這種調度算法,必須下載 Nginx 的upstream_fair 模塊。

3. 負載均衡與健康檢查

嚴格來說,nginx 自帶是沒有針對負載均衡後端節點的健康檢查的,但是可以通過默認自帶的 ngx_http_proxy_module 模塊和 ngx_http_upstream_module 模塊中的相關指令來完成當後端節點出現故障時,自動切換到下一個節點來提供訪問。

[root@lb ~]# vim /usr/local/nginx/conf/nginx.conf

upstream backend {
sticky;
server 192.168.31.141:80 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.31.250:80 weight=1 max_fails=2 fail_timeout=10s;
}

 參數解釋:

weight : 輪詢權值也是可以用在 ip_hash 的,默認值爲 1

max_fails : 允許請求失敗的次數,默認爲 1。當超過最大次數時,返回 proxy_next_upstream模塊定義的錯誤。

fail_timeout : 有兩層含義,一是在 10s 時間內最多容許 2 次失敗;二是在經歷了 2 次失敗以後,10s 時間內不分配請求到這臺服務器。

三. nginx 的 的 proxy 緩存使用

緩存也就是將 js、css、image 等靜態文件從後端服務器緩存到 nginx 指定的緩存目錄下,既可以減輕後端服務器負擔,也可以加快訪問速度,但這樣緩存及時清理成爲了一個問題,所以需要 ngx_cache_purge 這個模塊來在過期時間未到之前,手動清理緩存。
proxy 模塊中常用的指令時 proxy_pass 和 proxy_cache.
nginx 的 web 緩存功能的主要是由 proxy_cache、fastcgi_cache 指令集和相關指令集完成,proxy_cache 指令負責反向代理緩存後端服務器的靜態內容,fastcgi_cache 主要用來處理FastCGI 動態進程緩存。

[root@lb ~]# vim /usr/local/nginx/conf/nginx.conf 
............   
 #access_log  logs/access.log  main;

proxy_buffering on;
proxy_temp_path /usr/local/nginx/proxy_temp;
proxy_cache_path /usr/local/nginx/proxy_cache levels=1:2 keys_zone=my-cache:100m
inactive=600m max_size=2g;


..............

location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://backend;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $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_cache my-cache;
        add_header Nginx-Cache $upstream_cache_status;
        proxy_cache_valid 200 304 301 302 8h;
        proxy_cache_valid 404 1m;
        proxy_cache_valid any 1d;
        proxy_cache_key $host$uri$is_args$args;
        expires 30d;
        }

相關選項說明:

proxy_buffering on; 代理的時候,開啓或關閉緩衝後端服務器的響應。當開啓緩衝時,nginx 儘可能快地從被代理的服務器接收響應,再將它存入緩衝區中。

proxy_temp_path 緩存臨時目錄。後端的響應並不直接返回客戶端,而是先寫到一個臨時文件中,然後被 rename 一下當做緩存放在 proxy_cache_path 。0.8.9 版本以後允許 temp和 cache 兩個目錄在不同文件系統上(分區),然而爲了減少性能損失還是建議把它們設成一個文件系統上。

proxy_cache_path設置緩存目錄,目錄裏的文件名是 cache_key 的 MD5 值。

levels=1:2 keys_zone=my-cache:50m 表示採用 2 級目錄結構,第一層目錄只有一個字符,是由levels=1:2設置,總共二層目錄,子目錄名字由二個字符組成。Web緩存區名稱爲my-cache,內存緩存空間大小爲 100MB,這個緩衝 zone 可以被多次使用。文件系統上看到的緩存文件名類似於 /usr/local/nginx/proxy_cache/c/29/b7f54b2df7773722d382f4809d65029c 。
inactive=600 max_size=2g 表示 600 分鐘沒有被訪問的內容自動清除,硬盤最大緩存空間爲2GB,超過這個大學將清除最近最少使用的數據。

proxy_cache : 引用前面定義的緩存區 my-cache

proxy_cache_key :定義如何生成緩存的鍵,設置 web 緩存的 key 值,nginx 根據 key 值 md5哈希存儲緩存。

proxy_cache_valid : 爲不同的響應狀態碼設置不同的緩存時間,比如 200、302 等正常結果可以緩存的時間長點,而 404、500 等緩存時間設置短一些,這個時間到了文件就會過期,而不論是否剛被訪問過。

add_header: 指令來設置 response header, 語法: add_header name value;$upstream_cache_status 這個變量來顯示緩存的狀態,我們可以在配置中添加一個 http 頭來顯示這一狀態$upstream_cache_status 包含以下幾種狀態:

  • ·MISS 未命中,請求被傳送到後端
  • ·HIT 緩存命中
  • ·EXPIRED 緩存已經過期請求被傳送到後端
  • ·UPDATING 正在更新緩存,將使用舊的應答
  • ·STALE 後端將得到過期的應答

expires : 在響應頭裏設置 Expires:或 Cache-Control:max-age,返回給客戶端的瀏覽器緩存失效時間。

 

下面的 nginx.conf 實現 nginx 在前端做反向代理服務器的完整配置文件的例子,處理 js、png等靜態文件,jsp/php 等動態請求轉發到其它服務器 tomcat/apache。進行參考

user www www;
worker_processes 4;  #worker進程,可以設置爲cup的核數
worker_cpu_affinity 0001 0010 0100 1000;
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
worker_rlimit_nofile 10240;  #worker 進程的最大打開文件數限制
pid logs/nginx.pid;
events {
use epoll;  #nginx 默認使用 epoll 事件模型
worker_connections 4096; #每一個 worker 進程能併發處理(發起)的最大連接數
}
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"'
'"$upstream_cache_status"';
access_log logs/access.log main;
server_tokens off;  #隱藏 nginx 的版本號
sendfile on;   #開啓高效文件傳輸模式。
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65; #長連接超時時間,單位是秒
#Compression Settings
gzip on;  #開啓 gzip 壓縮輸出,減少網絡傳輸。
gzip_comp_level 6;  #gzip 壓縮比
gzip_http_version 1.1;  #用於識別 http 協議的版本
gzip_proxied any;       #根據某些請求和應答來決定是否在對代理請求的應答啓用 gzip 壓縮
gzip_min_length 1k;     #設置允許壓縮的頁面最小字節數
gzip_buffers 16 8k;     #設置系統獲取幾個單位的緩存用於存儲 gzip 的壓縮結果數據流。
gzip_types text/plain text/css text/javascript application/json #匹配 mime 類型進行壓縮 application/javascript
application/x-javascript application/xml;
gzip_vary on;
#end gzip
# http_proxy Settings
client_max_body_size 10m;      #允許客戶端請求的最大單文件字節數     
 client_body_buffer_size 128k; #緩衝區代理緩衝用戶端請求的最大字節數
proxy_connect_timeout 75;      #nginx 跟後端服務器連接超時時間(代理連接超時)
proxy_send_timeout 75;         #定義從後端服務器讀取響應的超時。此超時是指相鄰兩次讀操作之間的最長時間間隔。
proxy_read_timeout 75;
proxy_buffer_size 4k;    #設置緩衝區的大小
proxy_buffers 4 32k;     #爲每個連接設置緩衝區的數量爲 number,每塊緩衝區的大小爲 size
proxy_busy_buffers_size 64k;     #高負荷下緩衝大小
proxy_temp_file_write_size 64k;  #當緩存被代理的服務器響應到臨時文件時,這個選項限制每次寫臨時文件的大小
proxy_buffering on;
proxy_temp_path /usr/local/nginx1.10/proxy_temp;
proxy_cache_path /usr/local/nginx1.10/proxy_cache levels=1:2 keys_zone=my-cache:100m
max_size=1000m inactive=600m max_size=2g;
#load balance Settings
upstream backend {
sticky;
server 192.168.31.141:80 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.31.250:80 weight=1 max_fails=2 fail_timeout=10s;
}
#virtual host Settings
server {
listen 80;
server_name localhost;
charset utf-8;
location ~/purge(/.*) {
allow 127.0.0.1;
allow 192.168.31.0/24;
deny all;
proxy_cache_purge my-cache $host$1$is_args$args;
}
location / {
index index.php index.html index.htm;  #定義路徑下默認訪問的文件名
proxy_pass http://backend; #請求轉向 backend 定義的服務器列表,對應 upstream 負載均衡器
proxy_redirect off; #指定是否修改被代理服務器返回的響應頭中的 location 頭域跟 refresh 頭域數值
proxy_set_header Host $host; #允許重新定義或者添加發往後端服務器的請求頭
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #後端的 Web服務器可以通過 X-Forwarded-For 獲取用戶真實 IP
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503
http_504;   #如果後端的服務器返回 502、504、執行超時等錯誤,自動將請求轉發到
upstream 負載均衡池中的另一臺服務器
}
location ~ .*\.(gif|jpg|png|html|htm|css|js|ico|swf|pdf)(.*) {
proxy_pass http://backend;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; #web 服務器端獲得用戶的真實 ip
 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_cache my-cache;
add_header Nginx-Cache $upstream_cache_status;
proxy_cache_valid 200 304 301 302 8h;
proxy_cache_valid 404 1m;
proxy_cache_valid any 1d;
proxy_cache_key $host$uri$is_args$args;
expires 30d;
}
location /nginx_status {
stub_status on;
access_log off;
allow 192.168.31.0/24;
deny all;
}
}
}

參數解釋:

main全局配置:

woker_processes 4

在配置文件的頂級 main 部分,worker 角色的工作進程的個數,master 進程是接收並分配請求給 worker 處理。這個數值簡單一點可以設置爲 cpu 的核數 grep ^processor /proc/cpuinfo |wc -l,也是 auto 值,如果開啓了 ssl 和 gzip 更應該設置成與邏輯 CPU 數量一樣甚至爲 2 倍,可以減少 I/O 操作。如果 nginx 服務器還有其它服務,可以考慮適當減少。

worker_cpu_affinity
也是寫在 main 部分。在高併發情況下,通過設置 cpu 粘性來降低由於多 CPU 核切換造成的寄存器等現場重建帶來的性能損耗。如 worker_cpu_affinity 0001 0010 0100 1000;

0010 表示開
啓第二個 cpu 內核,依次類推;有多少個核,就有幾位數,1 表示該內核開啓,0 表示該內核關閉。

例如:
1、2 核 CPU,開啓 2 個進程
worker_processes 2;
worker_cpu_affinity 01 10;
2、2 核 CPU,開啓 4 進程
worker_processes 4;
worker_cpu_affinity 01 10 01 10;
3、2 核 CPU,開啓 8 進程
worker_processes 8;
worker_cpu_affinity 01 10 01 10 01 10 01 10;
4、8 核 CPU,開啓 2 進程
worker_processes 2;
worker_cpu_affinity 10101010 01010101;

worker_connections 4096
寫在 events 部分。每一個 worker 進程能併發處理(發起)的最大連接數(包含與客戶端或後端被代理服務器間等所有連接數)。

worker_rlimit_nofile 10240
寫在 main 部分。worker 進程的最大打開文件數限制。默認是沒有設置,如果沒設置的話,這個值爲操作系統的限制(ulimit -n)。可以限制爲操作系統最大的限制 65535。把這個值設高,這樣 nginx 就不會有“too many open files”問題了

use epoll
寫在 events 部分。在 Linux 操作系統下,nginx 默認使用 epoll 事件模型,得益於此,nginx在 Linux 操作系統下效率相當高。同時 Nginx 在 OpenBSD 或 FreeBSD 操作系統上採用類似於epoll 的高效事件模型 kqueue。

 http 服務器配置

sendfile on:開啓高效文件傳輸模式

keepalive_timeout 65 : 長連接超時時間,單位是秒,長連接請求大量小文件的時候,可以減少重建連接的開銷,如果設置時間過長,用戶又多,長時間保持連接會佔用大量資源。

client_max_body_size 10m:允許客戶端請求的最大單文件字節數。如果有上傳較大文件,請設置它的限制值。

client_body_buffer_size 128k:緩衝區代理緩衝用戶端請求的最大字節數

server_tokens off:隱藏 nginx 的版本號

模塊 http_proxy 配置
這個模塊實現的是 nginx 作爲反向代理服務器的功能,包括緩存功能proxy_connect_timeout 60nginx 跟後端服務器連接超時時間(代理連接超時)

 

proxy_connect_timeout 60:nginx 跟後端服務器連接超時時間(代理連接超時)

proxy_read_timeout 60:定義從後端服務器讀取響應的超時。此超時是指相鄰兩次讀操作之間的最長時間間隔,而不
是整個響應傳輸完成的最長時間。如果後端服務器在超時時間段內沒有傳輸任何數據,連接將被關閉。

定義向後端服務器傳輸請求的超時。此超時是指相鄰兩次寫操作之間的最長時間間隔,而不是整個請求傳輸完成的最長時間。如果後端服務器在超時時間段內沒有接收到任何數據,連接將被關閉。

proxy_buffer_size 4k:
設置緩衝區的大小爲 size。nginx 從被代理的服務器讀取響應時,使用該緩衝區保存響應的開始部分。這部分通常包含着一個小小的響應頭。該緩衝區大小默認等於 proxy_buffers 指令設置的一塊緩衝區的大小,但它也可以被設置得更小。

proxy_buffers 8 4k
語法: proxy_buffers the_number is_size;
爲每個連接設置緩衝區的數量爲 number,每塊緩衝區的大小爲 size。這些緩衝區用於保存從被代理的服務器讀取的響應。每塊緩衝區默認等於一個內存頁的大小。這個值是 4K 還是8K,取決於平臺。

查看 Linux 內存頁大小
[root@www ~]# getconf PAGESIZE
4096

proxy_busy_buffers_size 64k:高負荷下緩衝大小(默認大小是 proxy_buffers 指令設置單塊緩衝大小的 2 倍)

proxy_max_temp_file_size:當 proxy_buffers 放不下後端服務器的響應內容時,會將一部分保存到硬盤的臨時文件中,
這個值用來設置最大臨時文件大小,默認 1024M。

proxy_temp_file_write_size 64k:當緩存被代理的服務器響應到臨時文件時,這個選項限制每次寫臨時文件的大小。

模塊 http_gzip 

gzip on : 開啓 gzip 壓縮輸出,減少網絡傳輸。

gzip_min_length 1k : 設置允許壓縮的頁面最小字節數,頁面字節數從 header 頭得content-length 中進行獲取。建議設置成大於 1k 的字節數,小於 1k 可能會越壓越大。

gzip_buffers 4 16k : 設置系統獲取幾個單位的緩存用於存儲 gzip 的壓縮結果數據流。4 16k代表以 16k 爲單位,按照原始數據大小以 16k 爲單位的 4 倍申請內存。如果沒有設置,默認值是申請跟原始數據相同大小的內存空間去存儲 gzip 壓縮結果.

gzip_http_version 1.1 : 用於識別 http 協議的版本,早期的瀏覽器不支持 Gzip 壓縮,用戶就會看到亂碼,所以爲了支持前期版本加上了這個選項,如果你用了 Nginx 的反向代理並期望也啓用 Gzip 壓縮的話,由於末端通信是 http/1.1,故請設置爲 1.1。

 gzip_comp_level 6 : gzip 壓縮比,1 壓縮比最小處理速度最快,9 壓縮比最大但處理速度最慢(傳輸快但比較消耗 cpu)

gzip_types :匹配 mime 類型進行壓縮,無論是否指定”text/html”類型總是會被壓縮的。默認值: gzip_types text/html (默認不對 js/css 文件進行壓縮)
# 壓縮類型,匹配 MIME 類型進行壓縮
# 不能用通配符 text/*
# (無論是否指定)text/html 默認已經壓縮
# 設置哪壓縮種文本文件可參考 conf/mime.types

gzip_proxied any : Nginx 作爲反向代理的時候啓用,根據某些請求和應答來決定是否在對代理請求的應答啓用 gzip 壓縮,是否壓縮取決於請求頭中的“Via”字段,指令中可以同時指定多個不同的參數,意義如下:
off – 關閉所有的代理結果數據的壓縮
expired – 啓用壓縮,如果 header 頭中包含 “Expires” 頭信息
no-cache – 啓用壓縮,如果 header 頭中包含 “Cache-Control:no-cache” 頭信息
no-store – 啓用壓縮,如果 header 頭中包含 “Cache-Control:no-store” 頭信息
private – 啓用壓縮,如果 header 頭中包含 “Cache-Control:private” 頭信息
no_last_modified – 啓用壓縮,如果 header 頭中不包含 “Last-Modified” 頭信息
no_etag – 啓用壓縮 ,如果 header 頭中不包含 “ETag” 頭信息
auth – 啓用壓縮 , 如果 header 頭中包含 “Authorization” 頭信息
any – 無條件啓用壓縮

gzip_vary on :和 http 頭有關係,加個 vary 頭,給代理服務器用的,有的瀏覽器支持壓縮,有的不支持,所以避免浪費不支持的也壓縮,所以根據客戶端的 HTTP 頭來判斷,是否需要壓縮。

 模塊 http_stream:
這個模塊通過一個簡單的調度算法來實現客戶端 IP 到後端服務器的負載均衡,upstream 後接負載均衡器的名字,後端 realserver 以 host:port options; 方式組織在 {} 中。如果後端被代理的只有一臺,也可以直接寫在 proxy_pass 。

location:
root /var/www/html:定義服務器的默認網站根目錄位置。如果 locationURL 匹配的是子目錄或文件,root 沒什麼作用,一般放在 server 指令裏面或/下。

index index.jsp index.html index.htm:定義路徑下默認訪問的文件名,一般跟着 root 放

proxy_pass http:/backend:請求轉向 backend 定義的服務器列表,即反向代理,對應 upstream 負載均衡器。也可以
proxy_pass http://ip:port

proxy_redirect off:指定是否修改被代理服務器返回的響應頭中的 location 頭域跟 refresh 頭域數值
例如:
設置後端服務器“Location”響應頭和“Refresh”響應頭的替換文本。 假設後端服務器返回的響
應頭是 “Location: http://localhost:8000/two/some/uri/”,那麼指令
proxy_redirect http://localhost:8000/two/ http://frontend/one/;
將把字符串改寫爲 “Location: http://frontend/one/some/uri/”。

proxy_set_header Host $host;允許重新定義或者添加發往後端服務器的請求頭。Host 的含義是表明請求的主機名,nginx 反向代理服務器會向後端真實服務器發送請求,並且請求頭中的host字段重寫爲proxy_pass指令設置的服務器。因爲nginx作爲反向代理使用,而如果後端真實的服務器設置有類似防盜鏈或者根據 http 請求頭中的 host 字段來進行路由或判斷功能的話,如果反向代理層的nginx不重寫請求頭中的host字段,將會導致請求失敗。

 

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;後端的 Web服務器可以通過 X-Forwarded-For 獲取用戶真實 IPX_Forward_For 字段表示該條 http 請求是有誰發起的?如果反向代理服務器不重寫該請求頭的話,那麼後端真實服務器在處理時會認爲所有的請求都來自反向代理服務器,如果後端有防攻擊策略的話,那麼機器就被封掉了。因此,在配置用作反向代理的 nginx 中一般會增加兩條配置,修改 http 的請求頭:proxy_set_header Host $host; proxy_set_header X-Forward-For $remote_addr;

proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;增加故障轉移,如果後端的服務器返回 502、504、執行超時等錯誤,自動將請求轉發到upstream 負載均衡池中的另一臺服務器,實現故障轉移。


proxy_set_header X-Real-IP $remote_addr;web 服務器端獲得用戶的真實 ip 但是,實際上要獲得用戶的真實 ip,也可以通過
X-Forward-For

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章