资源优化

sendfile指令

  1. 用来开启高效的文件传输模式。
  2. 可以在 http、server、location 位置。
  3. 语法:sendfile on/off。默认值 sendfile off。
  4. sendfile指令能避免静态资源文件从内核缓冲区拷贝到用户缓冲区,又从用户缓冲区拷贝到Socket缓冲区。
server {
    listen 80;
    server_name localhost;

    sendfile on;

    location / {
        root html;
        index index.html;
    }
}

tcp_nopush指令

  1. 该指令必须在sendfile打开的状态下才会生效,主要是用来提升网络包的传输’效率’。
  2. 该指令开启只要缓冲区有数据就会发送给客户端,而不需要等待缓冲区满了才发送。
  3. 可以在 http、server、location 位置。
  4. 语法:tcp_nopush on/off。默认值 tcp_nopush off。
server {
    listen 80;
    server_name localhost;

    sendfile on;
    tcp_nopush on;

    location / {
        root html;
        index index.html;
    }
}

tcp_nodelay指令

  1. 该指令必须在keep-alive连接开启的情况下才生效,来提高网络包传输的’实时性’。
  2. 可以在 http、server、location 位置。
  3. 该指令开启时数据是先存在缓冲区的,等待缓冲区满了再发送给客户端。
  4. 语法:tcp_nodelay on/off。默认值 tcp_nodelay on。
server {
    listen 80;
    server_name localhost;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    location / {
        root html;
        index index.html;
    }
}

资源压缩

  1. 以下指令都来自ngx_http_gzip_module模块,该模块会在nginx安装的时候内置到nginx的安装环境中。

gzip指令

  1. 用于开启或者关闭gzip功能。
  2. 可以在 http、server、location 位置。
  3. 语法:gzip on/off。默认值 gzip off。
server {
    listen 80;
    server_name localhost;

    gzip on;

    location / {
        root html;
        index index.html;
    }
}

gzip_types指令

  1. 该指令可以根据响应页的MIME类型选择性地开启Gzip压缩功能。
  2. 可以在 http、server、location 位置。
  3. 语法:gzip_types mime-type …。默认值 gzip_types text/html。
  4. 所选择的值可以从mime.types文件中进行查找,也可以使用"*“代表所有。
server {
    listen 80;
    server_name localhost;

    gzip on;
    # 多个使用空格隔开
    gzip_types text/plain text/css application/json application/javascript text/xml;

    location / {
        root html;
        index index.html;
    }
}

gzip_comp_level指令

  1. 该指令用于设置Gzip压缩程度,级别从1-9,1表示要是程度最低,要是效率最高,9刚好相反,压缩程度最高,但是效率最低最费时间。
  2. 可以在 http、server、location 位置。
  3. 语法:gzip_comp_level level。默认值 gzip_comp_level 1。
server {
    listen 80;
    server_name localhost;

    gzip on;
    # 多个使用空格隔开
    gzip_types text/plain text/css application/json application/javascript text/xml;
    gzip_comp_level 6; # 6是个不错的中间值

    location / {
        root html;
        index index.html;
    }
}

gzip_vary指令

  1. 该指令用于设置使用Gzip进行压缩发送是否携带“Vary:Accept-Encoding”头域的响应头部。主要是告诉接收方,所发送的数据经过了Gzip压缩处理。
  2. 可以在 http、server、location 位置。
  3. 语法:gzip_vary on/off。默认值 gzip_vary off。
server {
    listen 80;
    server_name localhost;

    gzip on;
    # 多个使用空格隔开
    gzip_types text/plain text/css application/json application/javascript text/xml;
    gzip_comp_level 6; # 6是个不错的中间值
    gzip_vary on;

    location / {
        root html;
        index index.html;
    }
}

gzip_buffers指令

  1. 该指令用于处理请求压缩的缓冲区数量和大小。
  2. 可以在 http、server、location 位置。
  3. 语法:gzip_buffers number size。默认值 gzip_buffers 32 4k|16 8k。
  4. 其中number:指定Nginx服务器向系统申请缓存空间个数,size指的是每个缓存空间的大小。
  5. 主要实现的是申请number个每个大小为size的内存空间。
server {
    listen 80;
    server_name localhost;

    gzip on;
    # 多个使用空格隔开
    gzip_types text/plain text/css application/json application/javascript text/xml;
    gzip_comp_level 6; # 6是个不错的中间值
    gzip_vary on;
    gzip_buffers 16 8k;

    location / {
        root html;
        index index.html;
    }
}

