Nginx 反向代理與緩存功能

Nginx反向代理(動靜分離)

              |---------Nginx+php-fpm(B)
Nginx(A)------|
              |---------Nginx+pho-fpm(C)

1、網(wǎng)頁代碼全是PMA。
2、Nginx處理靜態(tài)資源非常強(qiáng)大,在A上部署上PMA代碼,用以處理靜態(tài)資源的請求,且將PHP類資源的請求反向代理至B,C上
3、B,C上同樣部署PMA代碼,反向代理A將動態(tài)資源的請求發(fā)送至B,C處理,并且是基于IP_HASH的方式。
4、B上部署數(shù)據(jù)庫mariadb。

實驗配置:

定義后端Server組:源ip_hash方式均衡,權(quán)重為10,超時5s,最大嘗試3次失敗.
upstream pma {
   ip_hash;
   server 192.168.3.6 weight=10 fail_timeout=5s max_fails=3;
   server 192.168.10.27 weight=10 fail_timeout=5s max_fails=3;
}
    location / {
        location ~ \.(php|php5)?$ {
            proxy_pass  http://pma;       //PHP的代碼交給B,C服務(wù)器處理
            proxy_set_header X-RealA-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $Host;
            proxy_redirect     off;
        }
        location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
                root /data/webapps/pma;     //靜態(tài)類資源由本地響應(yīng)
                expires      3d;
                add_header Static Nginx-Proxy;
        }
    }

Nginx緩存功能

expires方式:靜態(tài)資源,啟用expires方式,其實是服務(wù)器在HTTP相應(yīng)頭部插入cache-control的字段,字段內(nèi)容類似(max-age=259200),由expires設(shè)置的時間換算得到,這樣可以節(jié)約帶寬資源。

cache方式:在本地磁盤創(chuàng)建一個文件目錄,根據(jù)設(shè)置,將請求的資源以K-V形式緩存在此目錄當(dāng)中,KEY需要自己定義,url的hash結(jié)果,同時可以根據(jù)需要指定某內(nèi)容的緩存時長,比如狀態(tài)碼為200緩存10分鐘,狀態(tài)碼為301,302的緩存5分鐘,其他所有內(nèi)容緩存1分鐘,且當(dāng)后端服務(wù)器響應(yīng)類似error,500,501,502等等狀態(tài)碼時,是否可以利用過期緩存響應(yīng)瀏覽器,等等。

實驗配置:

    proxy_cache_path /data/cache/nginx/ levels=1:2 keys_zone=one:10m inactive=1d;    //inactive表示緩存的時間,到期之后將會把緩存清理
    location / {
        location ~ \.(php|php5)?$ {
            proxy_cache one;
            proxy_cache_key    $uri$is_args$args;     //以此變量值做HASH,作為KEY
            add_header X-Cache $upstream_cache_status;     //HTTP響應(yīng)首部可以看到X-Cache字段,內(nèi)容可以有HIT,MISS,EXPIRES等等
            proxy_cache_valid 200 10m;
            proxy_cache_valid 301 302 5m;
            proxy_cache_valid any 1m;
            proxy_cache_use_stale error http_500 http_502 http_503 http_504;
            proxy_pass  http://pma;
            proxy_set_header X-RealA-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $Host;
            proxy_redirect     off;
        }
        location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
                root /data/webapps/pma;
                expires      3d;
                add_header Static Nginx-Proxy;
        }
    }

建立index.php測試頁面可以看到緩存效果。

此兩類情況都是由前端反向代理Nginx來提供靜態(tài)資源,所以代碼需要部署在三臺server,也可以將代碼部署在B,C,而前端A,開啟緩存,將B,C返回給瀏覽器的靜態(tài)資源緩存在本地。

    location / {
        location ~ \.(php|php5)?$ {
            proxy_cache one;
            proxy_cache_key    $uri$is_args$args;     //以此變量值做HASH,作為KEY
            add_header X-Cache $upstream_cache_status;     //HTTP響應(yīng)首部可以看到X-Cache字段,內(nèi)容可以有HIT,MISS,EXPIRES等等
            proxy_cache_valid 200 10m;
            proxy_cache_valid 301 302 5m;
            proxy_cache_valid any 1m;
            proxy_cache_use_stale error http_500 http_502 http_503 http_504;
            proxy_pass  http://pma;
            proxy_set_header X-RealA-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $Host;
            proxy_redirect     off;
        }
        location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
        #   root /data/webapps/pma;
            proxy_pass  http://pma;
            proxy_cache one;
            proxy_cache_key    $uri$is_args$args;
            add_header X-Cache $upstream_cache_status;
            proxy_cache_valid 200 10m;
            proxy_cache_valid 301 302 20m;
            proxy_cache_valid any 1m;
            proxy_cache_use_stale error http_500 http_502 http_503 http_504;
            expires      3d;
            add_header Static Nginx-Proxy;
        }
    }

在/data/cache/nginx目錄下有很多以單字符命名的目錄文件,在這些目錄文件下還有以雙字符命名的目錄文件,最后才是由proxy_cache_key經(jīng)過HASH處理的字符文件名。

nginx緩存修剪需要在編譯安裝時添加第三方模塊,ngx_cache_purge
下載地址:
https://github.com/FRiCKLE/ngx_cache_purge/

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --add-module=../ngx_cache_purge-2.3
# 配置:
location ~ /purge(/.*) {
            allow 127.0.0.1;
            allow 192.168.0.0/16;
            deny all;
            proxy_cache_purge one $uri;
}

測試訪問:表示對2.png這個圖片資源進(jìn)行修剪
pmatest.com/purge/2.png

部署pma代碼,PHP程序代碼里面會有控制緩存機(jī)制,包括cookie
值,需要另外設(shè)置是否針對此類似情況進(jìn)行緩存。
這部分就涉及到緩存的優(yōu)先級,php程序?qū)彺嬗性O(shè)置緩存時間,nginx代理服務(wù)器可以對緩存設(shè)置緩存時間。

當(dāng)響應(yīng)報文出現(xiàn)Cache_Control:'no-store, no-cache,....'出現(xiàn)類似字段,這類似php程序要求對此類資源不做緩存,此時就算nginx反向代理服務(wù)器設(shè)置緩存過期時間也是沒有效果。
緩存的優(yōu)先級:
inactvie、源服務(wù)器端Expires、源服務(wù)器端max-age、proxy_cache_valid

<<nginx緩存優(yōu)先級>>
http://www.ttlsa.com/nginx/nginx-cache-priority/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容