nginx缓存配置及开启gzip压缩

阅读目录javascript

一:nginx缓存配置php

在前一篇文章,咱们理解过http缓存相关的知识点, 请看这篇文章. 今天咱们来学习下使用nginx服务来配置缓存的相关的知识。css

nginx配置缓存的优势:能够在必定程度上,减小服务器的处理请求压力。好比对一些图片,css或js作一些缓存,那么在每次刷新浏览器的时候,就不会从新请求了,而是从缓存里面读取。这样就能够减轻服务器的压力。html

nginx可配置的缓存又有2种:
1)客户端的缓存(通常指浏览器的缓存)。
2)服务端的缓存(使用proxy-cache实现的)。前端

客户端的缓存通常有以下两种方式实现:java

协商缓存和强缓存。具体理解什么是协商缓存或强缓存,能够看我以前的这篇文章.node

在配置以前,咱们来看下咱们的项目基本架构以下:jquery

|----项目demo
|  |--- .babelrc       # 解决es6语法问题
|  |--- node_modules   # 全部依赖的包
|  |--- static
|  | |--- index.html  # html页面
|  | |--- css         # 存放css文件夹
|  | | |--- base.css  # css文件,是从网上随便复制过来的不少css的
|  | |--- js          # 存放js的文件夹
|  | | |--- jquery-1.11.3.js  # jquery 文件
|  | |--- images      # 存放images文件夹
|  | | |-- 1.jpg      # 图片对应的文件
|  |--- app.js         # 编写node相关的入口文件
|  |--- package.json   # 依赖的包文件

package.json 代码以下:nginx

{
  "name": "xxx",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "dev": "nodemon ./index.js"
  },
  "license": "MIT",
  "devDependencies": {},
  "dependencies": {
    "@babel/core": "^7.2.2",
    "@babel/preset-env": "^7.2.3",
    "@babel/register": "^7.0.0",
    "koa": "^2.7.0",
    "koa-static": "^5.0.0",
    "nodemon": "^1.19.0",
    "path": "^0.12.7"
  }
}

app.js 代码以下:git

import path from 'path';
import Koa from 'koa';

//静态资源中间件
import resource from 'koa-static';
const app = new Koa();
const host = 'localhost';
const port = 7878;

app.use(resource(path.join(__dirname, './static')));

app.listen(port, () => {
  console.log(`server is listen in ${host}:${port}`);
});

index.js 代码以下:

require('@babel/register');
require('./app.js');

index.html 代码以下:

<!DOCTYPE HTML>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>前端缓存</title>
    <style>
      .web-cache img {
        display: block;
        width: 100%;
      }
    </style>
    <link href="./css/base.css" rel="stylesheet" />
    <script type="text/javascript" src="./js/jquery-1.11.3.js"></script>
  </head>
  <body>
    <div class="web-cache">
      1111112224546664456999000
      <img src="./images/1.jpg" />
    </div>
  </body>
</html>

如上就是一些基本的代码结构,当咱们在nginx没有配置任何的时候,咱们直接在命令行中运行 npm run dev 的时候,而后咱们在浏览器访问 http://localhost:7878/ 时候,能够看到无论我刷新多少次,浏览器下图片,css,js全部的请求都会返回200,不会有任何缓存。以下所示:

如今咱们去我本地安装的nginx中去配置下哦,打开nginx.conf配置文件。具体本地mac系统下安装nginx,能够去我以前的文章查看下如何安装,mac下安装nginx.

打开nginx.conf,使用 cat /usr/local/etc/nginx/nginx.conf (或者使用 sudo open /usr/local/etc/nginx/nginx.conf -a 'sublime text' 使用编辑器sublime打开)。

在nginx.conf加入以下规则:

server {
  location ~* \.(html)$ {
    access_log off;
    add_header  Cache-Control  max-age=no-cache;
  }

  location ~* \.(css|js|png|jpg|jpeg|gif|gz|svg|mp4|ogg|ogv|webm|htc|xml|woff)$ {
    # 同上,通配全部以.css/.js/...结尾的请求
    access_log off;
    add_header    Cache-Control  max-age=360000;
  }
}

如上配置解析含义以下:

~* 的含义是:通配任意字符(且大小写不敏感),\转义字符,所以 ~* \.(html)$的含义是:匹配全部以.html结尾的请求
access_log off; 的含义是 关闭日志功能。

