写点什么

NGINX 应用性能优化指南(第三部分):内容缓存、转发和微缓存

  • 2016-04-08
  • 本文字数:1691 字

    阅读完需:约 6 分钟

【编者的话】本文是“NGINX 应用性能优化指南”系列文章的第三篇,主要介绍了如何从内容缓存、转发和微缓存方面实现 NGINX 应用性能优化。

注:本文最初发布于 MaxCDN 博客,InfoQ 中文站在获得作者授权的基础上对文章进行了翻译。

正文

NGINX 反向代理非常适合强力 I/O,作为一个不错的内容缓存,将数据移动到距离客户端或边缘节点较近的地方。这让你可以完全解放你的服务器,让它们专注于处理业务逻辑和动态内容生成。

在理想情况下,静态文件由位于源服务器反向代理上的本地快速存储(SSD)提供,并进一步通过 CDN 缓存。针对内容缓存和繁重工作设置 NGINX 反向代理有几种通常互补的方式。它们是:

  1. 动态内容微缓存;
  2. 静态内容缓存;
  3. 通过本地存储和 / 或应用服务器重定向实现内容转发;
  4. 后台存储阵列转发;
  5. 带响应缓存的存储服务转发。

微缓存的思想是,动态、非个性化响应可以缓存非常短的时间(比如 1 秒)。事实上,有人会说,根据预期工作流的不同,个性化响应也可以缓存一小段时间。

虽然它也许没有提供直观的意义,但微缓存让你的服务在面临过量需求或攻击时可以存活更长的时间。它可以(有点人为地)提高基准测试数值。

相关阅读: NGINX 微缓存的好处

在处理静态内容的可管理目录时,最简单的方法可能是让反向代理在其文件系统上存储大量公共资源,作为一个简单的 WebRoot,并直接提供它们。公共资源可以使用一个名为try_files(或者alias)的普通location 块提供。缓存不命中的话,可以像平常一样发送给后台服务器,而响应可以缓存:

复制代码
location / {
alias /home/nginx/www-sparse;
try_files $uri @backend;
}
location @backend {
proxy_cache myCache;
proxy_cache_valid 2h;
proxy_pass http://backend;
}

当资源访问需要身份验证或其他业务逻辑时,应用服务器可以使用 HTTP 头 _X-Accel-Redirect_ 生成一个重定向响应,请求反向代理向客户端提供资源。

可以在反向代理上使用internal 指令限制访问这些内部产生的请求。NGINX 确保客户端请求永远不会匹配被标记为internallocation

复制代码
location /secret {
internal;
alias /home/nginx/group/data;
try_files $uri =404;
}

后台存储阵列也可以使用proxy_pass指令寻址。如果你使用存储服务代替,那么你可能还会想缓存响应,为了将数据移动到距离客户端或边缘节点较近的地方。

复制代码
location /external {
proxy_cache MY_CACHE;
proxy_cache_valid 1h;
proxy_pass http://192.168.10.201;
}

不要忘记更新所需的 HTTP 头,并在 XFF 头(或者新的 RFC 7239 Forwarded头)中添加代理的 IP 地址:

复制代码
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;

当代理 HTTPS 客户端连接到达 HTTP 后台时,应用服务器必须为恰当的模式生成内容 URL。你可以使用X-Forwarded-Proto头传播这个模式。部分微软应用程序会查找Front-End-Https作为替代。

复制代码
map $scheme $front_end_https {
https on;
default off;
}
proxy_set_header X-Forwarded-Proto $scheme;
add_header Front-End-Https $front_end_https;

例如,在生成链接时,WordPress 会使用 PHP 的全局变量$_SERVER控制 HTTP(S)模式。你可以将下面的代码片段加到 WordPress 后台的根目录下(例如,在wp-config.php末尾),以便使用X-Forwarded-Proto头。

复制代码
<?php
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
$_SERVER['HTTPS']='on';
?>

指令proxy_cache_key决定 NGINX 如何唯一标识一个响应正文。通过预先在参数名上加上前缀“$arg_”,你可以使用 NGINX 变量显式引用缓存键中的查询参数。举例来说,考虑下这个 URL:http: //www.example.com?abc=1&xyz=2 。NGINX 将提供$arg_abc$arg_xyz供 NGINX 配置使用。

