Nginx静态资源

Nginx可以处理静态资源

非Web服务器可以运行处理而生成的文件,即服务器只需要从硬盘或者缓存中读取然后直接给客户端响应即可。

常见的静态资源

# 浏览器渲染: html文件,样式表CSS,JS脚本——浏览器需要读取样式格式和脚本,然后去渲染的.
# 图片文件: GIF、PNG、JPEG
# 视频文件: MP4、FLV、AVI、MPEG
# 其它文件: ISO、PDF、TXT、EXE

Nginx作为网站服务器,如何高效的处理静态资源,就需要让nginx速度变快,可以从以下几个方面考虑:

1.文件读取:nginx如何从硬盘上读取文件,然后交给socket
2.文件压缩
3.proxy缓存
4.浏览器缓存
php php——> php
java jsp——> tomcat
python wsgi——> wsgi

静态缓存

缓存就是为了加快访问速度的,避免nginx和后端服务器进行交互,因为一交互就涉及到网络带宽,磁盘进行IO操作查找数据,回复数据也需要网络带宽,web查找数据还需要消耗cpu内存,nginx和后端服务器通讯,本地需要消耗cpu,内存,没有交互能省很多资源.proxy若无缓存就是miss,若有缓存就是hit命中.

缓存类型
  1. 数据库缓存: memcache,redis
  2. proxy网页缓存: client访问静态资源,代理有缓存就无需向后端web请求资源.
  3. 客户端缓存即浏览器缓存: 根据Etag和Last-Modified来判断缓存的有效性.
  4. Nginx反向代理缓存数据由两部分组成,第一部分叫缓存的元数据,包括缓存数据的名称,大小,有效期等,这一部分是存放在内存中的,需要在内存中开启一段空间,专门用于保存缓存的元数据。另外一部分就是缓存数据的本身,真正缓存下来的数据,这一部分的数据是存放在硬盘上的,需要设置缓存数据的存放路径.

综上: 设置Nginx的反向代理缓存主要设置两部分内容:

# 一、在内存里面开启一段空间用来缓存元数据.
# 二、在磁盘中指定目录用来缓存真正缓存下来的数据.

定义缓存空间

指令:
proxy_cache_path:    # 不能定义在server{}中.
Example: - proxy_cache_path /nginx/cache/first levels=2:1:2 keys_zone=first:20m max_size=1G

参数详解:

  1. 整个配置的作用就是在nginx服务器本地开辟了一段用来存储缓存数据的内存空间+磁盘空间
  2. keys_zone=name:size # 定义存储键的区域(定义共享的名称)
  3. keys_zone: # 在内存里面开辟一块区域,first是为开启的区域起的名字
  4. 20m: # 开启的内存大小为20m,用来保存元数据.
  5. /nginx/cache/first: # 一个目录名,重启nginx服务会在磁盘上自动产生,里面目录用来存放真正的缓存数据.
  6. max_size: # 指定/nginx/cache/first中的1G空间用于存储数据,可根据自己的需求调整.
  7. level 2:1:2 #nginx生成缓存数据在指定的目录下生成三级子目录,真正的缓存数据在最后一级目录存放,第一级,第二级和第三级子目录的名称分别是2个字符,1个字符和2个字符,且每一级子目录的名称最多2个字符,目录名称是随机生成的,这样配置的好处是: 缓存数据比较多的时候,分类存放,nginx查找速度快一点.
代理服务器缓存过期
proxy_cache_valid  200  302  10m;        # 返回值为200和302缓存10min;
proxy_cache_valid 404 1m; # 返回值404缓存1min
缓存维度
# Syntax:    proxy_cache_key  string;
# Default: proxy_cache_key $scheme$proxy_host$request_uri;
# nginx内部变量scheme是协议名,proxy_host 是缓存服务器主机名,$request_uri是请求的路径,将他们作为整体hash成一个key,缓存到目录.
# Context: http,server,location

Nginx缓存配置示例

定义缓存存放路径为/web/cache,缓存级别为2级,即location后面匹配到的缓存两级目录,多了不缓存 缓存的内容最多使用1G空间; 并定义键值区域名称为first,名字占的空间大小为20m,60分钟之内没有人用就删掉

