Nginx安裝、實現反向代理及深度優化(2)

博文大綱:javascript

  • 1、Nginx的安裝;
  • 2、Nginx服務實現反向代理;
  • 3、Nginx服務優化

1、Nginx的安裝

關於Nginx的基本概念,在以前的博文中:搭建Nginx服務器及其配置文件詳解 有詳細的介紹,這篇博文就直接從安裝開始談起。css

環境準備:html

  • 三臺centos 7.5,其中一臺運行Nginx,另外兩臺運行簡單的web服務便可,主要用來測試Nginx反向代理的效果;
  • 下載我提供的包,安裝Nginx時須要,用來作緩存及壓縮等優化項的。

注(實現效果以下):java

  • 結合 proxy 和 upstream 模塊實現後端 web 負載均衡;
  • 使用 proxy 模塊實現靜態文件緩存;
  • 結合 nginx 默認自帶的 ngx_http_proxy_module 模塊 和 ngx_http_upstream_module 模塊實現後端服務器的健康檢查,也可使用第三方模塊 nginx_upstream_check_module;
  • 使用 nginx-sticky-module 擴展模塊實現 保持會話;
  • 使用 ngx_cache_purge 實現更強大的緩存清除功能;
  • 使用ngx_brotli模塊實現網頁文件壓縮。

上面提到的 2 個模塊都屬於第三方擴展模塊,須要提早下好源碼(我在前面的下載連接中包含着這幾個模塊),而後編譯時經過--add-moudle=src_path 一塊兒安裝。nginx

一、安裝Nginx

[root@nginx nginx-1.14.0]# yum -y erase httpd     #卸載系統默認的httpd服務,防止端口衝突
[root@nginx nginx-1.14.0]# yum -y install openssl-devel pcre-devel    #安裝所需依賴
[root@nginx src]# rz          #rz命令上傳所需源碼包
[root@nginx src]# ls          #確認上傳的源碼包
nginx-sticky-module.zip    ngx_brotli.tar.gz
nginx-1.14.0.tar.gz  ngx_cache_purge-2.3.tar.gz
#將上傳的源碼包進行解壓
[root@nginx src]# tar zxf nginx-1.14.0.tar.gz  
[root@nginx src]# unzip nginx-sticky-module.zip 
[root@nginx src]# tar zxf ngx_brotli.tar.gz 
[root@nginx src]# tar zxf ngx_cache_purge-2.3.tar.gz 
[root@nginx src]# cd nginx-1.14.0/        #切換至nginx目錄
[root@nginx nginx-1.14.0]#  ./configure --prefix=/usr/local/nginx1.14 --user=www --group=www --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=/usr/src/ngx_cache_purge-2.3  --with-http_flv_module --add-module=/usr/src/nginx-sticky-module && make && make install
#進行編譯安裝,而且使用「--add-module」選項加載須要的模塊
#注意,以上並無加載ngx_brotli模塊,是爲了稍後展現在已經安裝nginx服務後,如何添加模塊

關於上述的編譯選項解釋以下:web

  • --with-http_stub_status_module:經過網頁監控nginx的狀態;
  • --with-http_realip_module:獲取客戶端的真實IP地址;
  • --with-http_ssl_module:開啓nginx的加密傳輸功能;
  • --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=/usr/src/ngx_cache_purge-2.3:添加nginx的第三方模塊,語法爲:--add-module=第三方模塊路徑;
  • --add-module=/usr/src/nginx-sticky-module:同上;
  • --with-http_flv_module:支持flv視頻流。

二、啓動Nginx服務