相关教程:借助查询字符串参数应用自定义规则

查看英文原文: NGINX Application Performance Optimization:Content Caching, Relay, and Micro-Caching


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-04-08 23:514961
用户头像

发布了 1008 篇内容, 共 411.5 次阅读, 收获喜欢 346 次。

关注

评论

发布
暂无评论
发现更多内容

【等保知识】等保三级要求多少分?几分能过?

行云管家

网络安全 等保 等级保护

自主创新国产化科技:智能制造之 SMT 产线监控管理可视化

一只数据鲸鱼

数据可视化 工业4.0 制造业 智慧工厂

CompletableFuture真香,可以替代CountDownLatch!

架构 面试 后端 计算机

信息爆炸!78天闭门深造千页SpringCloud,再战京东

Java~~~

Java spring 架构 面试 Spring Cloud

三面阿里被挂,竟获内推名额,历经5面拿下口碑offer(Java后台)

Java 程序员 架构 面试 计算机

48W字?GitHub上下载量破百万的阿里:图解Java、网络、算法笔记

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

硬核!阿里自爆虐心万字面试手册,Github上获赞89.7K

Java~~~

Java 架构 面试 算法 JVM

牛掰!阿里人用7部分讲明白百亿级高并发系统(全彩版小册开源)

Java~~~

Java 架构 面试 高可用 高并发

6年Java经验,4面阿里定级P7,多亏阿里13万字+脑图+源码面试笔记

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

GitHub阅读量最高的文章竟是图解Java,不愧是Alibaba内部资料

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

细节爆炸!腾讯用13个案例实战讲明白MySQL,没想到这么全

Java~~~

Java MySQL 数据库 架构 面试

阿里巴巴新产“Java架构核心宝典”,全是流行技术,限时开放

Java 架构 面试 后端 计算机

图灵奖得主大全 深度学习经典论文翻译合集 John 易筋 ARTS 打卡 Week 62

John(易筋)

ARTS 打卡计划

叹服!阿里自述SpringCloud微服务:入门+实战+案例

Java~~~

Java spring 架构 面试 Spring Cloud

MySQL半同步复制的数据一致性探讨

OpenIM

竟有阿里大牛用678页PDF只讲Java程序性能优化,除了干货就是干货

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

开源demo| 视频应用类开源 Demo 大盘点

anyRTC开发者

音视频 视频直播 直播连麦 视频通话

膜拜!首次公布Java10W字面经,Github访问量破百万

Java~~~

Java 架构 面试 微服务 多线程

构建可靠分布式架构的最佳方式,竟记在国内第一本“凤凰架构”上

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

MapReduce高阶 分区、排序,Combine

Mike

一个内核漏洞详解:容器逃逸

程序员 架构 面试 计算机

Golang并发操作中常见的死锁情形

Regan Yue

协程 Go 语言 8月日更

springboot+cloud实战派PDF让开发和微服务架构像喝水一样简单

Java~~~

Java spring 架构 面试 Spring Boot

莫慌!阿里人用五个模块讲明白了SpringCloud,可下载

Java~~~

Java 架构 面试 微服务 Spring Cloud

设计 | 基于 Redis 谈一谈缓存设计思想

RadonDB

数据库 redis RadonDB

网易云iOS开发一面面经

iOSer

ios 面试

NFT盲盒玩法详解|盲盒系统开发

Geek_23f0c3

DAPP智能合约交易系统开发 NFT 盲盒

游戏开发者的通关之旅,华为AGC for Games带来了什么?

叶落便知秋

🏆【Alibaba微服务技术系列】「Dubbo3.0技术专题」回顾Dubbo2.x的技术原理和功能实现及源码分析(温故而知新)

码界西柚

dubbo RPC 8月日更 Dubbo3

啥?阿里DBA团队总监把MySQL 性能调优 金字塔,写进了800页笔记?

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

高安全等级网络是什么意思?有什么特点?

行云管家

网络安全 数据安全 安全事故 安全等级

NGINX应用性能优化指南(第三部分):内容缓存、转发和微缓存_后端_谢丽_InfoQ精选文章