proxy_cache_path /web/cache levels=1:2 keys_zone=first:20m max_size=1g inactive=60m;
# 定义一段缓存空间之后,想要启用缓存功能,需要在某一个locaiton里面写下面两行
proxy_cache first; first就是上面定义的指定缓存元数据的区域空间名称
proxy_cache_valid 200 304 1m; 表示nginx只缓存状态码为200和304的响应数据,且数据在缓存时,有效期为1min
proxy_cache_valid any 10m;其他的缓存10分钟
proxy_cache_key $host$uri$is_args$args; 使用什么做key,可以不定义,系统自动定义名字 # 在httpd响应报文中添加额外项X-cache,用于查看缓存是否命中,可加可不加的
add_header x-cache "$upstream_cache_status by $server_addr";
# 添加一个头部名称为x-cache,头部里面的内容是:nginx内部的两个变量:
$upstream_cache_status: 用于记录缓存是否命中的状态 (HIT, MISS, EXPIRED)
$server_addr 服务器地址

在浏览器中F12-------->网络-------->查看HTTP响应报文

X-cache:HIT by 192.168.122.153信息,表示缓存命中

miss by 192.168.122.153信息,表示首次访问

proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; 收到50x代号,向上游服务器重新请求一次

具体操作

修改如下两个配置文件

