nginx缓存配置及开启gzip压缩

2024-05-09 09:18

本文主要是介绍nginx缓存配置及开启gzip压缩,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

亲测可用,若有疑问请私信

阅读目录

  • 一:nginx缓存配置
  • 二:nginx开启gzip

回到顶部

一:nginx缓存配置

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

nginx配置缓存的优点:可以在一定程度上,减少服务器的处理请求压力。比如对一些图片,css或js做一些缓存,那么在每次刷新浏览器的时候,就不会重新请求了,而是从缓存里面读取。这样就可以减轻服务器的压力。

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

客户端的缓存一般有如下两种方式实现:

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

在配置之前,我们来看下我们的项目基本架构如下:

复制代码

|----项目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 代码如下:

复制代码

{"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 代码如下:

复制代码

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 {# 开启gzipgzip 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这样的压缩,如下所示

github代码

这篇关于nginx缓存配置及开启gzip压缩的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/973004

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

mysql8.0.43使用InnoDB Cluster配置主从复制

《mysql8.0.43使用InnoDBCluster配置主从复制》本文主要介绍了mysql8.0.43使用InnoDBCluster配置主从复制,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录1、配置Hosts解析(所有服务器都要执行)2、安装mysql shell(所有服务器都要执行)3、

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

java程序远程debug原理与配置全过程

《java程序远程debug原理与配置全过程》文章介绍了Java远程调试的JPDA体系,包含JVMTI监控JVM、JDWP传输调试命令、JDI提供调试接口,通过-Xdebug、-Xrunjdwp参数配... 目录背景组成模块间联系IBM对三个模块的详细介绍编程使用总结背景日常工作中,每个程序员都会遇到bu

Java服务实现开启Debug远程调试

《Java服务实现开启Debug远程调试》文章介绍如何通过JVM参数开启Java服务远程调试,便于在线上排查问题,在IDEA中配置客户端连接,实现无需频繁部署的调试,提升效率... 目录一、背景二、相关图示说明三、具体操作步骤1、服务端配置2、客户端配置总结一、背景日常项目中,通常我们的代码都是部署到远程

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni