1. Nginx怎樣設置瀏覽器緩存
瀏覽器緩存(BrowserCaching)
為了加速瀏覽器,瀏覽器在用戶磁碟上,對最近請求過的文檔進行存儲。
當訪問者再次請求這個頁面時,瀏覽器就可以從本地磁碟顯示文檔,這樣,就可以加速頁面的閱覽,緩存的方式節約了網路的資源,提高了網路的效率。
瀏覽器緩存可以通過expires指令輸出Header頭來實現,expires指令的語法如下
語法:expires[time| epoch | max |off]
默認值:expiresoff
作用域:http、server、location
用途:使用本指令可以控制http應答中的expires和Cache-Control的Header頭信息,起到控制頁面緩存的作用。
參數說明
Time,可以使用正數或負數,Expires頭標的值,將通過當前系統時間加上設定的time值來獲得。
epoch,指定expires的值為1January,1970,00:00:01 GMT。
Max,指定expires的值為31December 2037 23:59:59 GMT,Cache-Control的值為10年。
Off,表示不修改Expires和Cache-Control的值。
一個HTML頁面,會引用一些JavaScript文件、圖片文件、而這些格式的文件很少會被修改,則可以通過expires設置瀏覽器緩存。
比如,對常見格式的圖片、Flash文件在瀏覽器本地緩存30天,對JS、CSS文件在瀏覽器本地緩存1小時,代碼如下
2. php怎麼讀取設置nginx緩存
nginx緩存
nginx有兩種緩存機制:fastcgi_cache和proxy_cache
下面我們來說說這兩種緩存機制的區別吧
proxy_cache作用是緩存後端伺服器的內容,可能是任何內容,包括靜態的和動態的
fastcgi_cache作用是緩存fastcgi生成的內容,很多情況是php生成的動態內容
proxy_cache緩存減少了nginx與後端通信的次數,節省了傳輸時間和後端帶寬
fastcgi_cache緩存減少了nginx與php的通信次數,更減輕了php和資料庫的壓力。
proxy_cache緩存設置
#註:proxy_temp_path和proxy_cache_path指定的路徑必須在同一分區
proxy_temp_path/data0/proxy_temp_dir;
#設置Web緩存區名稱為cache_one,內存緩存空間大小為200MB,1天沒有被訪問的內容自動清除,硬碟緩存空間大小為30GB。
proxy_cache_path/data0/proxy_cache_dirlevels=1:2keys_zone=cache_one:200minactive=1dmax_size=30g;
server
{
listen80;
server_namewww.yourdomain.com192.168.8.42;
indexindex.htmlindex.htm;
root/data0/htdocs/www;
location/
{
#如果後端的伺服器返回502、504、執行超時等錯誤,自動將請求轉發到upstream負載均衡池中的另一台伺服器,實現故障轉移。
proxy_next_upstreamhttp_502http_504errortimeoutinvalid_header;
proxy_cachecache_one;
#對不同的HTTP狀態碼設置不同的緩存時間
proxy_cache_valid20030412h;
#以域名、URI、參數組合成Web緩存的Key值,Nginx根據Key值哈希,存儲緩存內容到二級緩存目錄內
proxy_cache_key$host$uri$is_args$args;
proxy_set_headerHost$host;
proxy_set_headerX-Forwarded-For$remote_addr;
proxy_passhttp://backend_server;
expires1d;
}
#用於清除緩存,假設一個URL為http://192.168.8.42/test.txt,通過訪問http://192.168.8.42/purge/test.txt就可以清除該URL的緩存。
location~/purge(/.*)
{
#設置只允許指定的IP或IP段才可以清除URL緩存。
allow127.0.0.1;
allow192.168.0.0/16;
denyall;
proxy_cache_purgecache_one$host$1$is_args$args;
}
#擴展名以.php、.jsp、.cgi結尾的動態應用程序不緩存。
location~.*.(php|jsp|cgi)?$
{
proxy_set_headerHost$host;
proxy_set_headerX-Forwarded-For$remote_addr;
proxy_passhttp://backend_server;
}
access_logoff;
}
}
fastcgi_cache緩存設置
#定義緩存存放的文件夾
fastcgi_cache_path/tt/cachelevels=1:2keys_zone=NAME:2880minactive=2dmax_size=10G;
#定義緩存不同的url請求
fastcgi_cache_key"$scheme$request_method$host$uri$arg_filename$arg_x$arg_y";
server{
listen8080;
server_namewww.example.com;
location/{
root/www;
indexindex.htmlindex.htmindex.php;
}
location~(|.php)${
root/www;
fastcgi_pass127.0.0.1:9000;
fastcgi_cacheNAME;
fastcgi_cache_valid20048h;
fastcgi_cache_min_uses1;
fastcgi_cache_use_staleerrortimeoutinvalid_headerhttp_500;
fastcgi_indexindex.php;
fastcgi_paramSCRIPT_FILENAME/scripts$fastcgi_script_name;
includefastcgi.conf;
#設置緩存的過程中發現無法獲取cookie,經查需要定義這句話
fastcgi_pass_headerSet-Cookie;
}
log_formataccess'$remote_addr-$remote_user[$time_local]"$request"'
'$status$body_bytes_sent"$http_referer"'
'"$http_user_agent"$http_x_forwarded_for';
access_log/httplogs/access.logaccess;
}
總的來說nginx的proxy_cache和fastcgi_cache的緩存配置差不多。
memcache緩存
在討論memcache緩存之前,我們先了解下mysql的內存緩存吧
mysql的內存緩存可以在my.cnf中指定大小:內存表和臨時表不同,臨時表也是存放內存中,臨時表最大的內存需要通過tmp_table_size=128M設定。當數據查過臨時表的最大值設定時,自動轉為磁碟表,此時因需要進行IO操作,性能會大大下降,而內存表不會,內存滿了後,會提示數據滿錯誤。
例:
createtabletest
(
idintunsignednotnullauto_incrementprimarykey
statechar(10),
typechar(20),
datechar(30)
)engine=memorydefaultcharset=utf8
內存表的特性:
1.內存表的表定義存放在磁碟上,擴展名為.frm,所以重啟不會丟失
2.內存表的數據是存放在內存中,重啟會丟失數據
3.內存表使用一個固定的長度格式
4.內存表不支持blob或text列,比如varchar與text欄位就不會被支持
5.內存表支持auto_increment列和對可包含null值的列的索引
6.內存表不支持事物
7.內存表是表鎖,當修改頻繁時,性能可能會下降
轉自:
http://www.nowamagic.net/librarys/veda/detail/1405
下面我們來看看memcache,相對而言mysql的內存表限制較多。
memcache的用途
1.提高系統的並發能力
2.減輕資料庫的負擔
註:memcachelinux系統32位只支持4G內存,同時memcache最長保存時間為30天。
3. 如何給html網頁設置緩存
在Apache環境下,可以通過在.htaccess文件中添加下面的代碼,設置圖片的HTTP緩存和有效期(需要開啟apache的headers模塊支持):
# Image and Flash content Caching for ONE Year blog.gimhoy.com<FilesMatch ".(flv|gif|jpg|jpeg|png|ico|swf)$"> Header set Cache-Control "max-age=3156000"
其中max-age後面這個數字就是設置的緩存有效期(以秒為單位),比如上面的代碼設置了網站的圖片使用為期一年(3156000秒)的HTTP緩存。
在Nginx下,可以通過修改nginx.conf配置文件,來修改緩存設置:
location ~* \.(flv|gif|jpg|jpeg|png|ico|swf)$ { expires 1y; access_log off; break; }
同樣的方法,你也可以給js和css文件設置緩存。
4. NGINX proxy 模塊如何如何緩存動態頁面內容如何讓緩存過期
這里用虛擬機配置了下:
nginx 配置文件內容:
主要是這一句:
proxy_cache_path /www/ levels=1:2 keys_zone=Z:10m inactive=1m max_size=30g;
這一句定義一個區域,名字是 Z ,在內存中的空間為10MB ,硬碟中的最大空間為 30G;
inactive=1m 是,1分鍾之後緩存失效 ,從新從源伺服器請求
這里糾正一下,inactive=1m 如果緩存1分鍾沒人訪問,nginx 會刪除掉這些緩存
/usr/local/nginx/conf/nginx.conf
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
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"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
proxy_cache_path /www/ levels=1:2 keys_zone=Z:10m inactive=1m max_size=30g;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /www/;
#expires max;
#proxy_store on;
#proxy_store_access user:rw group:rw all:rw;
#proxy_temp_path /www/;
proxy_cache Z;
proxy_cache_valid 200 1m;
#expires max;
include proxy.conf;
if ( !-e $request_filename) {
proxy_pass http://192.168.1.199:45815;
}
}
#這里設置當 訪問 /ajax/目錄下的內容時候,直接從源伺服器讀取,主要用於ajax 的訪問請求,要求實時的
location /ajax/ {
include proxy.conf;
if ( !-e $request_filename) {
proxy_pass http://192.168.1.199:45815;
}
}
#location ~.*\.(jpg|png|jpeg|gif)
#{
# expires max;
#}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443;
# server_name localhost;
# ssl on;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_timeout 5m;
# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
/usr/local/nginx/conf/proxy.conf
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_set_header Accept-Encoding 'gzip';
client_max_body_size 100m;
client_body_buffer_size 256k;
proxy_connect_timeout 60;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffer_size 512k;
proxy_buffers 8 512k;
proxy_busy_buffers_size 512k;
proxy_temp_file_write_size 512k;
一開始我就這樣配置,認為可以成功了,結果發現動態文件無法被緩存,而html 文件可以被緩存,後來就到很多地方去問,
心想會不會是因為 文件 的 頭信息或者Last-Modified
信息和 ETag 造成的,就去問,http://www.dewen.org/q/9769/nginx+%E5%A6%82%E4%BD%95%E7%BC%93%E5%AD%98%E5%8A%A8%E6%80%81%E9%A1%B5%E9%9D%A2%EF%BC%9F
發現果真如此,馬上修改源伺服器的動態文件,加入以下代碼:
<%@ Page Language="C#" %>
<%
string date = Request.Headers.Get("If-Modified-Since");
if (date != null)
{
Response.StatusCode = 304;
Response.StatusDescription = "from cache";
return;
}
DateTime expDate = new DateTime(2037, 12, 31, 23, 55, 55);
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetExpires(expDate);
Response.Cache.SetMaxAge(expDate - DateTime.Now);
Response.Cache.SetLastModified(new DateTime(2000, 1, 1));
%>
<%=DateTime.Now.ToString()%>
然後發現就可以緩存動態文件了。至此,下一步我就可以用nginx 作為用戶訪問的 伺服器了
這里截一些圖:
5. 如何利用Nginx的緩沖,緩存優化提升性能
反向代理的一個問題是代理大量用戶時會增加伺服器進程的性能沖擊影響。在大多數情況下,可以很大程度上能通過利用Nginx的緩沖和緩存功能減輕。
當代理到另一台伺服器,兩個不同的連接速度會影響客戶的體驗:
從客戶機到Nginx代理的連接。
從Nginx代理到後端伺服器的連接。
Nginx具有優化這些連接調整其行為的能力。
如果沒有緩沖,數據從代理的伺服器發送並立即開始被發送到客戶。如果假定客戶端很快,緩沖可以關閉而盡快使數據到客戶端,有了緩沖,Nginx 代理將暫時存儲後端的響應,然後按需供給數據給客戶端。如果客戶端是緩慢的,允許Nginx伺服器關閉到後端的連接。然後,它可以處理數據分配到客戶端, 以任何可能的速度。
Nginx默認有緩沖設計,因為客戶端往往有很大的不同的連接速度。我們可以用以下指令調節緩沖行為。可以在HTTP,server或 location位置來設置。重要的是要記住,大小size指令是針對每個請求配置的,所以增加超出你需求會影響你的性能,如果這時有許多客戶端請求:
proxy_buffering:該指令控制緩沖是否啟用。默認情況下,它的值是「on」。
proxy_buffers:該指令控制代理響應緩沖區的數量(第一個參數)和大小(第二個參數)。默認配置是8個緩沖區大小等於一個內存頁(4K或者8K)。增加緩沖區的數目可以讓你緩沖更多信息。
proxy_buffer_size:從後端伺服器的響應頭緩沖區大小,它包含headers,和其他部分響應是分開的。該指令設置響應部分的緩沖區大小。默認情況下,它和proxy_buffers是相同的尺寸,但因為這是用於頭信息,這通常可以設置為一個較低的值。
proxy_busy_buffers_size:此指令設置標注「client-ready」緩沖區的最大尺寸。而客戶端可以一次讀取來自一個緩沖區的數據,緩沖被放置在隊列中,批量發送到客戶端。此指令控制允許是在這種狀態下的緩沖空間的大小。
proxy_max_temp_file_size:這是每個請求能用磁碟上臨時文件最大大小。這些當上游響應太大不能裝配到緩沖區時被創建。
proxy_temp_file_write_size:這是當被代理伺服器的響應過大時Nginx一次性寫入臨時文件的數據量。
proxy_temp_path:當上游伺服器的響應過大不能存儲到配置的緩沖區域時,Nginx存儲臨時文件硬碟路徑。
正如你所看到的,Nginx提供了相當多的不同的指令來調整緩沖行為。大多數時候,你不必擔心太多,但它對於調整一些值可能是有用的。可能最有用的調整是proxy_buffers和proxy_buffer_size指令。
6. nginx 反代里緩存怎麼清理
最簡單的反代+全緩存腳本:
#新建2個目錄,放置緩存文件:
mkdir -p /home/cache/path
mkdir /home/cache/temp
修改/usr/local/nginx/conf/nginx.conf的http層,添加以下代碼:
client_body_buffer_size 512k;
proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_temp_path /home/cache/temp;
proxy_cache_path /home/cache/path levels=1:2 keys_zone=cache_one:10m inactive=7d max_size=30g;
#500m是內存佔用,7d是7天無訪問刪除,30g是緩存占具硬碟空間
#limit_zone crawler $binary_remote_addr 10m; #這段是用於限制單ip連接數的,如果頻繁出現後端負載過大可以嘗試去掉#。
(6)nginx配置indexhtml緩存擴展閱讀:
nginx僅僅處理靜態頁面,動態的頁面(php請求)統統都交付給後台的兩台apache來處理。也就是說,可以把網站的靜態頁面或者文件放置到nginx的目錄下;動態的頁面和資料庫訪問都保留到後台的apache伺服器上。
假設前端nginx(為127.0.0.1:8080)僅僅包含一個靜態頁面index.html;後 台的兩個apache伺服器(分別為localhost:80和158.37.70.143:80),一台根目錄放置phpMyAdmin文件夾和 test.php(裡面測試代碼為print "server1";),另一台根目錄僅僅放置一個test.php(裡面測試代碼為print "server2";)。
7. 如何在nginx中緩存靜態文件
首先確定配置文件httpd.conf中確已經載入mod_headers模塊。LoadMoleheaders_molemoles/mod_headers.so我們可以根據文件類型來讓瀏覽器每次都從伺服器讀取,這里測試用css、js、swf、php、html、htm這幾種文件。HeadersetCache-Control"private,no-cache,no-store,proxy-revalidate,no-transform"HeadersetPragma"no-cache"