一 Nginx 静态资源概述
1.1 静态资源类型
Nginx 作为静态资源 web 服务器部署配置, 传输非常高效, 常常用于静态资源处理, 请求以及动静分离. 通常非服务器动态运行生成的文件属于静态资源.
类型 | 种类 |
浏览器端渲染 | |
图片 | JPEG、GIF、PNG |
视频 | FLV、MP4 |
文件 | TXT 及其他类型文件 |
1.2 静态资源场景
简单静态站点场景:
静态站点加速场景:
二 静态资源优化配置
2.1 sendfile
默认情况下, Nginx 会自行处理文件传输, 并在发送之前将文件复制到缓冲区中. 启用 sendfile 指令跳过了将数据复制到缓冲区的步骤, 并允许将数据从一个文件描述符直接复制到另一个文件描述符. 同时, 为了防止一个快速连接完全占用工作进程, 也可以使用 sendfile_max_chunk 指令限制单个 sendfile()调用中传输的数据量.
语法: sendfile on | off;
默认: sendfile off;
可配置段: http,server,location,if in location
配置示例:
- location /mp3 {
- #...
- sendfile on;
- sendfile_max_chunk 1m;
- #...
- }
- 2.2 tcp_nopush
将 tcp_nopush 指令与 sendfile on; 指令一起使用, 可以使 NGINX 在 sendfile()获取数据块之后立即在一个数据包中发送 HTTP 响应头. 即在 sendfile 开启情况下, 提高网络包的 "传输效率".
语法: tcp_nopush on | off;
默认: tcp_nopush off;
可配置段: http, server, location
配置示例:
- location /mp3 {
- #...
- sendfile on;
- tcp_nopush on;
- #...
- }
- 2.3 tcp_nodelay
tcp_nodelay 指令允许覆盖 Nagle 的算法, 该算法最初设计用于解决慢速网络中小数据包的问题. 该算法将许多小数据包合并为一个较大的数据包, 并以 200 毫秒的延迟发送数据包. 如今, 在提供大型静态文件时, 无论数据包大小如何, 都可以立即发送数据. 延迟也会影响在线应用程序(SSH, 在线游戏, 在线交易等). 默认情况下, tcp_nodelay 指令设置为 on, 这意味着禁用了 Nagle 的算法. 此指令仅用于 keepalive 连接. 因此 tcp_nodelay 提高网络包的 "实时性".
语法: tcp_nodelay on | off;
默认: tcp_nodelay on;
可配置段: http, server, location
配置示例:
- location /mp3 {
- #...
- tcp_nodelay on;
- keepalive_timeout 65;
- #...
- }
三 静态资源压缩选项
3.1 gzip 压缩配置
Nginx 将响应报文发送至客户端之前可以启用压缩功能, 这能够有效地节约带宽, 并提高响应至客户端的速度.
语法: gzip on | off;
默认值: gzip off;
可配置段: http, server, location, if in location
配置示例:
- location /mp3 {
- #...
- gzip on;
- #...
- }
3.2 gzip 压缩比配置
语法: gzip_comp_level level;
默认值: gzip_comp_level 1;
可配置段: http, server, location
配置示例:
- location /mp3 {
- #...
- gzip on;
- gzip_comp_level 6;
- #...
- }
提示:
过高的压缩比比较耗费服务端性能.
随着压缩级别的升高, 压缩比有所提高, 但到了级别 6 后, 很难再提高;
随着压缩级别的升高, 处理时间明显变慢;
gzip 很消耗 CPU 的性能, 高并发情况下 CPU 达到 100%.
3.3 gzip 压缩协议版本配置
语法: gzip_http_version 1.0 | 1.1;
默认值: gzip_http_version 1.1;
可配置段: http, server, location
配置示例:
- location /mp3 {
- #...
- gzip on;
- gzip_comp_level 6;
- gzip_http_version 1.1;
- #...
- }
提示: 也可不设置, 目前主流几乎都是 v1.1 版本协议.
3.4 gzip 预压缩配置
Nginx 的动态压缩是对每个请求先压缩再输出, 会造成服务端一定程度的 CPU 消耗, 因此可以利用 nginx 模块 Gzip Precompression 模块. 同时 nginx 默认安装 ngx_http_gzip_module, 采用的是 chunked 方式的动态压缩, 静态压缩需要使用 http_gzip_static_module 模块, 进行 pre-compress. 对需要压缩的文件, 直接读取已经压缩好的文件(文件名为加. gz), 而不是动态压缩, 对于不支持 gzip 的请求则读取原文件, 即预压缩.
语法: gzip_static on | off | always;
默认值: gzip_static off;
可配置段: http, server, location
配置示例:
- location /mp3 {
- #...
- gzip_static on;
- gzip_proxied expired no-cache no-store private auth;
- #..
- }
注意:
文件可以使用 gzip 命令来进行压缩, 或任何其他兼容的命令, 建议压缩文件和原始文件的修改日期和时间保持一致.
gzip_static 配置优先级高于 gzip.
开启 nginx_static 后, 对于任何文件都会先查找是否有对应的 gz 文件.
gzip_types 设置对 gzip_static 无效.
gzip static 默认适用 HTTP 1.1.
3.5 gzip_buffers 压缩缓冲配置
设置系统获取几个单位的缓存用于存储 gzip 的压缩结果数据流. 如果没有设置, 默认值是申请跟原始数据相同大小的内存空间去存储 gzip 压缩结果.
语法: gzip_buffers number size;
默认值: gzip_buffers 32 4k|16 8k;
可配置段: http, server, location
配置示例:
- location /mp3 {
- #...
- gzip_buffers 32 4k
- #...
- }
示例解释: 如上 32 4K 表示按照内存页 (one memory page) 大小以 4K 为单位(即一个系统中内存页为 4K), 申请 32 倍的内存空间.
3.6 gzip_disable 例外配置
针对特定的情况, 排除在压缩之外, 即不压缩.
语法: gzip_disable regex ...;
可配置段: http, server, location
配置示例:
- location /mp3 {
- #...
- gzip on;
- gzip_buffers 4 16k;
- gzip_comp_level 2;
- gzip_disable "MSIE [1-6]\.";
- #...
- }
示例释义: 关闭 IE6 及以下的浏览器压缩.
3.7 gzip_min_length 特定的大小压缩配置
当返回内容大于此值时才会使用 gzip 进行压缩, 单位为字节, 当值为 0 时, 所有页面都进行压缩.
语法: gzip_min_length length;
默认值: gzip_min_length 20;
可配置段: http, server, location
配置示例:
- location /mp3 {
- #...
- gzip on;
- gzip_buffers 4 16k;
- gzip_min_length 1k;
- gzip_comp_level 2;
- gzip_disable "MSIE [1-6]\.";
- #...
- }
3.8 gzip_types 压缩类型配置
语法: gzip_types mime-type ...;
默认值: gzip_types text/HTML;
可配置段: http, server, location
- location /myhome {
- #...
- gzip on;
- gzip_min_length 1k;
- gzip_buffers 4 16k;
- gzip_comp_level 2;
- gzip_types text/plain application/x-JavaScript text/CSS application/xml text/JavaScript application/x-httpd-PHP image/jpeg image/gif image/PNG;
- gzip_disable "MSIE [1-6]\.";
- #...
- }
3.9 gzip_proxied 反向代理压缩配置
Nginx 作为反向代理的时候启用, 开启或者关闭后端服务器返回的结果, 匹配的前提是后端服务器必须要返回包含 "Via" 的 header 头.
语法: gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
默认值: gzip_proxied off;
可配置段: http, server, location
参数释义:
off: 关闭所有的代理结果数据的压缩
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: 无条件启用压缩.
四 静态资源压缩配置
4.1 创建站点目录
[root@nginx ~]# mkdir /usr/share/nginx/gzip/
上传用于测试的 HTML,PNG,CSS 等文件, 提前查看文件大小.
4.2 配置虚拟主机
- [root@nginx ~]# vi /etc/nginx/conf.d/gzip.conf
- server {
- listen 80;
- server_name gzip.linuxds.com;
- sendfile on;
- access_log /var/log/nginx/gzip.access.log main;
- error_log /var/log/nginx/gzip.error.log warn;
- location / {
- root /usr/share/nginx/gzip;
- index index.HTML;
- gzip on;
- gzip_min_length 1k;
- gzip_buffers 4 16k;
- gzip_http_version 1.1;
- gzip_comp_level 2;
- gzip_disable "MSIE [1-6]\.";
- gzip_types text/plain application/JSON application/x-JavaScript application/JavaScript text/CSS application/CSS application/xml application/xml+rss text/JavaScript application/x-httpd-PHP image/jpeg image/gif imag
- e/PNG;
- }
- }
- [root@nginx ~]# nginx -t -c /etc/nginx/nginx.conf # 检查配置文件
- [root@nginx ~]# nginx -s reload # 重载配置文件
4.3 确认验证
使用 curl 测试站点是否启用 gzip:
- [root@imxhy ~]# curl -I -H "Accept-Encoding: gzip, deflate" "http://gzip.linuxds.com/css/test.css"
- [root@imxhy ~]# curl -I -H "Accept-Encoding: gzip, deflate" "http://gzip.linuxds.com/images/test.jpeg"
- [root@imxhy ~]# curl -I -H "Accept-Encoding: gzip, deflate" "http://gzip.linuxds.com/js/test.js"
也可通过 Chrome 浏览器, 开启 F12 开发者模式后访问: http://gzip.linuxds.com/css/test.css
提示: 同时可通过将 gzip_min_length 设置为 500k 再进行观察, 可知只有 test.PNG 和 test.JS, 两个大于 500k 的文件才会被压缩, CSS 不会进行压缩.
参考: https://www.cnblogs.com/xzkzzz/p/9224358.html
来源: https://www.cnblogs.com/itzgr/p/13295013.html