一、gzip
(1)配置语法
Syntax: gzip on|off;
Default:gzip off;
Context: http, server, location, if in location;
作用:压缩传输
Syntax: gzip_comp_level level;
Default:gzip_comp_level 1;
Context: http, server, location;
作用:gzip压缩比,最小1,处理速度最快;最大9,但处理最慢(传输快但比较消耗cpu)
Syntax: gzip_http_version 1.0|1.1;
Default:gzip_http_version 1.1;
Context: http, server, location;
作用:控制gzip http协议的版本,当前主流版本1.1
(2)示例演示
- 步骤一
opt/ app/code/images
下添加一张图片bg.jpg,用于演示图片压缩
opt/ app/code/doc
下添加一access.txt,用于演示文本压缩 - 步骤二
vi/etc/nginx/conf.d/static_server.conf
,创建static_server.conf 配置文件,配置以下内容:
-
步骤三
浏览器访问图片,启动配置和不启动配置大小皆为1.09MB?? 说明配置并未生效,暂时不知为何。。。。。
二、浏览器缓存场景
(1)浏览器缓存原理
校验规则如下图所示:
- Expires和Cache-Control类似,区别在于Expires适用于HTTP1.0版本,而Cache-Control 适用于HTTP 1.1版本。max-age用于定义本地缓存的有效时间。
- 本地缓存失效后,优先向服务器进行Etag验证,Etag记录的是一串字符串,Last-Modified记录的是一个精确到秒的时间。
(2)配置语法expires
Syntax: expires [modified] time;
Default:expires off;
Context: http, server, location, if in location;
作用:添加 Cache-Control, Expires头
(3)演示示例
先看一下服务器端未作缓存配置的情况下的请求结果。
下图为清除缓存后首次请求的结果:状态码200。
下图为刷新后的结果:状态码304。 我们发现,请求头中多了一行Cache-Control:"max-age=0"
,这里需要注意了,这个Cache-Control头信息是浏览器加进去的,而不是服务器返回的,max-age=0(或小于0),表示每次请求都需要去和服务器进行校验,比较last-Modified,如果有更新则返回200,否则返回304。
接下来在服务器端做缓存配置:
- 步骤1
touch /etc/nginx/conf.d/static_server.conf
,创建static_server.conf 配置文件 - 步骤2
vi /etc/nginx/conf.d/static_server.conf
, 在static_server.conf 中配置以下内容,配置的缓存失效时间为24h
- 步骤3
下图为清除缓存后首次请求的结果:可以看到,响应头中被写入了Cache-Control:"max-age=86400"
, 这说明我们的配置已经成功了(86400的单位为秒,等于我们配置的24h)。
下图为刷新后的结果:这里需要注意的是,虽然我们在服务端的配置成功写入了响应头,但是客户端不一定会遵循服务端配置,这里浏览器使用了自己的Cache-Contorl:"max-age=0", 即每次请求都需要去和服务器校验Etag和Last-Modified;
三、跨域
浏览器会去读取服务器返回的Access-Confrol-Allow-Origin头信息,判断是否可以访问。默认情况下,浏览器禁止跨域访问,因为跨域访问不安全,容易出现CSRF攻击(Cross-site request forgery,跨站请求伪造)。
但实际中出于一些业务需求,需要允许跨站访问。
(1)Nginx允许跨站访问的配置语法:
Syntax:add_header name value [always];
Default:--;
Context: http, server, location, if in location;
(2)配置示例
location ~ .*\.(htm|html)$ {
add_header Access-Control-Allow-Origin http://www.candy.com;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
root /opt/app/code;
}
以上配置表示允许来自http://www.candy.com
的GET,POST,PUT,DELETE,OPTIONS跨域请求。
location ~ .*\.(htm|html)$ {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
root /opt/app/code;
}
以上配置表示允许所有站点的请求。
四、防盗链
防止网站资源被盗用。首要方式:区别哪些请求是非正常的用户请求。
(1)什么是 HTTP_REFERER
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。以下演示什么是http_referer。
新建test_refer.html 文件,该html中访问了一张图片
浏览器访问test_refer.html,可以看到发起了两个请求
tail -f /var/log/nginx/access.log
查看访问日志,可以看到两条请求日志,第一条请求请求的是test_refer页面, $http_referer
变量值为 空 ;第二条请求请求的是图片,$http_referer
变量值为http://192.168.122.1/test_refer.html
, 表明该请求是从哪里过来的。
(2)http_refer防盗链配置模块语法
Syntax:valid_referers none | blocked | server_names | string...;
Default:--;
Context: server, location;
-
步骤一,携带 refer信息的请求
curl -e "http://www.baidu.com" -I http://192.168.122.1/bg.jpg
, ( 其中-e
参数表示来源网址,- I
参数表示只看头信息数据)
以下为生成的日志信息,可以看到,状态为200,refer 为http://www.baidu.com
步骤二, 修改配置文件
修改配置vi /etc/nginx/conf.d/default.conf
(注意,if 后要加空格)
配置释意:
valid_referers
后面接允许访问的refer信息类型
none
表示允许没有带refer 信息的请求
blocked
表示允许referer信息不是标准的http:// 域名
的访问
192.168.122.1
表示只允许通过该ip的请求
若请求头不满足valid_referers
中的设置,则 $invalid_referer
的值为1,返回403。
- 步骤三,携带 refer信息的请求
重新执行curl -e "http://www.baidu.com" -I http://192.168.122.1/bg.jpg
, 返回结果403,说明配置生效了。