[root@nginx nginx-1.14.0]# ln -s /usr/local/nginx1.14/sbin/nginx /usr/local/sbin/
#建立nginx命令的軟鏈接,以即可以直接使用
[root@nginx nginx-1.14.0]# useradd -M -s /sbin/nologin www
[root@nginx nginx-1.14.0]# mkdir -p /var/tmp/nginx/client
[root@nginx nginx-1.14.0]# nginx -t      #檢查nginx配置文件
nginx: the configuration file /usr/local/nginx1.14/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx1.14/conf/nginx.conf test is successful
[root@nginx nginx-1.14.0]# nginx       #啓動nginx服務
[root@nginx nginx-1.14.0]# netstat -anpt | grep ":80"    #查看80端口是否在監聽
tcp   0   0 0.0.0.0:80      0.0.0.0:*        LISTEN      7584/nginx: master

2、Nginx服務實現反向代理

在實現這個反向代理以前,這裏仍是要說一下,什麼是反向代理?什麼是正向代理?算法

一、正向代理

用於代理內部網絡對 Internet 的鏈接請求(如 NAT),客戶端指定代理服務器,並將原本要直接發送給目標Web服務器的HTTP請求先發送到代理服務器上, 而後由代理服務器去訪問 Web 服務器, 並將 Web 服務器返回的信息的回傳給客戶端,此時,這個代理服務器就是正向代理。json

二、反向代理

與正向代理相反,若是局域網向Internet提供資源,並讓Internet上的其餘用戶能夠訪問局域網內資源, 也能夠設置一個代理服務器, 它提供的服務就是反向代理. 反向代理服務器接受來自 Internet 的鏈接,而後將請求轉發給內部網絡上的服務器,並將 web服務器的返回信息回傳給
Internet 上請求鏈接的客戶端。vim

總而言之:正向代理的對象是客戶端,代替客戶端去訪問web服務器;反向代理的對象是web服務器,代理web服務器去迴應客戶端。後端

三、Nginx配置反向代理

能夠配置 nginx 做爲反向代理和負載均衡,同時利用其緩存功能,將靜態頁面在 nginx 緩存,以達到下降後端服務器鏈接數的目的並檢查後端 web 服務器的健康情況。

環境以下:

  • 一臺Nginx服務器做爲反向代理;
  • 兩臺後端web服務器組成web服務器池;
  • 客戶端訪問Nginx代理服務器,能夠屢次刷新頁面,獲得不一樣後端web服務器返回的頁面。

開始配置Nginx服務器:

[root@nginx ~]# cd /usr/local/nginx1.14/conf/      #切換至指定目錄
[root@nginx conf]# vim nginx.conf           #編輯主配置文件
             ........................#省略部份內容
http{
             ........................#省略部份內容
upstream backend {
        sticky;
        server 192.168.20.2:80 weight=1 max_fails=2 fail_timeout=10s;
        server 192.168.20.3:80 weight=1 max_fails=2 fail_timeout=10s;
    }
            ........................#省略部份內容
server {
location / {
            #root   html;                            #將本來的根目錄註釋掉 
            #index  index.html index.htm;        #註釋掉改行
            proxy_pass http://backend;     #這裏指定的「backend」須與上面的web池名稱對應。
        }
   }
}
#編輯完成後,保存退出便可。
[root@nginx conf]# nginx -t            #檢查配置文件,確認無誤
[root@nginx conf]# nginx -s reload        #重啓nginx服務,以便生效

上述web服務器池的配置中有一個「sticky」的配置項,其實就是加載了nginx-sticky模塊,這個模塊的做用是經過 cookie 黏貼的方式未來自同一個客戶端(瀏覽器)的請求發送到同一個後端服務器上處理,這樣必定程度上能夠解決多個 backend servers 的會話同步的問題(所謂會話同步,就比如訪問頁面時,登陸一次便可,在必定時間段內無需再次登陸,這就是會話的概念),而 RR 輪詢模式必需要運維人員本身考慮 session 同步的實現。另外內置的 ip_hash 也能夠實現根據客戶端 IP 來分發請求,但它很容易形成負載不均衡的狀況,而若是 nginx 前面有來自同一局域網的訪問,它接收的客戶端 IP 是同樣的,容易形成負載不均衡現象。nginx-sticky-module 的 cookie 過時時間,默認瀏覽器關閉就過時。
這個模塊並不合適不支持 Cookie 或手動禁用了 cookie 的瀏覽器,此時默認 sticky 就會切換成 RR。它不能與 ip_hash 同時使用。

