写点什么

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:515555
用户头像

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

关注

评论

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

原创 面试官:你说对MySQL事务很熟?那我问你10个问题

程序员柠檬

MySQL 数据库

分布式锁🔒是个啥❓ 其实就这么点事

山中兰花草

Java redis 后端 分布式锁 开发

github看代码效率提高10倍!因为用了sourcegraph这个工具

程序员柠檬

GitHub 程序员 效率工具

你真的清楚 Nginx 指令的规则吗?

子杨

nginx 运维

10分钟白嫖我的常用的在线工具网站清单

JavaGuide

设计 在线工具 工具类网站 PDF

游戏夜读 | 记忆里的老游戏

game1night

2020亚洲南京第十三届人工智能机器人服务展览会

南京专业智博会

展览会 论坛会 博览会 智博会

这可能是 Markdown 写微信公众号的一款神器了!

JackTian

效率工具 markdown markdown编辑器 markdownnice 神器

如何衡量产品需求效果

黄大路

产品经理 产品设计 运营

2020年南京第十三届智慧停车展会

南京专业智博会

展览会 博览会 智博会 展览会论坛会

PageHelper

BitSea

Linux下程序出问题不要慌,资深程序员教你6招搞定!

程序员柠檬

Linux 程序员 后台开发

Markdown 几行字符就可以生成思维导图了!

JackTian

markdown 思维导图 markdown语法 markdown编辑器 Markmap

k6新崛起的性能测试工具

风中之心

DevOps 性能 性能测试

Java 底层基础笔记(一)硬件

奈何花开

Java Linux 计算机基础

2020年亚洲南京大数据产业展览会

南京专业智博会

展览会 论坛会 博览会 智博会

Jupyter最佳实践

pydata

用大数据分析了一线城市1000多份岗位招聘需求,告诉你如何科学找工作

程序员柠檬

Python 数据分析

不忘初心,继续努力

一周思进

ARTS 打卡计划

2020南京第十三届智慧工地装备展览会

南京专业智博会

展览会 论坛会 博览会 智博会

2020亚洲智能家居全屋智能展会-南京站

南京专业智博会

展览会 论坛会 博览会 智博会

ARTS打卡-01

Geek_yansheng25

ARTS 打卡计划

推荐几款有意思的小众App(05.30)

静陌

产品 App

Wireshark的使用与数据分析(一)

姬翔

使用 PCA 进行降维可视化,了解特征分布

黄大路

数据挖掘 数据分析 可视化

思维模型 - 概念篇

石云升

学习 高效 思维模型 决策

ARTS-week-1

saddamwilson

ARTS 打卡计划

2020年南京第十三届物联网应用展览会

南京专业智博会

展览会 论坛会 博览会 智博会

如何优雅地实现泛型类的类型参数化

KAMI

Java 编程 反射 泛型

原创 | 使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (十二)编写测试-简单测试

编程道与术

Java 编程 TDD 单元测试 JUnit

面试造飞机系列:说下微服务接口设计原则?

程序员柠檬

分布式 微服务 后端 架构设计

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