侧边栏壁纸
博主头像
LYMTICS

海纳百川,有容乃大

  • 累计撰写 45 篇文章
  • 累计创建 37 个标签
  • 累计收到 19 条评论

目 录CONTENT

文章目录

Nginx学习笔记(三):静态资源部署

LYMTICS
2022-02-13 / 0 评论 / 0 点赞 / 72 阅读 / 5,742 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-02-13,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Nginx学习笔记(三):静态资源部署

学习资源:

静态资源配置优化

  • sendfile on;
  • tcp_nopush on;
  • tcp_nodeplay on;

具体原理还需自己学习,原理图:

image

语法sendfile on |off;
默认值sendfile off;
位置http、server、location...
作用用来开启高效的文件传输模式。
语法tcp_nopush on|off;
默认值tcp_nopush off;
位置http、server、location
作用用来提升网络包的传输'效率'
备注该指令必须在sendfile打开的状态下才会生效
语法tcp_nodelay on|off;
默认值tcp_nodelay on;
位置http、server、location
作用提高网络包传输的'实时性'
备注该指令必须在keep-alive连接开启的情况下才生效

静态资源压缩

相应的模块:

  • ngx_http_gzip_module模块
  • ngx_http_gzip_static_module模块
  • ngx_http_gunzip_module模块

Gzip配置指令

gzip

语法gzip on|off;
默认值gzip off;
位置http、server、location...
作用用于开启或者关闭gzip功能

gzip_types

语法gzip_types mime-type ...;
默认值gzip_types text/html;
位置http、server、location
作用根据响应页的MIME类型选择性地开启Gzip压缩功能

图片等资源本身就高度压缩了,再压缩也没用,还浪费时间

gzip_comp_level

语法gzip_comp_level level;
默认值gzip_comp_level 1;
位置http、server、location
作用用于设置Gzip压缩程度
说明级别从1-9, 1表示要是程度最低

压缩等级越高资源越小,但是越耗时,越占用CPU资源

gzip_vary

语法gzip_vary on|off;
默认值gzip_vary off;
位置http、server、location
作用设置使用Gzip进行压缩发送是否携带“Vary:Accept-Encoding”头域的响应头部
说明主要是告诉接收方,所发送的数据经过了Gzip压缩处理

image

gzip_buffers

语法gzip_buffers number size;
默认值gzip_buffers 32 4k|16 8k;
位置http、server、location
作用用于处理请求压缩的缓冲区数量和大小
说明number:指定Nginx服务器向系统申请缓存空间个数
size指的是每个缓存空间的大小

这个值的设定一般会和服务器的操作系统有关,所以建议此项不设置,使用默认值即可。

gzip_disable

语法gzip_disable regex ...;
默认值
位置http、server、location
作用针对不同种类客户端发起的请求,可以选择性地开启和关闭Gzip功能

根据客户端的浏览器标志(user-agent)来设置,支持使用正则表达式。指定的浏览器标志不使用Gzip。该指令一般是用来排除一些明显不支持Gzip的浏览器。

gzip_disable "MSIE [1-6]\.";

gzip_http_version

语法gzip_http_version 1.0|1.1;
默认值gzip_http_version 1.1;
位置http、server、location
作用针对不同的HTTP协议版本,可以选择性地开启和关闭Gzip功能
说明该指令一般采用默认值即可

gzip_min_length

语法gzip_min_length length;
默认值gzip_min_length 20;
位置http、server、location
作用针对传输数据的大小,选择性地开启和关闭Gzip功能
nignx计量大小的单位:bytes[字节] / kb[千字节] / M[兆]
例如: 1024 / 10k|K / 10m|M

Gzip压缩功能对大数据的压缩效果明显,但是如果要压缩的数据比较小的化,可能出现越压缩数据量越大的情况,因此我们需要根据响应内容的大小来决定是否使用Gzip功能,响应页面的大小可以通过头信息中的Content-Length来获取。但是如果使用了Chunk编码动态压缩,该指令将被忽略。建议设置为1K或以上。

gzip_proxied

语法gzip_proxied off|expired|no-cache|
no-store|private|no_last_modified|no_etag|auth|any;
默认值gzip_proxied off;
位置http、server、location
作用设置是否对服务端返回的结果进行Gzip压缩

off - 关闭Nginx服务器对后台服务器返回结果的Gzip压缩
expired - 启用压缩,如果header头中包含 "Expires" 头信息
no-cache - 启用压缩,如果header头中包含 "Cache-Control:no-cache" 头信息
no-store - 启用压缩,如果header头中包含 "Cache-Control:no-store" 头信息
private - 启用压缩,如果header头中包含 "Cache-Control:private" 头信息
no_last_modified - 启用压缩,如果header头中不包含 "Last-Modified" 头信息
no_etag - 启用压缩 ,如果header头中不包含 "ETag" 头信息
auth - 启用压缩 , 如果header头中包含 "Authorization" 头信息
any - 无条件启用压缩

Gzip压缩功能的实例配置