vim /etc/nginx/nginx.conf
upstream websrv {
server 47.92.24.137 weight=1 max_fails=2 fail_timeout=2;
server 49.233.69.195 weight=1 max_fails=2 fail_timeout=2;
server 127.0.0.1:8080 backup;
}
proxy_cache_path /web/cache levels=1:2 keys_zone=first:20m max_size=1g;
add_header x-cache "$upstream_cache_status by $server_addr";
access_log /var/log/nginx/access.log main; vim /etc/nginx/conf.d/default.conf
location / {
root /usr/share/nginx/html;
index index.html index.htm;
proxy_pass http://websrv/;
proxy_cache first;
proxy_cache_valid 200 304 12h;
#proxy_cache_key $host$uri$is_args$args;
add_header Nginx-Cache "$upstream_cache_status";
proxy_set_header X-Real-IP $remote_addr;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
mkdir /web/cache -p # 缓存的path,文件夹需要创建,否则报语法错误 # 重新加载配置文件使其生效
systemctl restart nginx
elinks --dump 39.108.140.0
# welcome to nginx
elinks --dump 39.108.140.0
# welcome to nginx
elinks --dump 39.108.140.0
# welcome to nginx # 负载均衡没有生效,因为有缓存了
curl -I 39.108.140.0
# HTTP/1.1 200 OK
# Server: nginx/1.16.1
# Date: Fri, 01 Nov 2019 14:52:19 GMT
# Content-Type: text/html
# Content-Length: 17
# Connection: keep-alive
# Last-Modified: Sat, 19 Oct 2019 13:24:08 GMT
# ETag: "5dab0e78-11"
# Nginx-Cache: HIT # HTI为有缓存的意思
# Accept-Ranges: bytes

接下来我们将缓存删掉

rm -rf /web/cache/*
curl -I 39.108.140.0
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Fri, 01 Nov 2019 14:52:49 GMT
Content-Type: text/html
Content-Length: 8
Connection: keep-alive
Last-Modified: Fri, 01 Nov 2019 10:51:39 GMT
ETag: "5dbc0e3b-8"
Nginx-Cache: MISS # MISS表示没有缓存了

06 . Nginx静态资源缓存的更多相关文章

  1. 清除nginx静态资源缓存

    之前写过一篇如何配置nginx缓存及手动清除缓存的文章: http://www.cnblogs.com/Eivll0m/p/4921829.html 但如果有大量缓存需要清理,手动一条条清理就比较慢了 ...

  2. Nginx 静态资源缓存配置

    示例 # Media: images, icons, video, audio, HTC location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|m ...

  3. nginx静态资源缓存与压缩

    一.静态资源缓存 参考文章 (1)apache设置max-age或expires 这里需要修改.htaccess文件. <IfModule mod_headers.c> <Files ...

  4. nginx静态资源缓存策略配置

    1. 问题-背景 以前也经常用nginx,但用的不深,通常是简单的设置个location用来做反向代理.直到今天给客户做项目碰到缓存问题:客户有个app,只是用原生做了个壳,里面的内容都是用h5写的, ...

  5. [转]Nginx 静态资源缓存设置

    本文转自:https://www.w3cschool.cn/nginxsysc/nginxsysc-cache.html 在开发调试web的时候,经常会碰到因浏览器缓存(cache)而经常要去清空缓存 ...

  6. Nginx 静态资源缓存设置

    在开发调试web的时候,经常会碰到因浏览器缓存(cache)而经常要去清空缓存或者强制刷新来测试的烦恼,提供下apache不缓存配置和nginx不缓存配置的设置.在常用的缓存设置里面有两种方式,都是使 ...

  7. nginx静态资源设置缓存的方法

    nginx静态资源设置缓存的方法 直接加expires 30d; 就是就可以了 缓存时间30天完整如下 <pre> location / { root /home/www/wordpres ...

  8. 008.Nginx静态资源

    一 Nginx静态资源概述 1.1 静态资源类型 Nginx作为静态资源Web服务器部署配置, 传输非常高效, 常常用于静态资源处理,请求以及动静分离.通常非服务器动态运行生成的文件属于静态资源. 类 ...

  9. SpringBoot cache-control 配置静态资源缓存 (以及其中的思考经历)

    昨天在部署项目时遇到一个问题,因为服务要部署到外网使用,中间经过了较多的网络传输限制,而且要加载arcgis等较大的文件,所以在部署后,发现页面loading需要很长时间,而且刷新也要重新从服务器下载 ...

随机推荐

  1. 软件——IDEA中如何去掉警告虚线

    初次安装使用IDEA,总是能看到导入代码后,出现很多的波浪线,下划线和虚线,这是IDEA给我们的一些提示和警告,但是有时候我们并不需要,反而会让人看着很不爽,这里简单记录一下自己的调整方法,供其他的小 ...

  2. Collections集合工具类常用的方法

    java.utils.Collections //是集合工具类,用来对集合进行操作.部分方法如下: public static <T> boolean addAll(Collection& ...

  3. openshift 4.3 Istio的搭建(istio 系列一)

    openshift 4.3 Istio的搭建 本文档覆盖了官方文档的Setup的所有章节 目录 openshift 4.3 Istio的搭建 安装Istio openshift安装Istio 更新is ...

  4. LeetCode--LinkedList--141.Linked List Cycle(Easy)

    141. Linked List Cycle(Easy)2019.7.10 题目地址https://leetcode.com/problems/linked-list-cycle/ Given a l ...

  5. 【Hadoop离线基础总结】hive的窗口函数

    hive的窗口函数 概述 hive中一般求取TopN时就需要用到窗口函数 专业窗口函数一般有三个 rank() over dense rank() over row_number() over 实例 ...

  6. 【FreeRTOS实战汇总】小白博主的RTOS学习实战快速进阶之路(持续更新)

    博主是个小白,打算把这段时间系统学习RTOS的文章统一整理到这里,另外本文会给出一些参考性资料和指导性建议: 本文宗旨 FreeRTOS 是由Richard Barry在2003年由设计的,由于其设计 ...

  7. C:简单实现BaseCode64编码

    What is Base64? 前言 目前来看遇到过Base 16.Base 32.Base 64的编解码,这种编码格式是二进制和文本编码转化,是对称并且可逆的转化.Base 64总共有64个ASCI ...

  8. 【c++ 重载】

    重载"[]": #include <iostream> #include <string> using namespace std; struct Node ...

  9. webview的简单介绍和手写一个H5套壳的webview

    1.webview是什么?作用是什么?和浏览器有什么关系? Webview 是一个基于webkit引擎,可以解析DOM 元素,展示html页面的控件,它和浏览器展示页面的原理是相同的,所以可以把它当做 ...

  10. opengl简单入门实例

    实现任务目标: 使用纹理贴图,增强可视效果 应用坐标变换,实现场景中不同物体重建 采用双缓冲技术,实现场景实时绘制 具有一定的鼠标.键盘交互功能 先放效果 鼠标的交互功能有:右键暂停转动,左键继续转动 ...