【编者的话】本文是“NGINX 应用性能优化指南”系列文章的第三篇,主要介绍了如何从内容缓存、转发和微缓存方面实现 NGINX 应用性能优化。
注:本文最初发布于 MaxCDN 博客,InfoQ 中文站在获得作者授权的基础上对文章进行了翻译。
正文
NGINX 反向代理非常适合强力 I/O,作为一个不错的内容缓存,将数据移动到距离客户端或边缘节点较近的地方。这让你可以完全解放你的服务器,让它们专注于处理业务逻辑和动态内容生成。
在理想情况下,静态文件由位于源服务器反向代理上的本地快速存储(SSD)提供,并进一步通过 CDN 缓存。针对内容缓存和繁重工作设置 NGINX 反向代理有几种通常互补的方式。它们是:
- 动态内容微缓存;
- 静态内容缓存;
- 通过本地存储和 / 或应用服务器重定向实现内容转发;
- 后台存储阵列转发;
- 带响应缓存的存储服务转发。
微缓存的思想是,动态、非个性化响应可以缓存非常短的时间(比如 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 确保客户端请求永远不会匹配被标记为internal
的location
:
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 )关注我们。
评论