1. nginx缓存清理
你找nginx配置中的expire参数,这个是设定缓存时间的,如果你不需要缓存,可以去掉该参数,或者是设置成-1,如下图所示:
2. 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小时,代码如下
3. linux nginx缓存文件在哪个文件夹
假设你是用包管理工具安装的nginx:
如果你是redhat系列的,安装包是.rpm包,或者你用yum安装的话,这样查找:
rpm -ql nginx
如果是ubuntu,也是类似的方法,具体参数你可以查查
如果你是源码安装的nginx
那么需要问问安装的人了,或者到/etc/nginx目录下翻一翻配置文件?
4. 如何在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"
5. nginx 缓存怎么都在tmp
nginx缓存cache的5种方案
1、传统缓存之一(404)
这个办法是把nginx的404错误定向到后端,然后用proxy_store把后端返回的页面保存。
配置:
location / {
root /home/html/;#主目录
expires 1d;#网页的过期时间
error_page 404 =200 /fetch$request_uri;#404定向到/fetch目录下
}
location /fetch/ {#404定向到这里
internal;#指明这个目录不能在外部直接访问到
expires 1d;#网页的过期时间
alias /html/;
proxy_store会将文件保存到这目录下
proxy_passhttp://www.jb51.net/;#后端upstream地址,/fetch同时是一个代理
proxy_set_header Accept-Encoding '';#让后端不要返回压缩(gzip或deflate)的内容,保存压缩后的内容会引发乱子。
proxy_store on;#指定nginx将代理返回的文件保存
proxy_temp_path /home/tmp;#临时目录,这个目录要和/home/html在同一个硬盘分区内
}
使用的时候还有要注意是nginx要有权限往/home/tmp和/home/html下有写入文件的权限,在linux下nginx一般会配
置成nobody用户运行,这样这两个目录就要chown nobody,设成nobody用户专用,当然也可以chmod
777,不过所有有经验的系统管理员都会建议不要随便使用777。
2、传统缓存之二(!-e)
原理和404跳转基本一致,但更简洁一些:
location / {
root /home/html/;
proxy_store on;
proxy_set_header Accept-Encoding '';
proxy_temp_path /home/tmp;
if ( !-f $request_filename )
{
proxy_passhttp://www.jb51.net/;
}
}
可以看到这个配置比404节约了不少代码,它是用!-f来判断请求的文件在文件系统上存不存在,不存在就proxy_pass到后端,返回同样是用proxy_store保存。
两种传统缓存都有着基本一样的优点和缺点:
缺点1:不支持带参数的动态链接,比如read.php?id=1,因为nginx只保存文件名,所以这个链接只在文件系统下保存为
read.php,这样用户访问read.php?id=2时会返回不正确的结果。同时不支持http://www.jb51.net/这种形式的首页和
二级目录http://www.jb51.net/download/,因为nginx非常老实,会将这样的请求照链接写入文件系统,而这个链接显然是一
个目录,所以保存失败。这些情况都需要写rewrite才能正确保存。
缺点2:nginx内部没有缓存过期和清理的任何机制,这些缓存的文件会永久性地保存在机器上,如果要缓存的东西非常多,那就会撑暴整个硬盘空间。为此可以使用一个shell脚本定期清理,同时可以撰写php等动态程序来做实时更新。
缺点3:只能缓存200状态码,因此后端返回301/302/404等状态码都不会缓存,假如恰好有一个访问量很大的伪静态链接被删除,那就会不停穿透导致后端承载不小压力。
缺点4:nginx不会自动选择内存或硬盘作为存储介质,一切由配置决定,当然在当前的操作系统里都会有操作系统级的文件缓存机制,所以存在硬盘上也不需要过分担心大并发读取造成的io性能问题。
nginx传统缓存的缺点也是它和squid等缓存软件的不同之特色,所以也可看作其优点。在生产应用中它常常用作和squid的搭档,squid对
于带?的链接往往无法阻挡,而nginx能将其访问拦住,例如:http://jb51.net/?和http://jb51.net/在squid上会
被当做两个链接,所以会造成两次穿透;而nginx只会保存一次,无论链接变成http://jb51.net/?1还是http://jb51.net
/?123,均不能透过nginx缓存,从而有效地保护了后端主机。
nginx会非常老实地将链接形式保存到文件系统中,这样对于一个链接,可以很方便地查阅它在缓存机器上的缓存状态和内容,也可以很方便地和别的文件管理器如rsync等配合使用,它完完全全就是一个文件系统结构。
这两种传统缓存都可以在linux下将文件保存到/dev/shm里,一般我也是这么做的,这样可以利用系统内存来做缓存,利用内存的话,清理过期内
容速度就会快得多。使用/dev/shm/时除了要把tmp目录也指向到/dev/shm这个分区外,如果有大量小文件和目录,还要修改一下这个内存分区
的inode数量和最大容量:
mount -o size=2500M -o nr_inodes=480000 -o noatime,nodiratime -o remount /dev/shm
上面的命令在一台有3G内存的机器上使用,因为/dev/shm默认最大内存是系统内存的一半就是1500M,这条命令将其调大成2500M,
同时shm系统inode数量默认情况下可能是不够用的,但有趣的是它可以随意调节,这里调节为480000保守了点,但也基本够用了。
3、基于memcached的缓存
nginx对memcached有所支持,但是功能并不是特别之强,性能上还是非常之优秀。
location /mem/ {
if ( $uri ~ "^/mem/([0-9A-Za-z_]*)$" )
{
set $memcached_key "$1";
memcached_pass 192.168.1.2:11211;
}
expires 70;
}
这个配置会将http://jb51.net/mem/abc指明到memcached的abc这个key去取数据。
nginx目前没有写入memcached的任何机制,所以要往memcached里写入数据得用后台的动态语言完成,可以利用404定向到后端去写入数据。
4、基于第三方插件ncache
ncache是新浪兄弟开发的一个不错的项目,它利用nginx和memcached实现了一部分类似squid缓存的功能,我并没有使用这个插件的经验,可以参考:
http://code.google.com/p/ncache/
5、nginx新开发的proxy_cache功能
从nginx-0.7.44版开始,nginx支持了类似squid较为正规的cache功能,目前还处于开发阶段,支持相当有限,这个缓存是把链接用md5编码hash后保存,所以它可以支持任意链接,同时也支持404/301/302这样的非200状态。
配置:
首先配置一个cache空间:
复制代码 代码如下:
proxy_cache_path /path/to/cache levels=1:2 keys_zone=NAME:10m inactive=5m max_size=2m clean_time=1m;
注意这个配置是在server标签外,levels指定该缓存空间有两层hash目录,第一层目录是1个字母,第二层为2个字母,保存的文件名就会类
似/path/to/cache/c/29/;keys_zone为这个空间起个名
字,10m指空间大小为10MB;inactive的5m指缓存默认时长5分钟;max_size的2m是指单个文件超过2m的就不缓
存;clean_time指定一分钟清理一次缓存。
location / {
proxy_passhttp://www.jb51.net/;
proxy_cache NAME;#使用NAME这个keys_zone
proxy_cache_valid 200 302 1h;#200和302状态码保存1小时
proxy_cache_valid 301 1d;#301状态码保存一天
proxy_cache_valid any 1m;#其它的保存一分钟
}
ps:支持cache的0.7.44到0.7.51这几个版本的稳定性均有问题,访问有些链接会出现错误,所以这几个版本最好不要在生产环境中
使用。nginx-0.7下目前所知较为稳定的版本是0.7.39。稳定版0.6.36版也是近期更新,如果在配置里没有使用到0.7的一些新标签新功
能,也可以使用0.6.36版。
Nginx缓存的内存占用问题的一般解决方法
1、前些日子某服务被刷,每分钟达到上几百万请求;当时采用了nginx cache来解决的;但是因为某服务不能缓存太久,当时设置了5s,那么带来的问题就是产生大量小文件,而且很快就删除了。
2、通过
free -m
会发现used是27G;但是通过top查看进程占的内存并没有那么多
那内存去哪了?
3、通过查阅资料会发现(cat /proc/meminfo)
Slab: 22464312 kB
SReclaimable: 16474128 kB (这些是内核保持的但是可以释放的inode和dentry的缓存)
SUnreclaim: 5990184 kB
4、这些内存为什么会不自动清理呢?
某机房机器系统版本:Linux 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux(正常,没出现内存快到100%的情况)
某机房机器系统版本:Linux 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux (不释放)
5、通过设置如下参数来设置内存阀值
sysctl -w vm.extra_free_kbytes=6436787
sysctl -w vm.vfs_cache_pressure=10000
6. 如何在Nginx中缓存静态文件,为访问站点提速
采用缓存技术可以提高网站公开的响应速度,但在一定程度上也降低了服务器的负载。 相比静态网页与动态网页,它不要求服务器端计算,所以在页面打开的响应速度为比动态页面更快! 虽然我不太懂,但是如果你掩盖了服务器上的静态页面。
7. 如何利用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指令。
8. 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 作为用户访问的 服务器了
这里截一些图:
9. nginx缓存性能怎么样
Nginx缓存对于不少人来说都不是很明朗的一个知识。那么好我们就借介绍有关优点和缺点的机会把大家带进Nginx缓存的世界。希望大家在文中能找到自己相关的使用方法。
两种Nginx缓存都有着基本一样的优点和缺点:
缺点1:不支持带参数的动态链接,比如read.php?id=1,因为Nginx缓存只保存文件名,所以这个链接只在文件系统下保存为read.php,这样用户访问read.php?id=2时会返回不正确的结果。同时不支持http://www.sudone.com/这种形式的首页和二级目录http://www.sudone.com/download/,因为Nginx缓存非常老实,会将这样的请求照链接写入文件系统,而这个链接显然是一个目录,所以保存失败。这些情况都需要写rewrite才能正确保存。
缺点2:Nginx缓存内部没有缓存过期和清理的任何机制,这些缓存的文件会永久性地保存在机器上,如果要缓存的东西非常多,那就会撑暴整个硬盘空间。为此可以使用一个shell脚本定期清理,同时可以撰写php等动态程序来做实时更新。
缺点3:只能缓存200状态码,因此后端返回301/302/404等状态码都不会缓存,假如恰好有一个访问量很大的伪静态链接被删除,那就会不停穿透导致后端承载不小压力。
缺点4:Nginx不会自动选择内存或硬盘作为存储介质,一切由配置决定,当然在当前的操作系统里都会有操作系统级的文件缓存机制,所以存在硬盘上也不需要过分担心大并发读取造成的io性能问题。
Nginx传统缓存的缺点也是它和squid等缓存软件的不同之特色,所以也可看作其优点。在生产应用中它常常用作和squid的搭档,squid对于带?的链接往往无法阻挡,而Nginx能将其访问拦住,例如:http://sudone.com/?和http://sudone.com/在squid上会被当做两个链接,所以会造成两次穿透;而Nginx只会保存一次,无论链接变成http://sudone.com/?1还是http://sudone.com/?123,均不能透过Nginx缓存,从而有效地保护了后端主机。
Nginx缓存会非常老实地将链接形式保存到文件系统中,这样对于一个链接,可以很方便地查阅它在缓存机器上的缓存状态和内容,也可以很方便地和别的文件管理器如rsync等配合使用,它完完全全就是一个文件系统结构。
这两种传统缓存都可以在linux下将文件保存到/dev/shm里,一般我也是这么做的,这样可以利用系统内存来做缓存,利用内存的话,清理过期内容速度就会快得多。使用/dev/shm/时除了要把tmp目录也指向到/dev/shm这个分区外,如果有大量小文件和目录,还要修改一下这个内存分区的inode数量和最大容量:
mount -o size=2500M -o nr_inodes=480000 -o noatime,nodiratime -o remount /dev/shm
上面的命令在一台有3G内存的机器上使用,因为/dev/shm默认最大内存是系统内存的一半就是1500M,这条命令将其调大成2500M,同时shm系统inode数量默认情况下可能是不够用的,但有趣的是它可以随意调节,这里调节为480000保守了点,但也基本够用了。
10. nginx 图片需要缓存吗
图片建议还是缓存 比较好。
注:因为涉及到图片就需要考虑带宽,如果带宽低,大图片渲染页面的话,不能很快的下载图片渲染慢,用户查看页面的访问效率和用户体验就不是很好。