gzip_disable指令

  1. 针对不同种类客户端发起的请求,可以选择性地开启和关闭Gzip功能。
  2. 可以在 http、server、location 位置。
  3. 语法:gzip_disable regex …
  4. regex:根据客户端的浏览器标志(user-agent)来设置,支持使用正则表达式。指定的浏览器标志不使用Gzip.该指令一般是用来排除一些明显不支持Gzip的浏览器。
server {
    listen 80;
    server_name localhost;

    gzip on;
    # 多个使用空格隔开
    gzip_types text/plain text/css application/json application/javascript text/xml;
    gzip_comp_level 6; # 6是个不错的中间值
    gzip_vary on;
    gzip_buffers 16 8k;
    gzip_disable "msie6"; # 禁用IE6的gzip压缩,因为它有bug

    location / {
        root html;
        index index.html;
    }
}

gzip_http_version指令

  1. 针对不同的HTTP协议版本,可以选择性地开启和关闭Gzip功能。
  2. 可以在 http、server、location 位置。
  3. 语法:gzip_http_version 1.0|1.1。默认值 gzip_http_version 1.1。
  4. 该指令是指定使用Gzip的HTTP最低版本,该指令一般采用默认值即可。
server {
    listen 80;
    server_name localhost;

    gzip on;
    # 多个使用空格隔开
    gzip_types text/plain text/css application/json application/javascript text/xml;
    gzip_comp_level 6; # 6是个不错的中间值
    gzip_vary on;
    gzip_buffers 16 8k;
    gzip_disable "msie6"; # 禁用IE6的gzip压缩,因为它有bug
    gzip_http_version 1.1;

    location / {
        root html;
        index index.html;
    }
}

gzip_min_length指令

  1. 该指令针对传输数据的大小,可以选择性地开启和关闭Gzip功能。
  2. 可以在 http、server、location 位置。
  3. 语法:gzip_min_length length。默认值 gzip_min_length 20。
  4. Gzip压缩功能对大数据的压缩效果明显,但是如果要压缩的数据比较小的化,可能出现越压缩数据量越大的情况,因此我们需要根据响应内容的大小来决定是否使用Gzip功能。建议设置为1K或以上。单位:bytes[字节] / kb[千字节] / M[兆]。
server {
    listen 80;
    server_name localhost;

    gzip on;
    # 多个使用空格隔开
    gzip_types text/plain text/css application/json application/javascript text/xml;
    gzip_comp_level 6; # 6是个不错的中间值
    gzip_vary on;
    gzip_buffers 16 8k;
    gzip_disable "msie6"; # 禁用IE6的gzip压缩,因为它有bug
    gzip_http_version 1.1;
    gzip_min_length 2M;

    location / {
        root html;
        index index.html;
    }
}

gzip_proxied指令

  1. 该指令设置是否对服务端返回的结果进行Gzip压缩。
  2. 可以在 http、server、location 位置。
  3. 语法:gzip_proxied off|expired|no-cache|no-store|private|no_last_modified|no_etag|auth|any
  4. 默认值:gzip_proxied off。
    • 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 - 无条件启用压缩
server {
    listen 80;
    server_name localhost;

    gzip on;
    # 多个使用空格隔开
    gzip_types text/plain text/css application/json application/javascript text/xml;
    gzip_comp_level 6; # 6是个不错的中间值
    gzip_vary on;
    gzip_buffers 16 8k;
    gzip_disable "msie6"; # 禁用IE6的gzip压缩,因为它有bug
    gzip_http_version 1.1;
    gzip_min_length 2M;
    gzip_proxied off;

    location / {
        root html;
        index index.html;
    }
}

小结

  1. 这些配置在很多地方可能都会用到,所以我们可以将这些内容抽取到一个配置文件中,然后通过include指令把配置文件再次加载到nginx.conf配置文件中。
include nginx_gzip.conf
  1. 开启sendfile以后,在读取磁盘上的静态资源文件的时候,可以减少拷贝的次数,可以不经过用户进程将静态文件通过网络设备发送出去,但是Gzip要想对资源压缩,是需要经过用户进程进行操作的。可以使用ngx_http_gzip_static_module模块(手动加载)的gzip_static指令来解决。压缩文件也需要我们手动压缩好。
  2. 语法:gzip_static on | off | always

资源缓存

  1. 缓存的优点:减少网络带宽消耗、降低服务器压力、减少网络延迟,加快页面打开速度。
  2. HTTP协议中和页面缓存相关的字段。
——–header——– 说明
Expires 缓存过期的日期和时间
Cache-Control 设置和缓存相关的配置信息
Last-Modified 请求资源最后修改时间
ETag 请求变量的实体标签的当前值,比如文件的MD5值