gzip on;  			  #开启gzip功能
gzip_types *;		  #压缩源文件类型,根据具体的访问资源类型设定
gzip_comp_level 6;	  #gzip压缩级别
gzip_min_length 1024; #进行压缩响应页面的最小长度,content-length
gzip_buffers 4 16K;	  #缓存空间大小
gzip_http_version 1.1; #指定压缩响应所需要的最低HTTP请求版本
gzip_vary  on;		  #往头信息中添加压缩标识
gzip_disable "MSIE [1-6]\."; #对IE6以下的版本都不进行压缩
gzip_proxied  off; #nginx作为反向代理压缩服务端返回数据的条件

这些配置在很多地方可能都会用到,所以我们可以将这些内容抽取到一个配置文件中,然后通过include指令把配置文件再次加载到nginx.conf配置文件中,方法使用。

nginx_gzip.conf

gzip on;
gzip_types *;
gzip_comp_level 6;
gzip_min_length 1024;
gzip_buffers 4 16K;
gzip_http_version 1.1;
gzip_vary  on;
gzip_disable "MSIE [1-6]\.";
gzip_proxied  off;

nginx.conf

include nginx_gzip.conf

Gzip和sendfile共存

开启sendfile以后,在读取磁盘上的静态资源文件的时候,可以减少拷贝的次数,可以不经过用户进程将静态文件通过网络设备发送出去,但是Gzip要想对资源压缩,是需要经过用户进程进行操作的。所以如何解决两个设置的共存问题?:

gzip_static

语法gzip_static on | off | always;
默认值gzip_static off;
位置http、server、location

如果提示没有相关的包,可以通过之前讲的方式进行更新,其中携带的参数如下:

./configure --with-http_gzip_static_module

静态资源缓存

原理

**浏览器缓存:**是为了节约网络的资源加速浏览,浏览器在用户磁盘上对最近请求过的文档进行存储,当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样就可以加速页面的阅览.

HTTP协议中有若干和页面缓存相关的字段:

header说明
Expires缓存过期的日期和时间
Cache-Control设置和缓存相关的配置信息
Last-Modified请求资源最后修改时间
ETag请求变量的实体标签的当前值,比如文件的MD5值

指令

expires

语法expires [modified] time
expires epoch|max|off;
默认值expires off;
位置http、server、location
作用用来控制页面缓存
控制HTTP应答中的“Expires"和”Cache-Control"

time: 可以整数也可以是负数,指定过期时间,如果是负数,Cache-Control则为no-cache,如果为整数或0,则Cache-Control的值为max-age=time;

epoch: 指定Expires的值为'1 January,1970,00:00:01 GMT'(1970-01-01 00:00:00),Cache-Control的值no-cache

max: 指定Expires的值为'31 December2037 23:59:59GMT' (2037-12-31 23:59:59) ,Cache-Control的值为10年

off: 默认不缓存

add_header

语法add_header name value [always];
默认值
位置http、server、location...
作用用来添加指定的响应头和响应值

Cache-Control作为响应头信息,可以设置如下值:

缓存响应指令:

Cache-control: must-revalidate
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: public
Cache-control: private
Cache-control: proxy-revalidate
Cache-Control: max-age=<seconds>
Cache-control: s-maxage=<seconds>
指令说明
must-revalidate可缓存但必须再向源服务器进行确认
no-cache缓存前必须确认其有效性
no-store不缓存请求或响应的任何内容
no-transform代理不可更改媒体类型
public可向任意方提供响应的缓存
private仅向特定用户返回响应
proxy-revalidate要求中间缓存服务器对缓存的响应有效性再进行确认
max-age=<秒>响应最大Age值
s-maxage=<秒>公共缓存服务器响应的最大Age值

max-age=[秒]:

资源跨域问题

同源有三个条件:

  1. 协议
  2. 域名(IP)
  3. 端口

跨域解决

add_header

使用add_header指令,该指令可以用来添加一些头信息

语法add_header name value...
默认值
位置http、server、location

此处用来解决跨域问题,需要添加两个头信息:

  1. Access-Control-Allow-Origin
  2. Access-Control-Allow-Methods

案例:

location /getUser{
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE;
    default_type application/json;
    return 200 '{"id":1,"name":"TOM","age":18}';
}

防盗链

valid_referers

语法valid_referers none|blocked|server_names|string...
默认值
位置server、location
  • none: 如果Header中的Referer为空,允许访问

  • blocked: 在Header中的Referer不为空,但是该值被防火墙或代理进行伪装过,如不带"http://" 、"https://"等协议头的资源允许访问

  • server_names: 指定具体的域名或者IP

  • string: 可以支持正则表达式和*的字符串。如果是正则表达式,需要以~开头表示,例如

    location ~*\.(png|jpg|gif){
               valid_referers none blocked www.baidu.com 192.168.200.222 *.example.com example.*  www.example.org  ~\.google\.;
               if ($invalid_referer){
                    return 403;
               }
               root /usr/local/nginx/html;
    
    }
    

案例:

location /images {
           valid_referers none blocked www.baidu.com 192.168.200.222 *.example.com example.*  www.example.org  ~\.google\.;
           if ($invalid_referer){
                return 403;
           }
           root /usr/local/nginx/html;

}

遇到的问题:Referer的限制比较粗,比如随意加一个Referer,上面的方式是无法进行限制的。那么这个问题改如何解决?

此处我们需要用到Nginx的第三方模块ngx_http_accesskey_module,后面再学。

0

评论区