add_header Cache-Control max-age=no-cache; 的含义:html文件不设置强制缓存时间,协商缓存,使用 Last-Modified。no-cache 会发起往返通讯来验证缓存的响应,但若是资源未发生变化,则不会下载,返回304。

以下图所示:

add_header Cache-Control max-age=360000; 的含义给上面匹配后缀的文件设置强制缓存,且缓存的时间是360000秒,第一次访问的时候,从服务器请求,当除了第一次之外,再次刷新浏览器,会从浏览器缓存读取,那么强制缓存通常是从内存里面先读取,若是内存没有,再从硬盘读取。

以下图所示:

注意:如上只是不对反向代理的页面进行缓存设置的,可是若是是反向代理后的页面,如上设置是不生效的。好比说我node起了一个服务,而后经过访问nginx反向代理的方式代理到我node服务来,上面的配置是不生效的。所以咱们须要以下处理配置。

解决nginx反向代理缓存不起做用的问题

好比我上面的node服务端口是7878端口。nginx须要以下配置:

server {
  listen  8081;
  server_name  xxx.abc.com;
  location / {
    proxy_pass http://localhost:7878;
    add_header  Cache-Control  max-age=no-cache;
  }
}

1) 若是咱们要添加缓存功能的话,须要建立一个用于存放缓存文件的文件夹。好比咱们这里使用 /data/nuget-cache。

在/usr/local/etc/nginx目录下新建。好比使用命令:mkdir /data/nuget-cache. 建立完成后,咱们来查看下:

2)而后咱们须要在nginx.conf的http设置部分添加 proxy_cache_path的设置,以下:

http {
  // ..... 其余的配置
  proxy_cache_path  /data/nuget-cache levels=1:2 keys_zone=nuget-cache:20m max_size=50g inactive=168h;
  server {
    listen  8081;
    server_name  xxx.abc.com;
    location / {
      proxy_pass http://localhost:7878;
      add_header  Cache-Control  max-age=no-cache;
    }
  }
}

proxy_cache_path 各个配置值的含义解析以下:

proxy_cache_path 指缓存的目录,目录为:/data/nuget-cache。
levels=1:2 表示采用2级目录结构;
keys_zone 指的是缓存空间名称,叫nuget-cache。缓存内存的空间为20M。
max_size 指的是缓存文件能够占用的最大空间。为50G.
inactive=168h; 默认过时时间为168个小时。为7天,也能够写成:inactive=7d; 这样的。

3)咱们还须要在server设置部分添加 proxy_cache 与 proxy_cache_valid的设置:以下代码:

http {
  // ..... 其余的配置
  proxy_cache_path  /data/nuget-cache levels=1:2 keys_zone=nuget-cache:20m max_size=50g inactive=168h;
  server {
    listen  8081;
    server_name  xxx.abc.com;
    location / {
      proxy_pass http://localhost:7878;
      add_header  Cache-Control  max-age=no-cache;
      proxy_cache nuget-cache;
      proxy_cache_valid 168h;
    }
  }
}

proxy_cache 设置的是 proxy_cache_path中的keys_zone的值。
proxy_cache_valid:设置的是缓存过时时间,好比设置168个小时过时。

如上配置完成后,咱们保存nginx.conf配置后,从新启动下nginx后,发现仍是不能缓存文件了。所以咱们还须要进行以下配置:

须要在server中再加上以下代码:

proxy_ignore_headers Set-Cookie Cache-Control;
proxy_hide_header Cache-Control;
proxy_hide_header Set-Cookie;

proxy_ignore_headers的含义是:忽略Cache-Control的请求头控制,依然进行缓存,好比对请求头设置cookie后,默认是不缓存的,须要咱们增长忽略配置。

所以全部配置变成以下了:

http {
  // ..... 其余的配置
  proxy_cache_path  /data/nuget-cache levels=1:2 keys_zone=nuget-cache:20m max_size=50g inactive=168h;
  server {
    listen  8081;
    server_name  xxx.abc.com;
    location / {
      proxy_pass http://localhost:7878;
      add_header  Cache-Control  max-age=no-cache;
      proxy_cache nuget-cache;
      proxy_cache_valid 168h;
      proxy_ignore_headers Set-Cookie Cache-Control;
      proxy_hide_header Cache-Control;
      proxy_hide_header Set-Cookie;
    }
  }
}

