【问题标题】:Nginx not Caching my ApplicationNginx 没有缓存我的应用程序
【发布时间】:2017-04-05 19:29:48
【问题描述】:

我正在尝试使用 Nginx 设置我的 ExpressApp 及其呈现的 Jade 文件的缓存。

当我在运行 google Pagespeed Insight 测试时查看我的应用程序的 pm2 日志时,我发现图像和 HTML 仍然由应用程序而不是 Nginx 代理提供。

两个问题:

  1. 如何更改我的配置才能获得预期的效果?
  2. 如何有效地验证设置/缓存是否正常工作?

谢谢!

我当前的 Nginx 配置:

proxy_cache_path /var/lib/nginx/cache levels=1:2 keys_zone=backcache:8m max_size=50m;
proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args";
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        location / {

                 expires 1w;
                 proxy_cache backcache;
                 #proxy_cache_bypass $http_cache_control;
                 add_header X-Proxy-Cache $upstream_cache_status;

                 proxy_pass http://localhost:3030;
         } 
}

标题:

* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
* Server certificate: ###
* Server certificate: COMODO RSA Domain Validation Secure Server CA
* Server certificate: COMODO RSA Certification Authority
* Server certificate: AddTrust External CA Root
> GET / HTTP/1.1
> Host: ###
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.10.0 (Ubuntu)
< Date: Thu, 24 Nov 2016 13:15:37 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 66761
< Connection: keep-alive
< Vary: Accept-Encoding
< X-Powered-By: Express
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Methods: GET,PUT,POST,DELETE
< Access-Control-Allow-Headers: Origin, x-access-token, X-Requested-With, Content-Type, Accept, un-populated
< ETag: W/"104c9-8+4lo531tUk9k3SJq4sPHg"
< Expires: Thu, 01 Dec 2016 13:15:37 GMT
< Cache-Control: max-age=604800
< X-Proxy-Cache: MISS

对一个图像的两个连续请求的标头

➜  ~ curl -I **url/img.jpg**
HTTP/1.1 200 OK
Server: nginx/1.10.0 (Ubuntu)
Date: Fri, 25 Nov 2016 03:17:02 GMT
Content-Type: application/octet-stream
Content-Length: 11007
Connection: keep-alive
X-Powered-By: Express
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,PUT,POST,DELETE
Access-Control-Allow-Headers: Origin, x-access-token, X-Requested-With, Content-Type, Accept, un-populated
Accept-Ranges: bytes
Cache-Control: max-age=604800
Last-Modified: Thu, 17 Nov 2016 16:23:13 GMT
ETag: W/"2aff-158731964ca"
Expires: Fri, 02 Dec 2016 03:17:02 GMT
X-Proxy-Cache: MISS

➜  ~ curl -I **url/img.jpg**
HTTP/1.1 200 OK
Server: nginx/1.10.0 (Ubuntu)
Date: Fri, 25 Nov 2016 03:17:08 GMT
Content-Type: application/octet-stream
Content-Length: 11007
Connection: keep-alive
X-Powered-By: Express
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,PUT,POST,DELETE
Access-Control-Allow-Headers: Origin, x-access-token, X-Requested-With, Content-Type, Accept, un-populated
Accept-Ranges: bytes
Cache-Control: max-age=604800
Last-Modified: Thu, 17 Nov 2016 16:23:13 GMT
ETag: W/"2aff-158731964ca"
Expires: Fri, 02 Dec 2016 03:17:08 GMT
X-Proxy-Cache: MISS

【问题讨论】:

  • 要调试它,如果您可以将两个后续请求的请求和响应标头发布到同一资源,将会很有帮助。确保浏览器未设置为禁用缓存。
  • @Digitalkapitaen 感谢您的回复!相应地添加了标题,谢谢!

标签: node.js express caching nginx


【解决方案1】:

您显示为请求标头的标头很可能不是原始标头,因为它显示“显示临时标头”。

实际的请求标头可能包含“缓存控制”标头,并且您的 nginx 配置使用该标头绕过缓存,如“X-Proxy-Cache:BYPASS”响应标头所示。

如果没有理由保留它,您应该从配置中删除 proxy_cache_bypass-directive。

【讨论】:

  • 我删除了 proxy_cache_bypass,谢谢。当我从 express 应用程序中查看我的 pm2 日志并运行 googleopagespeed 测试时,我看到了每个请求是如何进来的,并且仍然由 express 处理。理想情况下,nginx 会从缓存中提供这些文件。有什么方法可以做到这一点?
  • 嗯,你能发布完整的标题吗?您可以通过curl -v http://example.com/ -o /dev/null 获取它们。
  • 编辑了标题,这样更好吗? @Digitalkapitaen
  • 看起来我在 html 文件上有一个代理缓存 HIT,但在 img 文件上有一个 MISS。虽然相同的“位置”......
  • 您发布的标头表明 nginx 在其缓存中没有该文件。再次执行 curl 会发生什么?然后它应该来自缓存而不是后端。同样对于图像,最好是发布两个后续请求的标头,因为缓存/不缓存的原因应该在那里。
猜你喜欢
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 2021-04-29
  • 2017-08-17
相关资源
最近更新 更多