nginx图片缓存服务器
① 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保守了点,但也基本够用了。
② 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天。
③ nginx会不会影响web服务器自身缓存性能
Nginx从0.7.48版本开始,支持了类似Squid的缓存功能。这个缓存是把URL及相关组合当作Key,用md5编码哈希后保存在硬盘上,所以它可以支持任意URL链接,同时也支持404/301/302这样的非200状态码。虽然目前官方的Nginx Web缓存服务只能为指定URL或状态码设置过期时间,不支持类似Squid的PURGE指令,手动清除指定缓存页面,但是,通过一个第三方的Nginx模块,可以清除指定URL的缓存。
Nginx的Web缓存服务主要由proxy_cache相关指令集和fastcgi_cache相关指令集构成,前者用于反向代理时,对后端内容源服务器进行缓存,后者主要用于对FastCGI的动态程序进行缓存。两者的功能基本上一样。
Nginx 0.8.32以后版本,proxy_cache和fastcgi_cache已经比较完善,加上第三方的ngx_cache_purge模块(用于清除指定URL的缓存),已经可以完全取代Squid。我们已经在生产环境使用了 Nginx 的 proxy_cache 缓存功能超过两个月,十分稳定,速度不逊于 Squid。
在功能上,Nginx已经具备Squid所拥有的Web缓存加速功能、清除指定URL缓存的功能。而在性能上,Nginx对多核CPU的利用,胜过Squid不少。另外,在反向代理、负载均衡、健康检查、后端服务器故障转移、Rewrite重写、易用性上,Nginx也比Squid强大得多。这使得一台Nginx可以同时作为“负载均衡服务器”与“Web缓存服务器”来使用。
④ nginx expires 缓存放哪里
在开发调试web的时候,经常会碰到因浏览器缓存(cache)而经常要去清空缓存或者强制刷新来测试的烦恼,提供下apache不缓存配置和nginx不缓存配置的设置。
apache:
首先确定配置文件httpd.conf中确已经加载mod_headers模块。
LoadMole headers_mole moles/mod_headers.so
我们可以根据文件类型来让浏览器每次都从服务器读取,这里测试用css、js、swf、php、html、htm这几种文件。
<FilesMatch “\.(css|js|swf|php|htm|html)$”>
Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
Header set Pragma "no-cache"
</FilesMatch>
nginx:
location ~ .*\.(css|js|swf|php|htm|html )$ {
add_header Cache-Control no-store;
}
对于站点中不经常修改的静态内容(如图片,JS,CSS),可以在服务器中设置expires过期时间,控制浏览器缓存,达到有效减小带宽流量,降低服务器压力的目的。
以Nginx服务器为例:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
#过期时间为30天,
#图片文件不怎么更新,过期可以设大一点,
#如果频繁更新,则可以设置得小一点。
expires 30d;
}
⑤ nginx 做图片代理服务器,为什么我输入原来的名字报404,重名命之后就可以访问
肯能是文件权限问题
修改名称 就把文件权限改为你ftp用户了
⑥ 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小时,代码如下
⑦ 为什么要使用nginx服务器
这里做了些基准测试表明nginx打败了其它的轻量级的web服务器和代理服务器,同样也赢了相对不是那么轻量级的产品。
有人说这些基准测试是不准确的,因为在这样那样的环境下,做的比较不一致。我倾向同意基准测试只是告诉了我们其中一部分情况,你能做的是消除偏见(有人见过所有人都同意一个基准测试是公平的吗?我是没见过。)
不管怎样,这篇文章不是做基准测试来让人们争论(如果你喜欢,可以在Google上找到那样的文章),相反,下面的引述来自人们在现实世界中使用Nginx,在真实的负载下,服务于真正的应用和网站。
引述
我们投资的一些公司把web平台切换到Nginx后,可以显着的解决扩展问题。Nginx明显有效的实现了今天互联网上最大网站数量的增长。
– Thomas Gieselmann, BV Capital.
我
对今天运行网站的所有人的建议是,想打破性能限制就研究下能否使用Nginx。CloudFlare去年在一个相对较小的基础设施上已经扩展到可以处理每
月超过150亿的浏览量,很大程度上是因为Nginx的扩展性。我的经验表明切换到Nginx可以最大限度的利用现代的操作系统和现有的硬件资源。
– Matthew Prince, CloudFlare的联合创始人和CEO
Apache和Nginx都有能力提供每秒钟庞大的请求服务,但是随着并发数量的增加,Apache的性能开始下降,然而Nginx的性能几乎不会下降。
这里最好的一点是:因为Nginx是基于事件的,它不用为每个请求产生新的进程或线程,所以它的内存使用很低。在我的基准测试中,它的内存使用坐落在2.5M,Apache使用得更多。
– WebFaction
针
对Nginx v0.5.22 and Apache
v2.2.8我用ab(Apache的基准测试工具)跑了一个简单的测试。在测试过程中,我用vmstat和top检测系统。结果表明在提供静态内容
时,Nginx做得比Apache好。两个服务器都在并发数100时表现最佳。Apache使用4个工作进程(线程模式),30%的CPU和17MB的内
存,每秒钟处理6,500次请求。Nginx使用一个工作进程,15%的CPU,1MB内存,每秒钟处理11,500次请求。
– Linux Journal
Apache好比是微软Word,它有100万个选项,但是你只需要其中6个。Nginx就处理那6项任务,但处理其中5项任务时速度比Apache快50倍。
– Chris Lea
我现在使用Nginx在单一服务器上处理每天超过数千万(也就是每秒钟几百次)的反向代理HTTP请求。在负载高峰期,它消耗大约15MB的内存和10%的CPU,在我的特定配置下(FreeBSD 6)。
在同样的负载下,Apache表现大跌(在大约使用1000个进程后,上帝知道使用了多少内存),Pound表现大跌(如此多的线程,所有的线程栈会消耗400MB以上的内存),还有Lighttpd每小时泄露20MB以上内存(使用更多CPU,但不显着)。
– Bob Ippolito in the TurboGears mailing list, 2006-08-24
我们现在使用Nginx 0.6.29的upstream hash模块为我们需要的Varnish代理提供静态杂凑。我们通常处理8-9千次请求/秒,大约1.2Gb/秒数据在几台Nginx服务器间传输,而且还有很大的成长空间。
– WordPress.com
直到今天,我们一直使用Pound来解决Justin.tv 的负载均衡。它一直使用20%的CPU,在高峰期会达到80%。在极高的负载下,它偶尔会崩溃。
我们只是切换到了Nginx,负载马上就降到了大约3%的CPU使用。我们的页面感觉更快了,尽管这可能是我的错觉。不仅它的配置文件格式容易理解和配置,而且还提供了完整的web服务器功能。我们再也没有遇到尖峰期了,而且我怀疑现有的性能会彻底打败Pound。
– Emmett Shear
我们使用Nginx作为主要的软件用于一个免费的托管平台,我已经在Nginx中开发了一个特定的模块用于banner潜入和统计计算,现在我们的中央服务器可以处理大约150-200Mbit/s高度分散的http流量(所有的文件都很小)。
我认为这是非常好的结果。因为在同样的服务器上面Apache不管怎么优化,甚至都不能处理60-80Mbit/s。
– Alexey Kovyrin
前
阵子,我们把我们的前端IMAP/POP代理从perdition切换到了nginx…,现在我们又使用nginx来做前端web代理服务器…。最终的结
果是,现在的每台前端代理服务器可以保持超过10,000并发(IMAP, POP, Web &
SMTP)连接(其中很多还是SSL),仅仅只使用了大约10%的CPU。
– FastMail.fm blog
最近,我们的静态内容服务器切换到了Nginx,无疑这是这么多年来我印象最深刻的一款web服务器。我们运行在一台配有8G内存的机器上,但是nginx进程只使用了可笑的1.4Mb。
– Philip Jacob
我们已经用nginx取代了Squid(反向代理)+Apache的方案,平均负载和CPU使用一样降低了一半。另外我们的基准测试表明新的配置每秒钟可以处理的请求数是旧配置的2-3倍。
– HowtoForge
我们用一些CMS系统( Wordpress, Drupal, Joomla, TYPO3等)做了基准测试,结果是Nginx提供网页的速度比Apache快了50%,同时nginx每秒钟处理的请求数(RPS)是Apache的177%。
⑧ 如何利用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指令。
⑨ nginx搭建图片服务器 web应用如何实现图片上传
通过severlet上传图片是可以的,甚至用手工方式上传也可以
因为调用读取这些图片的话,不用调用severlet,直接调用nginx即可
nginx本身就可以实现静态资源的web服务
⑩ nginx 图片需要缓存吗
图片建议还是缓存 比较好。
注:因为涉及到图片就需要考虑带宽,如果带宽低,大图片渲染页面的话,不能很快的下载图片渲染慢,用户查看页面的访问效率和用户体验就不是很好。