`
cppmule
  • 浏览: 449197 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

nginx 负载均衡-反向代理+cache浅谈

 
阅读更多


  ngin只有硬盘级别cache,没有内置内存级别的cache,如果想利用内存加速,只能将/dev/shm挂载到文件系统,再将这个目录作为cache的目录。

  nginx一般做cache有以下5种办法:

1:这个办法是把nginx的404错误定向到后端,然后用proxy_store把后端返回的页面保存。

2:也是利用proxy_store,这里利用if判断cache目录是否有文件,没有的话从后端取,取回来后发送给用户并且自身用proxy_store保存起来                                                                                                            #这2种办法其实原理都差不多,只是方法不同,都是使用proxy_sore把数据保存起来,这种办法在准确定义上不能算是cache,只能算是镜像-mirror功能,因为其没有内建机制定时删除cache,等于是永远的静态保存,所以这方案适合基本不会变化的数据,更详细的说明请看下面详细介绍这2种cache的做法和介绍

3:基于memcached的缓存

4:新版本nginx支持真正的proxy_cache模块。                                                                 #proxy_cache从nginx-0.7.44版开始,nginx支持了类似squid较为正规的cache功能,这个缓存是把链接用md5编码hash后保存。

5:第三方插件。                                                                                                                          #新浪兄弟开发的一个插件,支持nginx  cache,但功能还有很多地方有待完善

 

几种不同cache的做法

传统缓存之一(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 /home/html/;#虚拟目录文件系统地址要和locaion /一致,proxy_store会将文件保存到这目录下
proxy_pass http://www.sudone.com/;#后端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_pass http://www.sudone.com/;
}
}

可以看到这个配置比404节约了不少代码,它是用!-f来判断请求的文件在文件系统上存不存在,不存在就proxy_pass到后端,返回同样是用proxy_store保存。

两种传统缓存都有着基本一样的优点和缺点:
缺点1:不支持带参数的动态链接,比如read.php?id=1,因为nginx只保存文件 名,所以这个链接只在文件系统下保存为read.php,这样用户访问read.php?id=2时会返回不正确的结果。同时不支持 http://www.marry5.com/这种形式的首页和二级目录http://www.marry5.com/download/,因为 nginx非常老实,会将这样的请求照链接写入文件系统,而这个链接显然是一个目录,所以保存失败。这些情况都需要写rewrite才能正确保存。
缺点2:nginx内部没有缓存过期和清理的任何机制,这些缓存的文件会永久性地保存在机器上,如果要缓存的东西非常多,那就会撑暴整个硬盘空间。为此可以使用一个shell脚本定期清理,同时可以撰写php等动态程序来做实时更新。
缺点3:只能缓存200状态码,因此后端返回301/302/404等状态码都不会缓存,假如恰好有一个访问量很大的伪静态链接被删除,那就会不停穿透导致后端承载不小压力。
缺点4:nginx不会自动选择内存或硬盘作为存储介质,一切由配置决定,当然在当前的操作系统里都会有操作系统级的文件缓存机制,所以存在硬盘上也不需要过分担心大并发读取造成的io性能问题。

nginx传统缓存的缺点也是它和squid等缓存软件的不同之特色,所以也可看作其优点。在生产应用中它常常用作和squid的搭档,squid 对于带?的链接往往无法阻挡,而nginx能将其访问拦住,例如:http://marry5.com/?和http://marry5.com/在 squid上会被当做两个链接,所以会造成两次穿透;而nginx只会保存一次,无论链接变成http://marry5.com/?1还是http: //marry5.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保守了点,但也基本够用了。但是这种方式的cache,当网站结构很复杂时,生成N多的cache小文件,if的判断是否会造成比较大的资源损耗和效率较低?这个问题值得思考,但没做过测试不能有实际数据去说明,只是从理论上来说,if必然会导致磁盘的io搜索,会有性能损耗和时间损耗。

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://marry5.com/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 /pathforcache levels=1:2 keys_zone=NAME:10m inactive=5m max_size=2m clean_time=1m; #定义cache目录,这一句话务必记得,放在http{}中而不是放到server{}里面

 

接着再配置一个proxy缓存目录

proxy_temp_path /pathfortmp;  

注意这个配置是在server标签外,levels指定该缓存空间有两层hash目录,第一层目录是1个字母,第二层为2个字母,保存的文件名就会 类似/path/to/cache/c/29/b7f54b2df7773722d382f4809d65029c;keys_zone为这个空间起个名 字,10m指空间大小为10MB;inactive的5m指缓存默认时长5分钟;max_size的2m是指单个文件超过2m的就不缓 存;clean_time指定一分钟清理一次缓存。

location / {
proxy_pass http://www.marry5.com/;

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版。这个cache模块还在开发阶段,在功能上还有许多等待改进的地方,例如针对不同文件类型设置不同的过期时间等.

分享到:
评论

相关推荐

    架构师培训教程 大数据高并发服务器实战 第2.6篇-Nginx部分-反向代理和负载均衡-反向代理配置 共13页.pptx

    共30页第2.5篇-Nginx部分-虚拟主机配置 共12页第2.6篇-Nginx部分-反向代理和负载均衡-反向代理配置 共13页第2.6篇-Nginx部分-反向代理和负载均衡-负载均衡配置 共9页第2.7篇-Nginx部分-Rewrite功能 共29页第2.8篇-...

    linux nginx负载均衡-图片缓存 + tomcat集群-session共享

    nginx-0.8.51下载 tomcat-6.0.20下载 pcre-8.12下载 2 环境描述 window7下运行的centos5.4的Vmware7虚拟机 nginx-0.8.51 tomcat-6.0.20 pcre-8.12 jdk-6u7-linux-i586 3 安装步骤 3.1 安装nginx所需的pcre ...

    nginx 负载均衡与反向代理资源

    在Win7 64位系统上安装Nginx,可以利用其强大的负载均衡和反向代理功能,优化网站性能并提升可用性。** ### 一、Nginx的安装 1. **下载Nginx安装包**:首先,你需要从Nginx官方网站获取适用于Windows 64位系统的...

    nginx负载均衡 反向代理

    nginx 负载均衡 反向代理 nginx 负载均衡 反向代理 nginx 负载均衡 反向代理

    手把手教你负载均衡-tomcat1.7+nginx+memcached

    Nginx以其高效的并发处理能力和低内存占用而闻名,常作为反向代理和负载均衡器。配置Nginx时,你需要在`nginx.conf`文件中定义一个或多个upstream块,列出后端服务器(即Tomcat实例),并指定负载均衡策略。例如,你...

    nginx + nginx-http-flv-module-1.2.9

    它不仅可以用作静态内容的 Web 服务器,还可以作为反向代理、负载均衡器和邮件代理服务器。 2. **HTTP FLV 模块** nginx-http-flv-module 是由 nginx 开发社区创建的一个第三方模块,用于在 Nginx 上实现 HTTP ...

    nginx带nginx-http-flv模块windows编译版rtmp

    4. **内容分发**:Nginx的反向代理功能可以用于负载均衡和内容分发,提高视频服务的可扩展性和可用性。 总结,这个压缩包中的"nginx-with-http-flv-moudle"是一个包含Nginx、Nginx-RTMP和Nginx-HTTP-FLV模块的预...

    nginx+tomcat7负载均衡+redis缓存session

    在构建高性能、高可用性的Web应用系统时,"nginx+tomcat7负载均衡+redis缓存session"是一种常见的架构模式。这种模式结合了Nginx的反向代理和负载均衡能力,Tomcat作为Java应用服务器处理业务逻辑,而Redis则用于...

    nginx-http-flv-module-1.2.10(包含nginx-rtmp-module)

    Nginx是一个高性能的HTTP和反向代理服务器,广泛用于Web服务器领域,尤其在处理静态内容和高并发场景下表现出色。Nginx-http-flv-module是针对Nginx的一个扩展模块,它允许Nginx支持HTTP实时流传输协议...

    详解 Nginx 负载均衡和反向代理配置和优化

    Nginx 负载均衡和反向代理配置和优化 DNS 轮询方式: 介绍: DNS 轮询是指一个域名可以绑定到多个的 ip 服务器上, 用户在访问的时候 dns轮询访问这几个 ip 的服务器, 达到负载均衡的目的. 可以使用 linux 命令 dig ...

    nginx负载均衡和反向代理部署.docx

    **Nginx负载均衡** ...总的来说,Nginx的负载均衡和反向代理功能为Web服务提供了强大的可扩展性和高可用性,是现代Web架构中的关键组件。正确配置和利用这些特性,能够显著提升网站的性能和稳定性。

    Nginx的负载均衡和反向代理

    Nginx的负载均衡和反向代理Nginx的负载均衡和反向代理Nginx的负载均衡和反向代理Nginx的负载均衡和反向代理Nginx的负载均衡和反向代理

    Nginx负载均衡与反向代理.docx

    在本文中,我们将深入探讨Nginx的负载均衡和反向代理功能。 1. **Nginx反向代理** 反向代理是指Nginx作为前端服务器,接收来自客户端的HTTP请求,然后将这些请求转发给后端的Web服务器处理。反向代理的主要作用是...

    运维-Nginx代理服务器-方向代理-负载均衡-数据缓存

    Nginx相较于 Apache、lighttpd 具有占有内存少,稳定性高等优势,并且Nginx有反向代理、负载均衡和缓存数据的功能。 反向代理:其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求...

    nginx视频教程-nginx单机1W并发优化-反向代理实现nginx+apache动静分离

    15-反向代理实现nginx+apache动静分离.wmv 111.9MB 14-expires缓存提升网站负载.wmv 55.4MB 13-nginx gzip压缩提升网站速度.wmv 79.2MB 12-商城url重写实战.wmv 155.5MB 11-安装ecshop.wmv 53.0MB

    nginx-1.19.0(反向代理及负载均衡配置).rar

    在本教程中,我们将探讨如何在Windows环境下配置Nginx进行反向代理和负载均衡,以及Nginx的基本操作。** ### 一、安装Nginx 1. 解压"nginx-1.19.0"压缩包到您希望的安装目录。 2. 进入"conf"目录,编辑`nginx.conf`...

    nginx-sticky-module-1.25.zip

    nginx sticky是nginx的module,可以实现基于cookie的负载均衡。 下载后,在编译安装nginx时,用--add-module选项,指到sticky所在目录。类似命令如下: ./configure --prefix=/usr/local/nginx-1.6.0 --add-module=...

    负载均衡nginx+tomcat+terracatta+nfs+mysql

    在构建高性能、高可用性的Web服务环境中,"负载均衡nginx+tomcat+terracotta+nfs+mysql"是一个常见的架构组合。这个组合充分利用了各组件的优势,以实现数据的高效处理、分布式存储以及会话共享,确保系统的稳定性和...

    架构师培训教程 大数据高并发服务器实战 第2.6篇-Nginx部分-反向代理和负载均衡-负载均衡配置 共9页.pptx

    Nginx作为一款高性能的HTTP和反向代理服务器,具备强大的负载均衡能力。本部分将详细讲解Nginx中的负载均衡配置方法。 1. **什么是负载均衡** 负载均衡是通过特定算法将网络流量分布到多个服务器节点,以降低单个...

Global site tag (gtag.js) - Google Analytics