Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

nginx 配置之 proxy_pass 缓存

  nginx 在 proxy_pass 的缓存这方面下了很多功夫!proxy 模块的指令数量多得根本看不完。实现 proxy_pass 的缓存也是 nginx 的一大亮点,但也有人觉得这是 nginx 在不务正业。既然 nginx 已经实现了这一套,如果不想搞 Squid、Varnish 之类的东西,完全可以试试 nginx。
  proxy_pass 的作用是为当前请求到某个服务器上获取数据。既然要到其它服务器上取数据那就一定是有传输成本的。其实很多基本不会变的数据用不着每次都到目标服务器上取。如果当前服务器可以做一层缓存,那将为上游服务器节省很多资源。所以 proxy_pass 如果支持缓存的话,只要写几个配置就可以给上游服务器节省资源,何乐而不为呢?
  既然要做缓存,首先应该告诉 nginx,这些缓存资源应该存在哪儿。使用 proxy_cache_path 指令可以创建一个硬盘上的缓存区域,比如: proxy_cache_path /data/mycache keys_zone=mycache:100m;   这个指令的槽点太多了,首先它的参数设计就是一坨奇奇怪怪的,就算对着文档写也累。然后它的第一个参数是一个 path,也就是说数据是被存在硬盘中的。其实有时候这些缓存数据我更希望放在内存中,比如我可能希望这个缓存被接入到一个 redis 集群中存储。好像 nginx 自己没有类似的实现,只能通过自己定制的模块来实现。
  使用 proxy_cache_path 指令创建一个存储空间之后,就可以在 proxy_pass 时使用 proxy_cache 指定这个 keys_zone 即可开启缓存 proxy_pass http://blahblahblah; proxy_cache mycache;   其实相关的配置还有很多,比如作为 key 的 hash 如何计算,这可以处理类似 http Vary 头之类的东西。还有一些更神奇的配置是文档中可以找到的,我就不扯了。
  另一方面,不要忘记 proxy_pass 也被用于做正向代理!也就是说 nginx 的这套 proxy 缓存还可以实现类似脱机站点的功能。比如为一个正向代理开启 cache,即使外网挂掉也依然可以正常浏览先前存下来的页面。甚至如果我们配置允许 POST 等方法缓存的话,连接口调用都可以缓存下来。
  nginx 的这套 proxy 缓存确实有点不务正业,如果是高并发的生产环境也许应该使用 Varnish 之类的东西来做,但如果只是自己玩一或玩者一些内部工具,用 nginx 也未尝不可。
网名:
3.80.32.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^