expires指令

  1. 该指令用来控制页面缓存的作用。可以通过该指令控制HTTP应答中的“Expires"和”Cache-Control”。
  2. 可以在 http、server、location 位置。
  3. 语法:默认值 expires off。
    • epoch: 指定Expires的值为'1 January,1970,00:00:01 GMT’(1970-01-01 00:00:00),Cache-Control的值no-cache
    • 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:默认不缓存。
expires [modified] time

expires epoch|max|off;
server {
    listen 80;
    server_name localhost;

    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 30d; # 缓存30天
        add_header Cache-Control "public, no-transform"; # 添加缓存控制头
    }
}

add_header指令

  1. 用来添加指定的响应头和响应值。
  2. 可以在 http、server、location 位置。
  3. 语法:add_header name value [always]
server {
    listen 80;
    server_name localhost;

    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 30d; # 缓存30天
        add_header Cache-Control "public, no-transform"; # 添加缓存控制头
    }
}

跨域

  1. 同源策略:是一种约定,是浏览器最核心也是最基本的安全功能,如果浏览器少了同源策略,则浏览器的正常功能可能都会受到影响。
  2. 有两台服务器分别为A,B,如果从服务器A的页面发送异步请求到服务器B获取数据,如果服务器A和服务器B不满足同源策略,则就会出现跨域问题。
  3. 同源:协议、域名(IP)、端口相同即为同源。
http://192.168.200.131/user/1
https://192.168.200.131/user/1
不同源

http://192.168.200.131/user/1
http://192.168.200.132/user/1
不同源

http://192.168.200.131/user/1
http://192.168.200.131:8080/user/1
不同源

http://www.nginx.com/user/1
http://www.nginx.org/user/1
不同源

http://192.168.200.131/user/1
http://192.168.200.131:8080/user/1
不同源

http://www.nginx.org:80/user/1
http://www.nginx.org/user/1
同源
  1. add_header 指令,添加允许跨域标识。
    • Access-Control-Allow-Origin**: 直译过来是允许跨域访问的源地址信息,可以配置多个(多个用逗号分隔),也可以使用*代表所有源。
    • Access-Control-Allow-Methods:直译过来是允许跨域访问的请求方式,值可以为 GET POST PUT DELETE…,可以全部设置,也可以根据需要设置,多个用逗号分隔。
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}';
}

防盗链

  1. HTTP的头信息Referer,当浏览器向web服务器发送请求的时候,一般都会带上Referer,来告诉浏览器该网页是从哪个页面链接过来的。
  2. 后台服务器可以根据获取到的这个Referer信息来判断是否为自己信任的网站地址,如果是则放行继续访问,如果不是则可以返回403(服务端拒绝访问)的状态信息。

valid_referers 指令

  1. nginx会通就过查看referer自动和valid_referers后面的内容进行匹配,如果匹配到了就将$invalid_referer变量置0,如果没有匹配到,则将$invalid_referer变量置为1,匹配的过程中不区分大小写。
  2. 可以在 server、location 中。
  3. 语法:valid_referers none|blocked|server_names|string…
    • none: 如果Header中的Referer为空,允许访问。
    • blocked:在Header中的Referer不为空,但是该值被防火墙或代理进行伪装过,如不带"http://" 、“https://“等协议头的资源允许访问。
    • server_names:指定具体的域名或者IP。
    • string: 可以支持正则表达式和*的字符串。如果是正则表达式,需要以~开头表示,例如
# 防盗链配置
location ~* \.(jpg|jpeg|png|gif)$ {
    # 设置一个referrer白名单,只有referrer是以下域名之一的请求才会被允许
    valid_referers none blocked heliu.site *.heliu.site;

    # 如果referrer不在白名单中,返回一个错误图片或者重定向
    if ($invalid_referer) {
        # 返回一个错误图片
        return 403;
        # 或者你可以选择重定向到一个错误页面或者图片
        # rewrite ^/ http://yourdomain.com/403.jpg last;
    }

    # 如果referrer有效,正常服务静态文件
    try_files $uri /helium.png;
}
location ~*\.(png|jpg|gif){
    valid_referers none blocked www.baidu.com 192.168.1.222 *.example.com example.*  www.example.org  ~\.google\.;

    if ($invalid_referer){
            return 403;
    }
    root /usr/local/nginx/html;
}
  1. 针对目录进行防盗链。
# images 目录
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;
}
  1. 更严格的防盗链参看nginx第三方模块ngx_http_accesskey_module