Nginx进阶之静态Web资源服务

版权声明:原创文章, 欢迎转载. https://blog.csdn.net/ip_JL/article/details/84226884

基础阶段回顾:

Nginx基础之简介与快速安装

Nginx基础之安装目录和配置语法详解

Nginx基础之配置文件nginx.conf

Nginx基础之官方模块

Nginx基础之请求限制

Nginx基础之访问控制

首先, nginx在客户和静态资源之间起到一个中间件的作用:

静态资源有哪些?

非服务器动态运行生成的文件:

类型 种类
浏览器端的渲染

HTML/CSS/JS

图片 JPEG/GIF/PNG
视频 FLV/MPEG
文件 TXT ...

静态资源服务场景-CDN(Content Delivery Network, 即内容分发网络):

上图就解决了长距离传输的延时问题.

模块

① 文件读取

systax: sendfile on | off;

default: sendfile off;

context: http域/server域/location域

② 提高传输效率

systax: tcp_nopush on | off;

default: tcp_nopush off;

context: http域/server域/location域

注: 在sendfile开启的情况下提升网络包的传输效率.

原理: 一次性将多个包整合一次性发送出去, 对于大文件尤为适用.

③ 无延迟/无等待发送

systax: tcp_nodelay on | off;

default: tcp_nodelay on;

context: http域/server域/location域

注: 在keepalive(长连接)的连接下提高网络传输的实时性.

④ 压缩

systax: gzip on | off;

default: gzip off;

context: http域/server域/location域

作用: 压缩传输

原理: Nginx压缩, 浏览器解压, 减少在传输过程中的带宽损耗.

压缩比

systax: gzip_comp_level [压缩级别];

default: gzip_comp_level 1;

context: http域/server域/location域

注: 压缩级别太大会极大的损耗服务器端的性能. 

压缩的HTTP协议版本

systax: gzip_http_version 1.0 | 1.1;

default: gzip_http_version 1.1;

context: http域/server域/location域

⑤ 扩展压缩

http_gzip_static_module    预读gzip功能

释义: 要压缩之前先查找对应文件的压缩文件, 如果存在, 则将资源返回, 达到减少性能损耗的作用.

http_gunzip_module          应用支持gunzip的压缩方式(解决gzip无法压缩的问题, 很少用到)

进入default.conf进行配置:

默认情况下请求图片:

访问: [ip地址]/wei.png

原图片的大小:

开启相应的配置:

原图片压缩后大小:

默认配置下请求文本:

访问: [ip地址]/access.png

原文本的大小:

开启配置后:

原文本压缩后大小: 效果非常好(nice)

默认情况下请求被压缩的文件:

访问: [ip]/download/test.bmp

提示找不到, 因为该路径下只有test.png.gz的压缩包.

开启配置:

同样的访问, 此时就会弹出下载框:

浏览器的缓存

HTTP协议定义的缓存机制(如: cache-control)

检验缓存是否过期的机制(HTTP1.1):

检验是否过期 Cache-Control(max-age)
协议中Etage头信息校验 Etage
Last-Modified头信息校验 Last-Modified

验证步骤:

跨域访问: 跨域访问并不安全, 容易出现CSRF(跨站式)攻击

用户正常访问网站A, 留下一些缓存... 此时不小心访问了网站B, 那么有可能会出现网站B让用户去访问网站A, 这就出现了CSRF.

开启跨域访问

头信息: Access-Control-Allow-Origin

这个头信息很重要, 因为浏览器一般是默认阻止跨域访问, 但是浏览器是根据判断服务器端是否有返回该头信息来作为是否阻止跨域访问的, 有该头信息, 则不阻止跨域访问.

systax: add_header [设置头的名称(此处就是Access-Control-Allow-Origin)] [设置头的值(此处的值代表允许具体哪个站点或者所有站点的跨域访问)] [always];

default: 无配置

context: http域/server域/location域

下面进入default.conf进行配置

test_cross_domain.html的内容:

由于我没有第二域名, 所以无法演示成功跨域访问的结果.

防盗链

目的: 防止资源被盗用.

设置思路: 区别哪些是正常的用户

http_refer模块

systax: valid_referers none | blocked | server_names | string ...;

default: 无配置

context: server域/location域

释义: valid_referers后面跟的参数的意思是 none: 无refer信息可通过/ blocked: 不是标准的"http://[域名]"可通过/ server_name: 指定特定的ip可通过/ string: 匹配表达式可通过(如: ~/google\./, 匹配谷歌的url可通过)

进入default.conf进行配置

此配置的意思是, 当referer满足"none" "blocked" "指定的ip"等条件后, if条件判断里面的变量值为0 不执行return语句, 反之判断的变量值为1, 则执行return语句, 返回403.

利用curl命令模拟访问, 此时的referer是空的返回的是200.

注: 参数"-I" 是只显示头信息

再来: 指定"https://baidu.com"为referer信息之后, 返回403

反之: 指定为本机ip之后, 返回200.

猜你喜欢

转载自blog.csdn.net/ip_JL/article/details/84226884