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

RacPrather 3年前
   <p>【编者的话】本文是“NGINX应用性能优化指南”系列文章的第三篇,主要介绍了如何从内容缓存、转发和微缓存方面实现NGINX应用性能优化。</p>    <h2>正文</h2>    <p>NGINX反向代理非常适合强力I/O,作为一个不错的内容缓存,将数据移动到距离客户端或边缘节点较近的地方。这让你可以完全解放你的服务器,让它们专注于处理业务逻辑和动态内容生成。</p>    <p>在理想情况下,静态文件由位于源服务器反向代理上的本地快速存储(SSD)提供,并进一步通过CDN缓存。针对内容缓存和繁重工作设置NGINX反向代理有几种通常互补的方式。它们是:</p>    <ol>     <li>动态内容微缓存;</li>     <li>静态内容缓存;</li>     <li>通过本地存储和/或应用服务器重定向实现内容转发;</li>     <li>后台存储阵列转发;</li>     <li>带响应缓存的存储服务转发。</li>    </ol>    <p><img src="https://simg.open-open.com/show/3cace44b6740833e16a2b19d7cd06db1.png" alt="NGINX应用性能优化指南(第三部分):内容缓存、转发和微缓存" width="681" height="253"></p>    <p><strong>微缓存</strong>的思想是,动态、非个性化响应可以缓存非常短的时间(比如1秒)。事实上,有人会说,根据预期工作流的不同,个性化响应也可以缓存一小段时间。</p>    <p> </p>    <p>虽然它也许没有提供直观的意义,但微缓存让你的服务在面临过量需求或攻击时可以存活更长的时间。它可以(有点人为地)提高基准测试数值。</p>    <blockquote>     <p>相关阅读:<a href="/misc/goto?guid=4959672364374247046">NGINX微缓存的好处</a></p>    </blockquote>    <p>在处理<strong>静态内容</strong>的可管理目录时,最简单的方法可能是让反向代理在其文件系统上存储大量公共资源,作为一个简单的WebRoot,并直接提供它们。<strong>公共</strong>资源可以使用一个名为<code>try_files</code>(或者<code>alias</code>)的普通<code>location</code> 块提供。缓存不命中的话,可以像平常一样发送给后台服务器,而响应可以缓存:</p>    <pre>  <code>location / {    alias /home/nginx/www-sparse;    try_files $uri @backend;  }  location @backend {      proxy_cache myCache;      proxy_cache_valid 2h;      proxy_pass http://backend;  }  </code></pre>    <p>当资源访问需要<strong>身份验证</strong>或其他业务逻辑时,应用服务器可以使用HTTP头<em>X-Accel-Redirect</em>生成一个<strong>重定向</strong>响应,请求反向代理向客户端提供资源。</p>    <p>可以在反向代理上使用<code>internal</code> 指令限制访问这些内部产生的请求。NGINX确保客户端请求永远不会匹配被标记为<code>internal</code>的<code>location</code>:</p>    <pre>  <code>location /secret {    internal;    alias /home/nginx/group/data;    try_files $uri =404;  }  </code></pre>    <p><strong>后台存储阵列</strong>也可以使用<code>proxy_pass</code>指令寻址。如果你使用<strong>存储服务</strong>代替,那么你可能还会想缓存响应,为了将数据移动到距离客户端或边缘节点较近的地方。</p>    <pre>  <code>location /external {      proxy_cache MY_CACHE;      proxy_cache_valid 1h;      proxy_pass http://192.168.10.201;  }  </code></pre>    <p>不要忘记更新所需的HTTP头,并在XFF头(或者新的<a href="/misc/goto?guid=4959672364456934682">RFC 7239</a> <code>Forwarded</code>头)中添加代理的IP地址:</p>    <pre>  <code>proxy_set_header Host $host;  proxy_set_header X-Real-IP $remote_addr;  proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;  </code></pre>    <p>当代理HTTPS客户端连接到达HTTP后台时,应用服务器必须为恰当的模式生成内容URL。你可以使用<code>X-Forwarded-Proto</code>头传播这个模式。部分微软应用程序会查找<code>Front-End-Https</code>作为替代。</p>    <pre>  <code>map $scheme $front_end_https {      https on;      default off;  }  proxy_set_header X-Forwarded-Proto $scheme;      add_header Front-End-Https $front_end_https;  </code></pre>    <p>例如,在生成链接时,WordPress会使用PHP的全局变量<code>$_SERVER</code>控制HTTP(S)模式。你可以将下面的代码片段加到WordPress后台的根目录下(例如,在<code>wp-config.php</code>末尾),以便使用<code>X-Forwarded-Proto</code>头。</p>    <pre>  <code><?php    if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')          $_SERVER['HTTPS']='on';  ?>  </code></pre>    <p>指令<code>proxy_cache_key</code>决定NGINX如何唯一标识一个响应正文。通过预先在参数名上加上前缀“<code>$arg_</code>”,你可以使用NGINX变量显式引用缓存键中的查询参数。举例来说,考虑下这个URL:<em>http: //www.example.com?abc=1&xyz=2</em>。NGINX将提供<code>$arg_abc</code>和<code>$arg_xyz</code>供NGINX配置使用。</p>    <p>来源:<a href="http://www.infoq.com/cn/articles/nginx-application-performance-part03?utm_campaign=rightbar_v2&utm_source=infoq&utm_medium=articles_link&utm_content=link_text">InfoQ</a></p>