我有一个网站,其中包含从 nginx 的 http 缓存提供的所有页面,并且很少失效或过期。
平均总页面下载大小约为 2 MB 但尽管是一个没有有趣逻辑的静态站点,但我的服务器响应约为一秒
我记录了 nginx $request_time
,它从服务器到大约 400 毫秒
每个文件平均为 20-30 KB
400 毫秒似乎很荒谬。
我支持Cloudflare并且
sendfile on;
tcp_nopush off;
tcp_nodelay on;
keepalive_timeout 300s;
keepalive_requests 10000;
Run Code Online (Sandbox Code Playgroud)
我应该怎么做才能将响应时间降低到 150 毫秒范围内?
编辑:我调整的第一部分。
意识到我没有开启 SSL OSCP。将代码调整为
# https://github.com/autopilotpattern/wordpress/issues/19
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_certificate /etc/letsencrypt/live/site.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/site.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/site.com/chain.pem;
ssl on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
Run Code Online (Sandbox Code Playgroud)
我会反馈改进的。
编辑2:
这是从印度到美国西海岸服务器的 3G 连接的网页测试结果
我正在使用nginx 的expires
指令;它的etag
指令以及Last-Modified
标题(如果我理解正确的话)默认情况下处于打开状态。
为了在使用限制性内容安全策略(CSP)标头(即无'unsafe-inline'
资源策略)时允许特定的内联 JavaScript,我想使用随机数。
我基本上遵循了Scott Helme 关于此事的文章,在我的试验中使用 nginx$request_id
来创建nonce
ServerFault 上讨论的内容(以便快速尝试,而不必从头开始构建 nginx)。
然而,当我尝试此操作时,缓存似乎不再按我的预期工作:
Nginx 每次都以文件、新鲜Last-Modified
和ETag
标头进行响应,而不是304 Not Modified
我希望的响应。
仔细想想,这是有道理的:nonce
CSP 标头以及源代码中的 都会随着每个请求而变化。然而,其他一切都没有改变。因此,可以说,这是“弱验证器”应该忽略的更改(从而将请求的资源标记为未更改)。
话虽如此,我对服务器配置或缓存标头知之甚少,甚至一无所知。很可能我所掌握的少量知识没有帮助,而且弱验证器无论如何也不应该以这种方式工作。
此外,似乎存在一个问题,即当浏览器拥有旧文件的缓存版本nonce
但获得304 Not Modified
新文件的标头时,浏览器会感到困惑nonce
(尽管我自己在试用中没有看到这一点)。
因此,我的问题基本上是:是否可以配置nginx,以便缓存以某种方式工作,当nginx创建和标头(即它只看起来的地方)时,对唯一的更改(即通过文本替换动态发生的更改)nonce
被忽略Last-Modified
ETag
在磁盘上的文件更改时) - 有效地使用什么可能是弱验证器?
并且,假设浏览器混乱是一个问题,您是否可以采取一些措施来阻止它,例如当服务器返回 304 时不返回 CSP …
我有一个 nginx 缓存代理,它从 apache 原始服务器获取内容。
我从curl
、wget
和发出请求Chrome
来验证缓存响应。问题是,对于相同的 URL,我总是MISS
在每个单独的客户端中得到第一次。
我希望在我向任何客户提出一个请求后,其他客户会得到一个HIT
,但我得到了MISS
。
HIT
我只有在同一个客户端重复请求时才会收到。
感觉 key 与用户代理有关,但事实并非如此:
proxy_cache_key $scheme://$host$request_uri;
Run Code Online (Sandbox Code Playgroud)
为了排除不同的HTTP版本和用户代理,我在请求中指定了它们(wget默认使用http1.1),它们都显示GET
在日志中,所以不是HEAD
wget --server-response --user-agent "foo" 'https://www.example.com/x.php?124'
HTTP request sent, awaiting response...
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Tue, 03 Mar 2020 19:53:53 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.4.16
X-Accel-Expires: 3600
Vary: Accept-Encoding
X-Cache: MISS <<<<<<<<<<<<<<<<<<<<<<<<<< there
# repeating the request again with WGET will get …
Run Code Online (Sandbox Code Playgroud) 我提供了一个 wordpress 博客,其中 nginx http 缓存到超过 99% 的请求,缓存寿命为 2 天。这是该网站的网页。网页有很多图像,因此延迟加载。页面的平均大小仅为 1 mb。
平均响应大小为 10 KB
使用速度曲线时,我的 TTFB 中位数为 0.6 秒
为什么这么高?
我支持 cloudflare,所有静态资产(如 JS、CSS 和图像)都从 cloudflare 进行版本控制和缓存。
我的 nginx 配置有
sendfile on;
# https://forum.nginx.org/read.php?2,280434,280434#msg-280434
tcp_nopush on;
tcp_nodelay on;
#https://support.cloudflare.com/hc/en-us/articles/212794707-General-Best-Practices-for-Load-Balancing-at-your-origin-with-Cloudflare
#https://www.nginx.com/blog/tuning-nginx/
keepalive_timeout 300s;
keepalive_requests 10000;
Run Code Online (Sandbox Code Playgroud)
我也有
initcwnd 设置为 10,initrwnd 10 和 ipv4.tcp_slow_start_after_idle=0
这是 cloudflare 对从 CF 到源的响应时间的报告
静态网站也在两台机器上进行负载平衡。一个在弗里蒙特,一个在孟买,Cloudflare 做地理路由。
为什么我的 TTFB 这么长,我可以做些什么来减少它?