基础阶段回顾:
首先, 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.