网站加速——nginx异地前端缓存
前段日子琢磨网站加速的事情用nginx做了前端缓存,现在测试成功将我的配置记录下来。
架构
这样在北京访问首页的朋友打开的速度就快了,当然详细页面会继续使用blog香港节点访问,慢一点还能忍受。
配置
首先如果需要反向代理缓存需要在nginx中http段开启缓存配置
proxy_temp_path /opt/proxy_temp_dir; proxy_cache_path /opt/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=5d max_size=30g; upstream backend { ip_hash; server xxx.xxx.xxx.xxx:80; }
声明缓存文件存储路径和存储大小,最好配置upstream进行代理后端远程的地址
然后在server中的location /中加入如下代码:
location / { proxy_pass http://backend; 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_cache cache_one; proxy_cache_valid 200 301 302 20m; proxy_cache_valid 304 1d; proxy_cache_valid any 5m; proxy_cache_key $host$uri$is_args$args; proxy_buffer_size 16k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k; proxy_connect_timeout 500; proxy_read_timeout 500; proxy_send_timeout 500; proxy_pass_header Expires; proxy_pass_header Cache-Control; proxy_pass_header Last-Modified; proxy_pass_header ETag; proxy_pass_header Content-Length; }
不曾想之前的200的cache的时间设置过长了,结果迟迟没有更新,进行调整了但是不知道是不是之前设置的太长了还没有更新,等不及了,研究了一下cache的更新方法。当然看到nginx有官方管理方法就是启用purge不过在我看来还是太麻烦了。我打开cache的文件目录发现了如下目录格式
├── c │ ├── 10 │ │ └── da125d70b51415b65142cf2c004ee10c │ ├── 1e │ ├── 25 │ │ └── 8235b46dcb14ea6699fdb1afb7f9b25c │ ├── 2d │ │ └── d7fbe687000d3b976d56a692bc9a72dc
当然下面的hash就是实际的缓存文件,打开查看如下内容
J±[TÿÿÿÿÊ^YUTÀÉ^QL^@^@>^@@^A <95> KEY: www.1117life.com/?attachment_id=1593 HTTP/1.1 200 OK^M Server: nginx/1.6.0^M Date: Sat, 01 Nov 2014 17:37:49 GMT^M Content-Type: text/html; charset=UTF-8^M Connection: close^M X-Powered-By: PHP/5.3.24^M X-Pingback: http://blog.1117life.com/xmlrpc.php^M Link: <http://blog.1117life.com/?p=1593>; rel=shortlink^M ^M <!DOCTYPE html> ^M <html class="no-js" lang="zh-CN" prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#">^M ^M <head>^M <meta charset="UTF-8">^M <meta name="viewport" content="width=device-width, initial-scale=1.0">^M ^M <title>æ<88>¿é<97>´å¤<9c>æ<99>¯ | ç<96>¯ç<8b><82>ç<9a><84>å°<8f>ç<8b>®å<90>漫æ¥è¡<97>头</title>^M ^M <link rel="pingback" href="http://blog.1117life.com/xmlrpc.php">^M ^M <!-- nextgen scrollGallery 1.8.2 --> <!-- SEO Ultimate (http://www.seodesignsolutions.com/wordpress-seo/) --> <meta property="og:title" content="æ<88>¿é<97>´å¤<9c>æ<99>¯" /> <meta property="og:url" content="http://blog.1117life.com/archives/1589/img_4560" /> <meta property="og:image" content="http://blog.1117life.com/wp-content/uploads/2013/02/IMG_4560-e1359810854882.jpg" /> <meta property="og:site_name" content="ç<96>¯ç<8b><82>ç<9a><84>å°<8f>ç<8b>®å<90>漫æ¥è¡<97>头" />
这些反正我也不明白,不过KEY后面的域名是url不难想象nginx是通过key来标识是否缓存该内容的。于是就有邪恶的方法
grep -a -r www.1117life.com [cache_path] 8/3c/aba0ec80553ef842aaf610acffb683c8:KEY: www.1117life.com/?attachment_id=1698 8/fb/786781bd28c2634a476f93c7fb62afb8:KEY: www.1117life.com/?attachment_id=1713 8/5f/8f27637036ffb53e9f21ecfbf0bdb5f8:KEY: www.1117life.com/archives/tag/log 9/28/e88cf4fa9d448df8d72488d94c287289:KEY: www.1117life.com/wp-content/uploads/2011/10/IMG_2048.jpg 9/77/6d5a2107b748d9d5ed300ffa06384779:KEY: www.1117life.com/archives/tag/龙头路 9/42/21d73b1c61ab2131fb001bb0a8c95429:KEY: www.1117life.com/wp-admin 9/29/49d2bd421701664a5068e1d30328e299:KEY: www.1117life.com/page/1 9/f1/65723be2a4e799e0701803e48ebe4f19:KEY: www.1117life.com/wp-content/uploads/2011/11/wine-of-bincos-lunba.mp3?fromtag=55&uin=412860652 9/84/f1c0760679f851d514d1d4f4586cb849:KEY: www.1117life.com/wp-content/uploads/2012/12/IMG_4016-333x500.jpg 9/66/136788dc25cf43a621fd307b73d70669:KEY: www.1117life.com/wp-content/uploads/2011/11/wine-of-bincos-lunba.mp3?&fromtag=53&uin=770832158 9/1e/ff0cdfd7badb20a25756953cc5f4c1e9:KEY: www.1117life.com/archives/tag/用户限制 9/0c/79b09c92e74eebc6f8313d53485520c9:KEY: www.1117life.com/wp-content/uploads/2011/11/IMG_2524.jpg 9/70/66d71a5b652e5f882303fd294f310709:KEY: www.1117life.com/wp-content/uploads/2011/11/IMG_2909.jpg
由于我是想将首页更新当然我要查找首页cache在哪里,找到这个文件www.1117life.com/后删除就好了,你懂得,呵呵!
记录一个问题:后来小blog的缓存出现问题,通过nginx的日志查看upstream到后端服务器的时间有一个神奇的9s但是这个时间不知道是哪里来的如何调整?请知道的DX也能告诉我一声。这样blog全部元素加载完成的时间必须在9s以内,在公网环境下好有难度,不知道其他做CDN的公司是怎么实现的。