sticky只是Nginx支持的其中一種調度算法,下面是Nginx的負載均衡模塊支持的其餘調度算法:

  • 輪詢(默認,RR):每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端某臺服務器宕機,故障系統被自動剔除,使用戶訪問不受影響。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 模塊。

關於上述配置文件中web池中web服務器IP地址後面的配置解釋:

  • weight : 輪詢權值也是能夠用在 ip_hash 的,默認值爲 1;
  • max_fails : 容許請求失敗的次數,默認爲 1。當超過最大次數時,返回 proxy_next_upstream模塊定義的錯誤。
  • fail_timeout : 有兩層含義,一是在 10s 時間內最多允許2次失敗;二是在經歷了2次失敗之後,10s 時間內不分配請求到這臺服務器。

web服務器池中的服務器配置以下(僅供參考,這裏爲了測試,只是簡便的搭建了一下httpd服務):

[root@web01 ~]# yum -y install httpd            #安裝httpd服務
[root@web01 ~]# echo "192.168.20.2" > /var/www/html/index.html  #兩臺web服務器準備不一樣的網頁文件
[root@web01 ~]# systemctl start httpd      #啓動web服務

第二臺web服務器進行以上相同的操做便可,只是注意要準備不一樣的網頁文件,以便測試負載均衡的效果。

如今就能夠進行客戶端訪問驗證了,可是須要注意的是,nginx代理服務器必須能夠和兩臺wbe服務器進行通訊。

在nginx代理服務器上訪問本身自己測試(能夠看到是在對web服務器池中的web服務器進行輪詢):

Nginx安裝、實現反向代理及深度優化(2)

若使用Windows客戶端進行訪問測試,因爲配置文件中有「sticky」配置,因此會將每次的刷新請求仍是轉交給同一臺web服務器,並沒有法測試出負載均衡的效果,只需將「sticky」那行註釋掉,便可測試出負載均衡的效果。

3、Nginx服務優化

所謂優化,除了控制其工做線程之外,還有幾個更重要的概念,也就是緩存及網頁壓縮,因爲其涉及的配置項比較多,我將把完整的http{ }字段的配置文件寫到下面,並註釋,在博文的末尾會附上一個沒有註釋的http{ }字段。

在優化以前,我好像在編譯安裝Nginx時,故意漏掉一個模塊沒有加載,就是爲了展現若是沒有加載所需的模塊,怎麼進行加載?

配置以下:

[root@nginx conf]# cd /usr/src/nginx-1.14.0/     #切換至Nginx源碼包
[root@nginx nginx-1.14.0]# nginx -V    #執行「 Nginx -V 」,查看已加載的模塊
nginx version: nginx/1.14.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx1.14 --user=www --group=www --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=/usr/src/ngx_cache_purge-2.3 --with-http_flv_module --add-module=/usr/src/nginx-sticky-module
[root@nginx nginx-1.14.0]# ./configure --prefix=/usr/local/nginx1.14 --user=www --group=www --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=/usr/src/ngx_cache_purge-2.3 --with-http_flv_module --add-module=/usr/src/nginx-sticky-module --add-module=/usr/src/ngx_brotli && make
#將上述查到的已加載的模塊複製如下,從新編譯如下,同時,加上須要添加的模塊
#如我在上面添加了第三方模塊「--add-module=/usr/src/ngx_brotli」
[root@nginx nginx-1.14.0]# mv /usr/local/nginx1.14/sbin/nginx /usr/local/nginx1.14/sbin/nginx.bak
#將本來的Nginx控制文件更更名字,備份一下
[root@nginx nginx-1.14.0]# cp objs/nginx /usr/local/nginx1.14/sbin/    
#將新生成的Nginx命令移動到相應的目錄下
[root@nginx nginx-1.14.0]# ln -sf /usr/local/nginx1.14/sbin/nginx /usr/local/sbin/  
#對新的nginx命令作軟鏈接
[root@nginx ~]# nginx -s reload                  #nginx重啓一下服務

