自己免费网站建设,全国精品课程建设网站,大连外贸网站,沛县做网站xlec基于nginx实现缓存功能及uptream模块详细使用方法一般情况下#xff0c;前端使用nginx做代理或7层负载并向后实现varish/squid做cache server的效果要好的多nginx与squid做缓存比较nginx比squid有着巨大的优势表现在#xff1a;nginx是异步假如后端的web服务器#xff0c;当… 基于nginx实现缓存功能及uptream模块详细使用方法一般情况下前端使用nginx做代理或7层负载并向后实现varish/squid做cache server的效果要好的多 nginx与squid做缓存比较nginx比squid有着巨大的优势表现在nginx是异步假如后端的web服务器当用户的请求到达nginx的时候nginx收到请求而不是立即将请求转发至web server;如果用户请求比较大nginx将其在本地缓存内存中不够用则在磁盘中缓存当缓存完毕之后再将请求一次性提交至后端web服务器转发完成之后再向客户端响应也就意味着用户的连接只需要跟nginx建立连接即可nginx与后端web一般都在内网中对接只要带宽满足很可能瞬间完成因此来说对于后端服务器的压力及小只需要建立几秒的连接就可以处理完成非常大的请求squid是同步当用户请求到达squid中在刚接收到用户请求的第一个报文立即与后端建立连接因此在处理过程中依旧保持着连接所以说nginx最大的优势就是在用户的连接处理的场景中这样就使前端有大量的用户请求连接但是在后端看上去只有少数部分比如前端有1W并发进来后端大概只能看到其10分之1 需要查找数据库的只有少数部分,所以后端的web压力会小但是前端分发器的压力会很大nginx缓存机制nginx要想实现反向代理那么就需要使用proxy_cache模块,以及配合其指令和参数可以将用户的请求从上游服务器获取之后先存在本地磁盘缓存通常是键值对方式存储键 请求的rul值 后端服务器响应的内容 所以当后续用户的请求到达之后如果本地缓存服务器中存在的话则直接封装报文返回至用户但是如果服务器运行了很久已保存N久的缓存数据那在某一时刻后端服务器出现故障nginx缓存已经无法找到其后端的服务器那么缓存上游服务器对象是否还应该返回至用户这些都是可配置的我们定义缓存的时候像这些缓存是否可缓存缓存的位置都要自己去配置的并且一旦服务器故障缓存的数据还能否直接响应客户端等等 事实上用户所在浏览器上保存的缓存称为私有缓存而服务器上缓存的数据叫做公共缓存 有些数据只能在私有缓存中进行缓存比如用户登录网站的用户名和密码的信息这类肯定不能在服务器上缓存而用户的cookie信息一般也不能缓存所以缓存服务器公共缓存服务器只要发现用户请求中有cookie则不缓存但是一般电商站点为了追中用户的行为规则则将每个请求数都加cookie但对于图片这种静态内容附加cookie是没有意义的所以对于缓存服务器来说必须处理这种机制对于没必要加cookie的而用户已加cookie将其删掉并让缓存命中等因此需要一系列缓存机制这都是需要自己去定义的比如缓存多久否定缓存多久 重定向缓存多久 ... 配置Nginx缓存参考http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_path语法proxy_cache_path path [levelslevels] keys_zonename:size [inactivetime][max_sizesize] [loader_filesnumber] [loader_sleeptime][loader_thresholdtime];需要注意的是标红的字体配置格式proxy_cache_path/data/nginx/cache levels1:2 keys_zoneone:10m;#定义/data/nginx/cache为缓存目录levels1:2有2级子目录最多为3级子目录用冒号隔开定义3个数字每个数字表示其目录名称keys_zoneone:10m用多大的空间保存键值以下为缓存对象的名字方便引用并且避免名称冲突file names in acache will look like this:/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c 使用示例定义缓存必须在全局配置上下文中去定义http { proxy_cache_path /data/nginx/cache levels1:2 keys_zoneSTATIC:10mproxy_cache_path /data/nginx/cache levels1:2 keys_zoneSTATIC:10minactive24h max_size1g;}proxy_cache_path必须定义在全局配置中定义完之后可以在各location中来引用在location中来使用proxy_cache来指定是否使用缓存也可以定义多个缓存在location中引用不同的缓存定义server { location / { proxy_pass http://www.test.com; proxy_set_header Host $host; proxy_cache STATIC; proxy_cache_valid 200 1d;#请求返回值为200的则缓存1day proxy_cache_valid 301302 10m;#请求返回值为301 302的则缓存10m proxy_cache_vaild any1m;#其他任何返回值缓存1m #是否可以使用过期对象 proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504; } }}实现缓存机制步骤1定义缓存必须在http全局中定义2而后在location中实现反向代理才有必要实现缓存创建缓存目录[rootnode1 ~]#mkdir -p /data/cache/nginx/编辑nginx配置文件[rootnode1 nginx]# vim nginx.conf在http { }上下文中定义缓存proxy_cache_path/data/cache/nginx/ levels1:2 keys_zoneone:10mmax_size1g;定义/data/cache/nginx/为缓存目录levels1:2 有2级子目录最多为3级子目录用冒号隔开定义3个数字每个数字表示其目录名称keys_zoneone:10m 用多大的空间保存键值,最大为10Mmax_size1g 表示缓存空间最大有1G在location中定义缓存规则并调用proy_cache_pathlocation / {proxy_pass http://10.0.10.83;#将请求都转发至10.0.10.83上去proxy_cache one;#明确说明使用名称one这个cache #以下为缓存规则proxy_cache_valid 200 1h;proxy_cache_valid 302 10m;proxy_cache_valid any 1m;}保存退出检查语法并重新加载[rootnode1 nginx]#nginx -tnginx: theconfiguration file /etc/nginx/nginx.conf syntax is oknginx:configuration file /etc/nginx/nginx.conf test is successful[rootnode1 nginx]#nginx -s reload查看缓存目录[rootnode1 nginx]#ll -th /data/cache/nginx/total 0看到目录中是空的那么我们来使用curl命令访问一下看其是否能生成缓存文件[rootnode1 nginx]#curl 10.0.10.61h110.0.10.83/h1再次查看路径[rootnode1 nginx]#ll -th /data/cache/nginx/f/63/total 4.0K-rw-------. 1 nginxnginx 350 May9 16:06681ad4c77694b65d61c9985553a2763f这时候目录中已经存在缓存信息说明缓存已经生效但是在某些场合我们不能保证其已经被命中那么再将upstream模块开启因为upstream模块会给我们引入一些新的服务器变量编辑如下upstream webservers{#定义名称server 10.0.10.83;#server 10.0.10.61;#将之前定义的注释}再定义location location / { proxy_pass http://webservers;#引用upstream名称 proxy_cacheone;#引用定义的缓存模块名称 proxy_cache_valid 200 1h; proxy_cache_valid 302 10m; proxy_cache_valid any 1m; }这样表示我们已经启用了upstream模块了而upstream模块会给我们引入一些新的服务器变量进来比如cache_status,如果我们访问某个缓存页面的时候到底是否命中会通过这个变量保存下来如果将其传递给客户端那么我们就知道是否命中了再将其加入首部headerlocation / {#root/web/htdocs/;#indexindex.php index.html index.htm;proxy_pass http://webservers;proxy_cache one;proxy_cache_valid 200 1h;proxy_cache_valid 302 10m;proxy_cache_valid any 1m;add_header X-Via $server_addr;#定义这个header名为X-Via 通过变量$server_addr明确说明从哪个服务器来响应的 server_addradd_header X-Cache-Status$upstream_cache_status;#明确说明是否命中$upstream_cache_status为upstream模块}保存退出并检测语法[rootnode1 nginx]#/usr/local/nginx/sbin/nginx –t[rootnode1 nginx]#/usr/local/nginx/sbin/nginx –s reload重新reload之后刷新测试,这里使用的是Google Chrome浏览器如上所示提示已命中X-Via是我们自定义的header标签也可以使用curl -I来查[rootnode1 nginx]#curl -I http://10.0.10.61HTTP/1.1 200 OKServer: nginx/1.4.2Date: Fri, 09 May2014 08:22:41 GMTContent-Type:text/htmlContent-Length: 20Connection:keep-aliveLast-Modified: Mon,12 Aug 2013 10:48:13 GMTETag: fd91-14-4e3bddc687540X-Via:10.0.10.61X-Cache-Status:HITAccept-Ranges:bytes启动压缩功能nginx将响应报文发送至客户端之前可以启用压缩功能这能够有效地节约带宽并提高响应至客户端的速度。通常编译nginx默认会附带gzip压缩的功能因此可以直接启用之。http {gzip on; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain text/cssapplication/x-javascript text/xml application/xml application/xmlrsstext/javascript application/javascript application/json; gzip_disable msie6; #如果对方是ie6的话则不再使用压缩功能,,因为ie6浏览器不支持压缩}gzip_proxied指令可以定义对客户端请求哪类对象启用压缩功能如“expired”表示对由于使用了expire首部定义而无法缓存的对象启用压缩功能其它可接受的值还有“no-cache”、“no-store”、“private”、“no_last_modified”、“no_etag”和“auth”等而“off”则表示关闭压缩功能重新加载配置文件并访问 upstream模块的使用upstream模块常用的指令有·ip_hash 基于客户端IP地址完成请求的分发它可以保证来自于同一个客户端的请求始终被转发至同一个上游服务器与lvs的机制是一样的·keepalive每个worker进程为发送到upstream服务器的连接所缓存的个数转发至服务器之后能否使用长连接也尽可能避免三次握手与四次断开的次数如果参数过大的话会无形之中对后端服务器产生很大的压力因此建议开启但不要太大·least_conn最少连接调度算法类似于lvs的wlc算法的效果因此一般来尽量避免和ip_hash一起用server定义一个upstream服务器的地址还可包括一系列可选参数如·weight权重·max_fails最大失败连接次数失败连接的超时时长由fail_timeout指定·fail_timeout等待请求的目标服务器发送响应的时长·backup用于fallback的目的所有服务均故障时才启动此服务器·down手动标记其不再处理任何请求示例 upstream backend { server www.magedu.com weight5; serverwww2.magedu.com:8080 max_fails3 fail_timeout30s; }upstream模块也能为非http类的应用实现负载均衡如下面的示例定义了nginx为memcached服务实现负载均衡 upstreammemcachesrvs { #明确定义了一组实现负载均衡的服务器 server172.16.100.6:11211; #而这组服务器向后分发的端口都是11211 是memcache的服务器端口 server172.16.100.7:11211; } server { location / { set $memcached_key$uri?$args; #向后端memcache查询的时候查询键是$uri?和$args组合起来的值 memcached_passmemcachesrvs; #通过memcachepass传递至memcachesrvs组服务器 error_page 404 fallback; #如果没有命中则则发送至其上游的其他服务器 }location fallback { proxy_passhttp://127.0.0.1:8080; } }这样一来找缓存的时候先在memcached里查找如果不存在则再去找真实服务器这样将nginx将memcached结合在了一起将数据直接缓存在memcached内存当中而不是nginx自己的缓存当中 实现后端服务器健康状态检查使其一旦出现故障不再将其加进来定义upstream: upstream webservers {server 10.0.10.83 weight1 max_fails3fail_timeout2s; #最大允许3次失败如果超过2秒则算超时server 10.0.10.61 max_fails3fail_timeout1s backup;#backup表示其主机始终不会生效除非组内所有主机全部故障 }一般如果条件允许的情况下本机也启动一个web服务器但是这个服务器不是专门提供工作的一旦后端服务器出现故障那么则转至backup服务器使其服务器专门为用户提供错误页面proxy_cache通常也只能缓存本地服务器向后端服务器取得数据而进行缓存的而后端通常都是静态服务器如果基于fastcgi的方式获取数据的而有希望对动态内容作缓存那么就要涉及到fastcgi的自身缓存功能了实现动态内容缓存通过FastCGI协议取得的内容页可以缓存但是时长需要自定义好使用时将fastcgi_cache模块启用并定义参数即可之前我们搭建了一套lnmp 这时我们要对fastcgi进行缓存定义缓存目录[rootnode1 nginx]#mkdir -p /data/cache/fastcgi编辑配置文件,在http{}中加入以下参数fastcgi_cache_path/data/cache/fastcgi levels1:2:1 keys_zonefcgi:20m max_size1g;定义/data/cache/fastcgi为fastcgi缓存目录缓存目录分别为3级子目录Fcgi缓存大小为20M最大缓存为1G的空间而后location中启用fastcgi location ~ \.php$ { root /web/htdocs/; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include fastcgi_params; }以上参数为nginx默认配置将以上参数启用之后我们还需要对其加入一些参数 location ~ \.php$ { root /web/htdocs/; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include fastcgi_params; fastcgi_cache fcgi; fastcgi_cache_valid 200 10m ; fastcgi_cache_valid 301 2m ; fastcgi_cache_valid any 1m ; }保存退出并检查语法[rootnode1 nginx]#nginx -tnginx: theconfiguration file /etc/nginx/nginx.conf syntax is oknginx:configuration file /etc/nginx/nginx.conf test is successful重新加载配置文件[rootnode1 nginx]#nginx -s reload这时我们再去请求动态内容[rootmode ~]# curlhttp://10.0.10.61/index.php再来查看是否生产缓存[rootnode1 ~]# ll/data/cache/fastcgi/e/27/4/total 48-rw-------. 1 nginxnginx 45873 May 10 12:55 d41d8cd98f00b204e9800998ecf8427e 使用ab压力测试其效果是否明显首先将fastcgi缓存功能关闭location ~ \.php$ {root/web/htdocs;fastcgi_pass 127.0.0.1:9000;fastcgi_indexindex.php;fastcgi_paramSCRIPT_FILENAME/scripts$fastcgi_script_name;includefastcgi_params;#将以下参数注释#fastcgi_cache fcgi;#fastcgi_cache_valid 200 10m ;#fastcgi_cache_valid 301 2m ;#fastcgi_cache_valid any 1m ;}重新加载配置文件[rootnode1 nginx]#nginx -s reload使用ab命令对其进行压力测试[rootmode ~]# ab-c 100 -n 2000 http://10.0.10.61/index.php我们只关心Requests值 所以略过一部分信息#···········略··············Document Path:/index.phpDocumentLength:45234 bytes ConcurrencyLevel:100Time taken fortests:4.343977 secondsCompleterequests:2000Failedrequests:228(Connect: 0, Length: 228, Exceptions: 0)Write errors:0Totaltransferred:90761752 bytesHTML transferred:90467752 bytesRequests per second:460.41 [#/sec] (mean)Time perrequest:217.199 [ms] (mean)Time perrequest:2.172 [ms] (mean, acrossall concurrent requests)Transfer rate:20403.88 [Kbytes/sec] received#···········略··············将缓存模块开启再次对其进行压力测试得出数据ConcurrencyLevel:100Time taken fortests:1.576516 secondsCompleterequests:2000Failedrequests:0Write errors:0Totaltransferred:90896000 bytesHTMLtransferred:90602000 bytesRequests per second:1268.62 [#/sec] (mean)Time perrequest:78.826 [ms] (mean)Time perrequest:0.788 [ms] (mean, acrossall concurrent requests)Transfer rate:56304.53 [Kbytes/sec] received 至此试验结束感谢各位 转载于:https://blog.51cto.com/yijiu/1409177