Nginx静态资源web服务

静态文件存储

静态资源即非服务器动态运行生成的文件:浏览器端渲染(HTML,CSS,JS),图片,视频,文件等

静态资源服务场景:CDN
将每个Nginx当成一个节点,其中有一个作为资源存储中心,其他节点通过动态资源回源获取资源,客户端请求静态资源时可以通过就近的服务器进行获取

配置语法:

  • 文件读取
# 可以配置在http,server,location,if in location,默认是off
# 指定是否使用sendfile系统调用来传输文件
sendfile on|file

sendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝

  • tcp_nopush
# 配置在http,server,location中,默认是off
# sendfile开启的情况下,把多个包进行整合,减少多次请求时间,提高网络包的传输效率
# 适用于大文件,实时性要求不高的情况
tcp_nopush on|off
  • tcp_nodelay
# 配置在http,server,location中,默认on
# keepalive连接下,表示不延迟发送,提高网络包的传输实时性,用于实时性要求较高的场景
tcp_nodelay on|off
  • 压缩
# 配置在http,server,location,if in location,默认off
# 用于对文件压缩传输,减少带宽和时间
gzip on|off

# 配置在server,location
# 压缩级别,默认比例为1,越高表示压的越小,但是对服务器的压力就越大
gzip_comp_level level

# 配置在server,location
# 控制http协议等的版本,默认是1.1
gzip_http_version 1.0|1.1

# 压缩的类型
gzip_types text/plain application/javascript applicaton/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
  • 压缩模块
  1. http_gzip_static_module:预读gzip功能,在硬盘中查找是否已经存在请求所需要静态资源的gzip文件,如果有直接返回,减少服务器压力。但是事先需要通过gzip命令压缩好存入到硬盘
Syntax:
gzip_static on|off|always;
Default:
gzip_static off;
Context:
http,server,location
  1. http_gunzip_module:对于一些不支持gzip的浏览器使用gunzip压缩方式,一般比较少用

浏览器缓存原理

客户端浏览器会对请求后的响应进行缓存,缓存存在校验过期机制:

  • 检验缓存是否过期:通过本地缓存文件中HTTP头信息的Expires(HTTP1.0),Cache-Control(max-age)(HTTP1.1)
  • 协议中Etag头信息校验:在本地缓存过期之后,向服务器发送Etag信息(一串特殊的字符串)来检验服务器响应是否有更新,如果没有则304重定向,继续使用缓存
  • Last-Modified头信息校验:同样在浏览器本地缓存过期后,向服务器发送Last-Modified信息(最后更新的时间,精确到秒),来检验是否有更新,如果没有则304重定向,继续使用缓存

第一次请求:

第二次请求:

Nginx配置HTTP缓存过期时间

通过expires进行配置,为响应添加Cache-Control,Expires头

# 配置在http,server,location,if in location,默认是off
expires [modified] time;
expires epoch|max|off;

# 例如设置24小时
expires 24h;

Nginx跨域访问

跨域访问指的是在一个页面中同时访问多个不同的域名,默认情况下浏览器是禁止的,其目的是防止CSRF攻击

Nginx可以通过add_header设置允许跨域访问,其中允许跨域的头信息是Access-Control-Allow-Origin

# 配置在http,server,location,if in location
# name 表示HTTP头名字
# value 指定站点域名
# always 表示配置多个站点
add_header name value [always];

配置示例:

# 表示允许全部站点
add_header 'Access-Control-Allow-Origin' '*';  
# 为true的时候指请求时可带上Cookie           
add_header 'Access-Control-Allow-Credentials' 'true';
# 表示允许哪些方式
add_header 'Access-Control-Allow-Methods' 'POST,GET,OPTION,DELETE';
# 允许的请求头
add_header 'Access-Control-Allow-Headers' 'X-Requested-With,Authorization';

防盗链

防盗链用于防治网站资源被盗用,其设置思路主要是区别哪些请求是非正常的用户请求
Nginx中可以通过http_refer模块进行防盗链配置

HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。

# 可以配置在server,locatin
# 表示指定refer信息
# none:表示Refer为空的情况
# blocked:表示“Referer”字段出现在请求标头中,但其值已被防火墙或代理服务器删除;这些值是不以“http://”或“https://”开头的字符串;
# server_name:域名
# string:定义服务器名称和可选的URI前缀。服务器名称的开头或结尾可以有“*”。在检查期间,忽略“Referer”字段中的服务器端口;
# 同时还可以使用正则表达式:第一个符号应为“~”。应该注意的是,表达式将与在“http://”或“https://”之后开始的文本匹配。
valid_referers none|blokced|server_name|string ...;

valid_referers代表可信referer,此处可信referer的设置将会使变量$invalid_referer的值为0,反之$invalid_referer的值为1,则执行IF条件名并返回相关限制结果。
配置示例:

valid_referers none blocked 127.0.0.1;
# 不再上面范围内的,不允许访问
if($invalid_referer){
    return 403;
}