至此,新的模塊就添加完成了。

一、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 動態進程緩存(生產環境中不建議對動態頁面進行緩存)。

配置以下:

http {
 include       mime.types;
    default_type  application/octet-stream;
    upstream backend {
        sticky;
        server 192.168.20.2:80 weight=1 max_fails=2 fail_timeout=10s;
        server 192.168.20.3:80 weight=1 max_fails=2 fail_timeout=10s;
    }
   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;

        #增長如下幾行配置
    proxy_buffering on;   #代理的時候,開啓緩衝後端服務器的響應
    proxy_temp_path /usr/local/nginx1.14/proxy_temp;
    proxy_cache_path /usr/local/nginx1.14/proxy_cache levels=1:2 keys_zone=my-cache:100m inactive=600m max_size=2g;
# server字段配置以下:
server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location ~/purge(/.*) {    #這個purge字段用來實現手動清除緩存
        allow 127.0.0.1;
        allow 192.168.20.0/24;
        deny all;
        proxy_cache_purge my-cache $host$1$is_args$args;
        }
        location / {
            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;
        }
}
#編輯完成後,保存退出便可
[root@nginx conf]# nginx -t        #檢查配置文件
nginx: the configuration file /usr/local/nginx1.14/conf/nginx.conf syntax 
nginx: [emerg] mkdir() "/usr/local/nginx1.10/proxy_temp" failed (2: No suc
nginx: configuration file /usr/local/nginx1.14/conf/nginx.conf test failed
#提示相應的目錄沒有找到
[root@nginx conf]# mkdir -p /usr/local/nginx1.10/proxy_temp    #那就建立相應的目錄咯
[root@nginx conf]# nginx -t      #再次檢查,OK了
nginx: the configuration file /usr/local/nginx1.14/conf/nginx.conf syntax  is ok
nginx: configuration file /usr/local/nginx1.14/conf/nginx.conf test is successful
[root@nginx conf]# nginx -s reload         #重啓Nginx服務

客戶端訪問測試(使用的是谷歌瀏覽器,訪問前按F12):
Nginx安裝、實現反向代理及深度優化(2)

按「F5」刷新一下:
Nginx安裝、實現反向代理及深度優化(2)

MISS 表示未命中,請求被傳送到後端;HIT 緩存命中(由於第一次訪問,Nginx服務器並無相應網頁的緩存,因此會傳送到後端web,第二次刷新時,Nginx本地就有緩存了,因此是「HIT」,緩存命中)。

查看Nginx的訪問日誌,也能夠查看到記錄的緩存相關信息:

[root@nginx conf]# tail ../logs/access.log      #查看訪問日誌

Nginx安裝、實現反向代理及深度優化(2)
客戶端訪問如下地址(客戶端必須在 location ~/purge(/.*)容許的網段內),能夠在緩存失效前,手動清除Nginx服務器上的緩存(若沒有成功,先手動清除一下客戶端瀏覽器的緩存):

我這裏的圖片截錯了,很差意思,若須要手動清理緩存的話,若是訪問時指定的URL是「192.168.20.5/index.html」,那麼在清除緩存時,須要指定的URL就是「192.168.20.5/purge/index.html」,若訪問時指定的URL是「192.168.20.5」,那麼在手動清除緩存時,須要指定的URL是「 192.168.20.5/purge/ 」
Nginx安裝、實現反向代理及深度優化(2)

以上部分配置的相關解釋以下:

  • proxy_buffering [ on | off ]; 代理的時候,開啓或關閉緩衝後端服務器的響應,當開啓緩衝時,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/nginx1.10/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 等正常結果能夠緩存的時間長點,而 40四、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服務的壓縮功能

更改配置文件以下(相關解釋請參考博文末尾):

http {
    include       mime.types;
    default_type  application/octet-stream;
    brotli on;
    brotli_types text/plain text/css text/xml application/xml application/json;
    brotli_static off;       #是否容許查找預處理好的、以 .br結尾的壓縮文件,可選值爲on、off、always。
    brotli_comp_level 11;        #壓縮的級別,範圍是「1~14」,值越大,壓縮比越高
    brotli_buffers 16 8k;      #讀取緩衝區數量和大小
    brotli_window 512k;       #滑動窗口大小
    brotli_min_length 20;    #指定壓縮數據的最小字節
    gzip  on;        #開啓 gzip 壓縮輸出,減小網絡傳輸。
    gzip_comp_level 6;     # gzip 壓縮比,1 壓縮比最小處理速度最快,9 壓縮比最大但處理速度最慢(傳輸快但比較消耗 cpu)。
    gzip_http_version 1.1;    #用於識別 http 協議的版本,早期的瀏覽器不支持 Gzip 壓縮,用戶就會看到亂碼,因此爲了支持前期版本加上了這個選項,若是你用了 Nginx 的反向代理並指望也啓用 Gzip 壓縮的話,因爲末端通訊是 http/1.1協議,故請設置爲 1.1。
    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_min_length 1k;
    gzip_buffers 16 8k;
    gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
    gzip_vary on;      #和 http 頭有關係,加個 vary 頭,給代理服務器用的,有的瀏覽器支持壓縮,有的不支持,因此避免浪費不支持的也壓縮,因此根據客戶端的 HTTP 頭來判斷,是否須要壓縮
    client_max_body_size 10m;     #容許客戶端請求的最大單文件字節數。若是有上傳較大文件,請設置它的限制值
    client_body_buffer_size 128k;    #緩衝區代理緩衝用戶端請求的最大字節數
        server_tokens off;     #隱藏 nginx 的版本號
        #如下是http_proxy模塊:
    proxy_connect_timeout 75;      #nginx 跟後端服務器鏈接超時時間(代理鏈接超時)
    proxy_send_timeout 75;
    proxy_read_timeout 75;    #定義從後端服務器讀取響應的超時。此超時是指相鄰兩次讀操做之間的最長時間間隔,而不是整個響應傳輸完成的最長時間。若是後端服務器在超時時間段內沒有傳輸任何數據,鏈接將被關閉。
    proxy_buffer_size 4k;    #設置緩衝區的大小爲 size。nginx 從被代理的服務器讀取響應時,使用該緩衝區保存響應的開始部分。這部分一般包含着一個小小的響應頭。該緩衝區大小默認等於 proxy_buffers 指令設置的一塊緩衝區的大小,但它也能夠被設置得更小。
    proxy_buffers 4 32k;     #語法: proxy_buffers the_number is_size;爲每一個鏈接設置緩衝區的數量爲 number,每塊緩衝區的大小爲 size。這些緩衝區用於保存從被代理的服務器讀取的響應。每塊緩衝區默認等於一個內存頁的大小。這個值是 4K 仍是8K,取決於平臺。
#附:[root@nginx ~]# getconf PAGESIZE     #查看Linux內存頁的大小
#4096

    proxy_busy_buffers_size 64k;    #高負荷下緩衝大小(默認大小是 proxy_buffers 指令設置單塊緩衝大小的 2 倍)
    proxy_temp_file_write_size 64k;    #當緩存被代理的服務器響應到臨時文件時,這個選項限制每次寫臨時文件的大小。
    proxy_buffering on;
    proxy_temp_path /usr/local/nginx1.14/proxy_temp;
    proxy_cache_path /usr/local/nginx1.14/proxy_cache levels=1:2 keys_zone=my-cache:100m inactive=600m max_size=2g;
    upstream backend {
       sticky;
        server 192.168.20.2:80 weight=1 max_fails=2 fail_timeout=10s;
        server 192.168.20.3:80 weight=1 max_fails=2 fail_timeout=10s;
    }

    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;
    sendfile        on;     #開啓高效文件傳輸模式。
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;        #長鏈接超時時間,單位是秒,長鏈接請求大量小文件的時候,能夠減小重建鏈接的開銷,若是設置時間過長,用戶又多,長時間保持鏈接會佔用大量資源。
    server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location ~/purge(/.*) {
        allow 127.0.0.1;
        allow 192.168.20.0/24;
        deny all;
        proxy_cache_purge my-cache $host$1$is_args$args;
        }
        location / {
            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-Real-IP $remote_addr;        
#web 服務器端得到用戶的真實 ip 可是,實際上要得到用戶的真實 ip,也能夠經過下面的X-Forward-For
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#後端的 Web服務器能夠經過 X-Forwarded-For 獲取用戶真實 IP,X_Forward_For 字段
#表示該條 http 請求是有誰發起的?若是反向代理服務器不重寫該請求頭的話,那麼後端
#真實服務器在處理時會認爲全部的請求都來自反向代理服務器,若是後端有防禦策略
#的話,那麼機器就被封掉了。所以,在配置用做反向代理的 nginx 中通常會增長兩條配置,以便修改 http 的請求頭部
          #如下兩條是修改 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;
#增長故障轉移,若是後端的服務器返回 50二、50四、執行超時等錯誤,
#自動將請求轉發到upstream 負載均衡池中的另外一臺服務器,實現故障轉移。
            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;
            }
          ....................#省略部份內容
}
#更改完成後保存退出便可
[root@nginx nginx1.14]# nginx -t     #檢查配置文件
nginx: the configuration file /usr/local/nginx1.14/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx1.14/conf/nginx.conf test is successful
[root@nginx nginx1.14]# nginx -s reload        #重啓Nginx服務

驗證:

一、訪問如下地址,能夠查看Nginx服務器的狀態統計頁:
Nginx安裝、實現反向代理及深度優化(2)

二、查看GZIP功能是否開啓:
Nginx安裝、實現反向代理及深度優化(2)

三、測試br壓縮功能是否開啓(須要使用命令行的方式訪問):

Nginx安裝、實現反向代理及深度優化(2)

附加:http{ }字段、server{ }字段無註釋的配置文件以下:

http {
    include       mime.types;
    default_type  application/octet-stream;
    brotli on;
    brotli_types text/plain text/css text/xml application/xml application/json;
    brotli_static off;
    brotli_comp_level 11;
    brotli_buffers 16 8k;
    brotli_window 512k;
    brotli_min_length 20;
    gzip  on;
    gzip_comp_level 6;
    gzip_http_version 1.1;
    gzip_proxied any;
    gzip_min_length 1k;
    gzip_buffers 16 8k;
    gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
    gzip_vary on;
    client_max_body_size 10m;
    client_body_buffer_size 128k;
    server_tokens off;
    proxy_connect_timeout 75;
    proxy_send_timeout 75;
    proxy_read_timeout 75;
    proxy_buffer_size 4k;
    proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
    proxy_buffering on; 
    proxy_temp_path /usr/local/nginx1.14/proxy_temp;
    proxy_cache_path /usr/local/nginx1.14/proxy_cache levels=1:2 keys_zone=my-cache:100m inactive=600m max_size=2g;
    upstream backend {
       sticky;
        server 192.168.20.2:80 weight=1 max_fails=2 fail_timeout=10s;
        server 192.168.20.3:80 weight=1 max_fails=2 fail_timeout=10s;
    }   

    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;
    sendfile        on; 
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65; 

    #gzip  on;
   server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location ~/purge(/.*) {
        allow 127.0.0.1;
        allow 192.168.20.0/24;
        deny all;
        proxy_cache_purge my-cache $host$1$is_args$args;
        }
        location / {
            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;
        }
            location /nginx_status {
                stub_status on;
                access_log off;
                allow 192.168.20.0/24;
                deny all;
            }

        location = /50x.html {
            root   html;
        }
     }
}

———————— 本文至此結束,感謝閱讀 ————————

相關文章
相關標籤/搜索