Nginx反向代理(動靜分離)
|---------Nginx+php-fpm(B)
Nginx(A)------|
|---------Nginx+pho-fpm(C)
1靠粪、網(wǎng)頁代碼全是PMA足丢。
2、Nginx處理靜態(tài)資源非常強大庇配,在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這個圖片資源進行修剪
pmatest.com/purge/2.png
部署pma代碼雷逆,PHP程序代碼里面會有控制緩存機制弦讽,包括cookie
值,需要另外設(shè)置是否針對此類似情況進行緩存膀哲。
這部分就涉及到緩存的優(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/