写点什么

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

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

关注

评论

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

Java入门到架构-优秀书籍

Java入门到架构

Java 架构 入门 书籍

“懂行人”合力共建“强富美高”数字经济助力千载金陵的数字一跃

脑极体

PowerShell 数组

耳东@Erdong

PowerShell 7月日更

(VMware)ubuntu 环境下搭建 docker 镜像私服

逸少

Docker 镜像仓库

08 | 指针系列(二):记住,指针变量也是变量

Nydia

Ant蚂蚁挖矿系统软件开发资料

阿里+头条+腾讯等大厂Android面试题分享,神操作!

欢喜学安卓

android 程序员 面试 移动开发

Redisson 分布式锁源码 01:可重入锁加锁

程序员小航

Java redis 源码 分布式锁 redisson

架构思考

zk

微信 架构 微信业务架构

云原生领域的一些技术展望

名白

容器 云原生 Service Mesh service

2021最新一线大厂Java高级架构师面试题总结,上线3天获22w浏览量

Java 编程 程序员 架构 面试

“Windows 找不到文件...”,怎么处理?

Emotion

windows 系统 找不到系统文件 windows找不到文件

极客时间-排位赛可视化工具

IT蜗壳-Tango

7月日更

网络攻防学习笔记 Day61

穿过生命散发芬芳

网络攻防 7月日更

Rust从0到1-Cargo-自定义构建

rust build cargo 构建

对象存储手把手教一 | 用户数据访问控制管理ACL

QingStor分布式存储

云原生 对象存储 分布式存储

Go 学习笔记之 命名

架构精进之路

Go 语言 7月日更

Linux之tail命令

入门小站

Linux

在线HTML实体转字符串工具

入门小站

工具

ES6中扩展运算符的8种用法

devpoint

数组去重 ES6 扩展运算符

话题讨论|你知道集群、分布式、微服务区别吗?

Emotion

分布式 微服务 话题讨论 集群 话题王者

李某逆道而行闭关三月,直接四杀斩获阿里/腾讯/京东/百度等大厂offer

Java架构师迁哥

数据结构——树和二叉树

若尘

数据结构 二叉树

推荐系统提供web服务的2种方式(二十四)

Databri_AI

算法 推荐系统 web服务

【Flutter 专题】98 易忽略的【小而巧】的技术点汇总 (六)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 7月日更

多项目并行,项目经理如何有效管理项目进度?

万事ONES

研发管理工具 ONES 项目经理 项目管理工具

阿里+头条+抖音+百度+蚂蚁+京东面经,都是精髓!

欢喜学安卓

android 程序员 面试 移动开发

为什么 FaaS 系统的复杂性不会随着规模的增长而指数增长?

朱峰 Ben

Serverless Faas

.NET CORE 对象池简述

喵叔

7月日更

【LeetCode】雪糕的最大数量Java题解

Albert

算法 LeetCode 7月日更

流量为王时代的短视频平台如何确保内容质量?|【话题讨论】

老猿Python

技术 内容审核 流量为王 负能量

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