可是如上写法看起来很繁琐,所以咱们可使用include命令把文件包含进来,所以我在 /usr/local/etc/nginx 目录下新建一个 nginx_proxy.conf 配置文件,把上面的 proxy相关的配置放到该文件里面,以下所示:

而后咱们的配置就变成以下了:

http {
  // ..... 其余的配置
  proxy_cache_path  /data/nuget-cache levels=1:2 keys_zone=nuget-cache:20m max_size=50g inactive=168h;
  include nginx_proxy.conf;
  server {
    listen  8081;
    server_name  xxx.abc.com;
    location / {
      proxy_pass http://localhost:7878;
      add_header  Cache-Control  max-age=no-cache;
    }
  }
}

如上是对页面使用协商缓存的,可是对于图片,css, 或js这样的,我想使用强制缓存,所以对于其余的类型文件咱们统一以下这样处理:

server {
  listen       8081;
  server_name  xxx.abc.com;
  location / {
    proxy_pass http://localhost:7878;
    add_header  Cache-Control  max-age=no-cache;
  }
  location ~* \.(css|js|png|jpg|jpeg|gif|gz|svg|mp4|ogg|ogv|webm|htc|xml|woff)$ {
    access_log off;
    add_header Cache-Control "public,max-age=30*24*3600";
    proxy_pass http://localhost:7878;
  }
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   html;
  }
}

如上css或js文件等缓存的时间是30天。使用的是max-age强制缓存。所以如上,若是是页面第二次访问的话,会返回304,以下所示:

若是是css或js这样的访问的话,就是强制缓存了,状态码仍是200,可是先从内存里面读取的。固然若是进程结束了,好比浏览器关闭了,再打开,那么是从硬盘上读取的了。以下所示:

所以nginx.conf 全部的配置文件代码以下:

worker_processes  1;
events {
  worker_connections  1024;
}
http {
  include       mime.types;
  default_type  application/octet-stream;
  sendfile        on;
  #tcp_nopush     on;
  #keepalive_timeout  0;
  keepalive_timeout  65;
  include nginx_proxy.conf;
  proxy_cache_path  /data/nuget-cache levels=1:2 keys_zone=nuget-cache:20m max_size=50g inactive=168h;
  #gzip  on;
  server {
    listen       8081;
    server_name  xxx.abc.com;
    location / {
      proxy_pass http://localhost:7878;
      add_header  Cache-Control  max-age=no-cache;
    }
    location ~* \.(css|js|png|jpg|jpeg|gif|gz|svg|mp4|ogg|ogv|webm|htc|xml|woff)$ {
      access_log off;
      add_header Cache-Control "public,max-age=30*24*3600";
      proxy_pass http://localhost:7878;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
      root   html;
    }
  }
}

如上上面的css,js这些我时间设置短一点,好比设置60秒过时的话,那么过时后,我再刷新浏览器,浏览器会去询问服务器端,检查资源是否被更新了,若是资源没有被更新的话,那么服务器端会范湖304.资源依然读取本地的。以下所示:

而后再继续刷新的话,它以后又从内存里面读取了。依次这样循环下去。

二:nginx开启gzip

 开启gzip配置是在http层加的。基本配置代码以下:

# 开启gzip
gzip on;

# 启用gzip压缩的最小文件;小于设置值的文件将不会被压缩
gzip_min_length 1k;

# gzip 压缩级别 1-10 
gzip_comp_level 2;

# 进行压缩的文件类型。

gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;

# 是否在http header中添加Vary: Accept-Encoding,建议开启
gzip_vary on;

咱们如上的配置加上去后,如在http下加上上面的gzip代码:

http {
  # 开启gzip
  gzip on;

  # 启用gzip压缩的最小文件;小于设置值的文件将不会被压缩
  gzip_min_length 1k;

  # gzip 压缩级别 1-10 
  gzip_comp_level 2;

  # 进行压缩的文件类型。

  gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;

  # 是否在http header中添加Vary: Accept-Encoding,建议开启
  gzip_vary on;
}

咱们能够先来对比下,若是咱们没有开启zip压缩以前,咱们的对应的文件大小,以下所示:

如今咱们开启了gzip进行压缩后的文件的大小,能够看到以下所示:

而且咱们查看响应头会看到gzip这样的压缩,以下所示

相关文章
相关标签/搜索