Mampatan permintaan adalah untuk memampatkan hasil pelayan melalui Nginx dan kemudian menghantarnya kepada pelanggan untuk mengurangkan tekanan penghantaran rangkaian dan meningkatkan kecekapan penghantaran.
Dua kaedah permintaan biasa ialah: gzip dan brotli (Google), yang bersamaan dengan brotli dan akan menjadi lebih cekap, seperti yang akan diterangkan secara terperinci kemudian.
Meminta pemampatan dibahagikan kepada: pemampatan dinamik dan pemampatan statik akan menyebabkan fail hantaran di dalam Nginx gagal. Untuk sesetengah kandungan yang tidak berubah, pemampatan statik boleh digunakan untuk meningkatkan kecekapan permintaan.
digunakan untuk memampatkan hasil permintaan Kedua-dua pelanggan dan pelayan perlu menyokong protokol pemampatan dan pelanggan menyahmampat data tersebut akan menduduki beberapa kecekapan prestasi di bahagian pelayan . Boleh mengurangkan tekanan penghantaran rangkaian.
Mampatan hanya berkuat kuasa untuk permintaan proksi.
Proses pelaksanaan ialah: klien menghantar permintaan ke pelayan, dan selepas nginx menerima permintaan, ia akan menghantar ia ke pelayan huluan Apabila menghantar permintaan, saluran rangkaian akan dibuat antara Nginx dan pelayan huluan, dan data akan dihantar antara mereka Jika operasi mampatan dihidupkan di sini, Nginx akan memampatkan data hasil dan mengembalikan data kepada klien. Apabila penyemak imbas menerima permintaan daripada nginx, ia akan memproses pengepala permintaan terlebih dahulu dan mendapati bahawa terdapat protokol mampatan Kemudian ia akan menentukan sama ada penyemak imbas semasa menyokong protokol tersebut data dan memaparkan data kepada pengguna.
Selepas menghidupkan pemampatan, pengguna akan menjadi tidak sensitif dan ia boleh mengurangkan tekanan penghantaran Namun, ia tidak disyorkan untuk memampatkan gambar dan video kerana saiz yang terhasil tidak banyak berubah untuk penghantaran rangkaian dan memerlukan sokongan pelanggan, bahagian pelayan juga perlu menyokong pemampatan data yang dihantar dan menjadikan data yang dihantar lebih kecil. Sudah tentu, semakin tinggi pemampatan, semakin lama masa penyahmampatan dan tekanan di bahagian pelayan.
Gzip ialah singkatan GNUzip, yang pertama kali digunakan untuk pemampatan fail dalam sistem UNIX. Pengekodan Gzip melalui protokol HTTP ialah teknologi yang digunakan untuk meningkatkan prestasi aplikasi web Pelayan web dan pelanggan (pelayar) mesti menyokong Gzip. Pada masa ini, penyemak imbas arus perdana: Chrome, Firefox, dll. semuanya menyokong protokol ini: Apache, Nginx dan IIS juga menyokong Gzip.
Nisbah mampatan Gzip adalah kira-kira 3-10 kali (teks biasa), yang boleh menjimatkan lebar jalur rangkaian pelayan. Dalam aplikasi sebenar, tidak semua fail dimampatkan, biasanya hanya fail statik (jscsshtml) yang dimampatkan. Fail seperti JPEG tidak dimampatkan dengan cukup baik dengan Gzip, dan pemampatan menggunakan sumber CPU.
Jadi bagaimanakah Gzip memampatkan? Ringkasnya, pemampatan Gzip mencari rentetan yang serupa dalam fail teks dan menggantikannya buat sementara waktu untuk menjadikan keseluruhan fail lebih kecil. Bentuk pemampatan ini sesuai untuk Web, kerana fail HTML dan CSS selalunya mengandungi sejumlah besar rentetan berulang seperti ruang, teg, dsb.
Modul gzip terbina dalam Nginx, jadi tidak perlu menambah lalai lain, cuma konfigurasi dan pasang Nginx .
Gunakan skop: http, pelayan, lokasi
Nginx dikonfigurasikan seperti berikut
gzip pada ;
Sama ada untuk mendayakan pemampatan.
Nilai lalai: gzip dimatikan secara lalai
gzip_buffers 32 4k | Saiz penimbal.
Nilai lalai: gzip_buffers 32 4k | 1-9, semakin besar bilangannya, semakin tinggi nisbah mampatan.
Lebih kecil kelajuan mampatan, lebih cepat kelajuan penyahmampatan dan lebih kecil nisbah mampatan
Nilai lalai: gzip_comp_leve 1
gzip_http_version 1.1
Versi http minimum menggunakan gzip.
gzip_min_length
Tetapkan panjang minimum respons yang akan dimampatkan gzip. Panjang ditentukan hanya oleh medan pengepala respons "Panjang Kandungan".
gzip_proxied multiple choice
Untuk pelayan huluan mengembalikan kepala yang berbeza untuk memutuskan sama ada hendak memampatkan, terdapat dua pilihan biasa: mati Mana-mana
Secara amnya, jika cache didayakan, ia telah dimampatkan, jadi beberapa butiran boleh dielakkan
dimatikan tidak terhad.
Apabila digunakan sebagai proksi terbalik, mampatkan maklumat pengepala yang dikembalikan oleh pelayan huluan.
tamat tempoh - Dayakan pemampatan, jika pengepala mengandungi maklumat pengepala "Tamat tempoh"
tiada cache - Dayakan pemampatan, jika pengepala mengandungi Mengandungi pengepala "Cache-Control:no-cache"
no-store - Mendayakan pemampatan jika pengepala mengandungi pengepala "Cache-Control:no-store"
peribadi - Dayakan pemampatan, jika pengepala mengandungi maklumat pengepala "Cache-Control:private"
no_last_modified - Dayakan pemampatan, jika pengepala tidak Mengandungi Maklumat pengepala "Terakhir Diubah Suai"
no_etag - Dayakan pemampatan, jika pengepala tidak mengandungi maklumat pengepala "ETag"
auth - Dayakan mampatan, jika pengepala mengandungi pengepala "Kebenaran"
sebarang - mampatan didayakan tanpa syarat.
gzip_vary pada ;
Tambahkan pengepala untuk disesuaikan dengan pelayar lama Vary: Accept-Encoding
gzip_types:
Jenis mime yang manakah dimampatkan.
gzip_disable:
Lumpuhkan penyemak imbas yang menggunakan gzip.
Adalah disyorkan untuk tidak mengkonfigurasi
Nilai lalai: gzip_disable 'msie6MSIE [4-6].MSIE 6.0'
location / { gzip off ; # 开启gzip压缩 gzip_buffers 32 4k ; # 设置缓冲区大小 gzip_comp_level 5; # 设置压缩等级 1-9 gzip_disable 'msie6MSIE [4-6]\.MSIE 6.0'; # 禁止哪些浏览器不使用压缩 gzip_http_version 1.1; # 设置压缩所需要的最低的http版本。 gzip_min_length 20 ; # 设置响应的数据最小限制,在这个限制之后再回进行压缩 gzip_vary on ; # 增加一个header ,适用于老的浏览器 Vary:Accept-Encoding gzip_proxied any; # 无条件启动压缩 # 哪些mime类型的文件进行压缩 #gzip_types text/plain application/x-javascript text/css application/xml; gzip_types text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml text/javascript application/javascript application/x-javascript text/x-json application/json application/x-web-app-manifest+json text/css text/plain text/x-component font/opentype application/x-font-ttf application/vnd.ms-fontobject image/x-icon; }
Apabila gzip dimulakan, permintaan kami pergi ke pelayan nginx dan nginx telah menghasilkan respons yang didengari untuk kami, tetapi data belum tersedia Dijana, dia tidak tahu berapa besar data tertentu, kerana nginx adalah permintaan tindak balas asynchronous Dia mula-mula menyediakan tajuk dan kemudian meminta kandungan untuk dimampatkan , dia menggabungkan dan memampatkan dua keping kandungan, dan akhirnya menghantarnya, maksudnya, dia tidak tahu saiz tertentu kerana sifat tidak segerak.
Dia mengembalikan pengepala permintaan dahulu dan kemudian membaca data dengan perlahan.
----------------------------------响应体------------------------------------------------- Connection: keep-alive Content-Encoding: gzip # 结果启动了gzip压缩 Content-Type: application/json # 响应结果 Date: Mon, 13 Feb 2023 09:13:19 GMT Keep-Alive: timeout=65 Server: nginx/1.20.2 Transfer-Encoding: chunked # 传输的格式这个对应的就是length,这个是他会发送一个一个的包,当最后一个包是0表示传输结束 Vary: Accept-Encoding ------------------------------------请求头----------------------------------------------- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 Cache-Control: max-age=0 Connection: keep-alive Host: 192.168.101.128 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36
Nota: Di atas ialah pemampatan dinamik, yang bermaksud bahawa semua permintaan akan mengalami pemampatan sekali Ini mempunyai kelemahan yang membawa maut iaitu ia tidak menyokong fail hantaran ialah salinan sifar data dan tidak akan memuatkan data ke dalam nginx, tetapi melalui antara muka rangkaian menghantar data, tetapi setelah pemampatan dinamik gzip dihidupkan, fail send akan menjadi tidak sah.
Apabila menggunakan Nginx berbilang lapisan, adalah disyorkan untuk mendayakan Gzip pada Nginx yang disambungkan ke pelayan Ini akan menyokong gzip, dan gzip akan didayakan pada mana-mana pelayan.
Mengapa menggunakan mampatan statik?
Pertama sekali, pemampatan dinamik tidak boleh menggunakan fail hantar, manakala pemampatan statik menyelesaikan masalah ini dengan sempurna.
Mampatan statik ialah fungsi pelengkap atau lanjutan Ia boleh memampatkan fail sumber yang diminta ke dalam pakej dimampatkan terlebih dahulu.
Pertama sekali, sumber statik mestilah lebih cekap daripada sumber dinamik Selepas pemampatan, saiz cakera boleh dikurangkan dan sumber saluran rangkaian juga boleh disimpan.
Apakah itu pemampatan statik
Mampatan statik tidak sesuai untuk proksi terbalik dan hanya sesuai untuk pelayan sumber Dia boleh menghantar fail yang dimampatkan kepada klien berada dalam sumber Akan ada fail sumber di bawah laluan dan pakej termampat dengan nama yang sepadan. Dan Nginx akan memberi keutamaan untuk mencari pakej termampat dan menghantar data secara terus melalui sendfile.
Nginx menghantar fail termampat melalui rangkaian, dan kemudian apabila penyemak imbas menerima fail pakej termampat yang dihantar oleh Nginx, ia menyahmampatkannya. Dia akan menghantar antara muka pakej termampat kepada pelanggan sebelum menghantarnya kepada pelanggan.
3. Konfigurasi
Modul http_gzip_static_module membenarkan penghantaran fail pramampat dengan sambungan fail "", .gz dan bukannya fail biasa. Modul ini tidak dibina secara lalai, ia harus didayakan menggunakan parameter konfigurasi --with-http_gzip_static_module. Modul ini tiada dalam pakej yang telah dikompilasi dan perlu ditambah secara manual Fungsi modul ini adalah untuk menyahmampat pakej termampat
dengan modul dalaman dan add ialah modul luaran.
Gunakan
./configure --prefix==/usr/local/nginx --with-hhtp_gzip_static_module
buat && buat pemasangan
sudah Selepas memasang nginx, gunakan arahan
./configure --prefinx==/usr/local/nginx --with-http_gzip_static_module
buat semasa menaik taraf klien nginx Jangan buat pemasangan jika tidak, ia akan ditimpa . Fail sebelumnya
Salin program nginx objs ke /usr/local/nginx/sbin·, sila ambil perhatian bahawa anda perlu menyandarkan program nginx asal.
Sintaks: gzip_static dimatikan |.
Nilai parameter:
使用的需要将本地的资源文件进行压缩 ,压缩成 xxx.gz的文件
cd /usr/local/nginx/html gzip *
注意:开启之后默认就会先访问 .gz 的文件了,如果不支持 静态压缩则会访问 正常文件,如果没有正常的文件只有 .gz 那么就会报错 。
4. nginx_http_gunzip_module 模块
这个模块是配合 gzip_static always时使用的 ,因为 当配置程 always 时,所有的请求会都进行找压缩文件,在文件存不存在或者说浏览器支不支持 静态压缩,nginx都会将静态压缩文件返回给浏览器,如果浏览器不支持的话会导致文件解不开,也就是 404 。
这个模块它没有在预编译的包里,需要手动添加,这个模块的作用就是把静态的压缩包解压开,他会在发送给客户端之前将压缩包接口在发送给客户端,它相当于是一层拦截器,它的作用就是可以把源文件进行压缩,我们可以把源文件进行删除了,节省磁盘空间,但是一般会用到。
注意 : with 是内部 、 add 是外部的
安装命令 :
./configure --prefix=/usr/local/nginx --add-module=/tools/nginx-sticky --with-http_gzip_static_module --with-http_gunzip_module
make
如果是替换的话,则将这个文件中的这个文件 cp 到 nginx的安装目录下的 sbin
移动命令:
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old2 cd /tools/nginx/objs mv nginx /usr/local/nginx/sbin/
这里没有gzip,但也没有 context-length 因为nginx需要把文件解压缩,他也不知道具体文件有多大,这个 gzip_static 适用场景 :在作为cdn服务器或者 cdn上游服务器文件存储服务器时,我们就可以把本地原始文件删了,只展示zip 包,把解压缩的压力丢弃给客户端 , 同时可以把本地压缩等级,提高不是 gzip的压缩等级 ,经常高配访问的一些页面 css js ,也可以通过 static压缩。
静态压缩 响应结果会有 Context-Encoding : gzip 、Conten-Length:392 有展示 context-length 表示他开启了静态压缩,预压缩直接返回zip包 没有源文件 ,1.速度快,2节省服务器资源。
Brotli 是 Google 推出的开源压缩算法,通过变种的 LZ77 算法、Huffman 编码以及二阶文本建模等方式进行数据压缩,与其他压缩算法相比,它有着更高的压缩效率,性能也比我们目前常见的 Gzip 高17-25%,可以帮我们更高效的压缩网页中的各类文件大小及脚本,从而提高加载速度,提升网页浏览体验。需要说明的是 Brotli 压缩只在 https 下生效,因为 在 http 请求中 request header 里的 Accept-Encoding: gzip, deflate 是没有 br 的。
Brotli 如此高的压缩比率,得益于其使用一个预定义的字典,该字典包含超过 13000 个来自文本和 HTML 文档的大型语料库的常用字符串,预定义的算法可以提升较小文件的压缩密度,而压缩与解压缩速度则大致不变。
Brotli 凭借它优异的压缩性能迅速占领了市场,从下图可以看到,除了 IE 和 Opera Mini 之外,几乎所有的主流浏览器都已支持 Brotli 算法,因此处于资源占用的考虑,比如说流量,建议启用:
Brotil 规范由 Google 员工 Jyrki Alakuijala 和 Zoltan Szabadka 于 2013-2016开发,并伴随着规范的俩个作者Evgenii Kuliuchniko 和 Lode Vandevenne共同开发的参考实现,后者之前开发了谷歌的zopfli在2013年重新实现了收缩 /gzip 压缩格式。与zopfli不同,后者是对现有数据格式规范的重新实现,Brotli 是一种新的数据格式,并允许作者进一步提高压缩比。
Brotli 的编码器提供了 12 个质量级别 (从 0 到 11)。它们是压缩速度换取压缩效率的压缩模式:更高质量的几倍速度较慢,但会产生更好的压缩比。
一个 Brotli 压缩文件由 元块(meta-blocks)集合组成。每个元块最多可容纳 16 MiB,由俩部分组成:一个 数据部分(data part),它存储 LZ77 压缩的放入快,以及一个 标题(header),每个块的压缩遵循经典的 ①LZ77 压缩方案并由 ②计算具有良好的LZ77解析和计算 LZ 短语的简洁编码这俩个主要阶段组成。
它效率高是因为内置了 n多个字典,包含都是一些常见的文件文件 css 、js 等等一些标签,如果我们将这些标签归类生成一个字典之后,我们就可以按照序号去解压这个文件了。
并且它在 Nginx 中话是可以和 Gzip 共存,开启了Brotli 不会导致 Gzip失效,如果浏览器支持brotli 那么优先使用 Brotli ,不支持在使用 Gzip。
--add-dynamic-module表示动态的引入模块在配置文件中还需要单独加入 load_module path/xxx
官网
https://github.com/google/ngx_brotli
https://codeload.github.com/google/brotli/tar.gz/refs/tags/v1.0.9
下载 俩个项目
解压缩
brotli-1.0.9 是 brotli 算法模块,需要先解压。
tar -zxvf brotli-1.0.9.tar.gz
ngx_brotli-1.0.0rc 是nginx的 brotli的模块。这模块里需要引入 brotli 算法模块
tar -zxvf ngx_brotli-1.0.0rc.tar.gz
接下来讲 brotli 的内容全部 复制到 ngx_brotli 的 deps/brotli/目录
cd /tools/brotli-1.0.9
cp -r * /tools/ngx_brotli-1.0.0rc/deps/brotli/
模块化编译 :
./configure --with-compat --add-dynamic-module=/tools/ngx_brotli-1.0.0rc --prefix=/usr/local/nginx/
或
--add-dynamic-module=brotli目录
加载所有的压缩模块
./configure --with-compat --add-dynamic-module=/tools/ngx_brotli-1.0.0rc --prefix=/usr/local/nginx/ --add-module=/tools/nginx-sticky --with-http_gzip_static_module --with-http_gunzip_module
make && make install
下载的两个模块 拷贝到 /usr/local/nginx/modules/
首先在 /usr/local/nginx创建一个modules文件夹 mkdir modules
mv ngx_http_brotli_filter_module.so ngx_http_brotli_static_module.so /usr/local/nginx/modules/
最后将新编译的 nginx 启动程序复制到 /usr/local/nginx/sbin下 做好之前程序复制。
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.oid3
mv /tools/nginx-12.0/objs/nginx /usr/local/nginx/sbin/
在配置文件中动态加载模块
load_module "/usr/local/nginx/modules/ngx_http_brotli_filter_module.so"; load_module "/usr/local/nginx/modules/ngx_http_brotli_static_module.so";
具体的配置选项可以查看GitHub: https://github.com/google/ngx_brotli
brotli的配置可以参考Gzip的配置,几乎一致。
brotli
语法:brotli on | off
默认值 :brotli off
适用于: http、server、location、if
作用:开启或者禁用brotli 压缩功能。
brotli_static
语法:brotli_static on | off | always
默认值:brotli_static off
适用于:http、server、location
作用:brotli 也是支持预先压缩文件,启用或禁用检查是否存在带扩展名的预压缩文件.br 。使用该always值,在所有情况下都使用预压缩文件,而不检查客户端是否支持它。
brotli_types
语法:brotli_types
默认值:brotli_types text/html
适用于: http、server、location
作用:指定哪些资源类型需要进行压缩操作,特殊值*匹配任何 MIME类型。
brotli_buffers
语法:brotli_buffers
默认值: 32 4k | 16 8 k
适用于: http、server、location
作用:设置压缩缓冲区大小,最新版本以及弃用了 。
brotli_comp_level
语法:brotli_comp_level
默认值 :6'
适用于 : http、server、location
作用 : 设置即时压缩 Brotli 质量(压缩)level。0可接受的值在从到 的范围内11。
brotli_window
语法:brotli_window
默认值 : 512k
适用于 :http、server、 location
作用:设置 Brotli 窗口size。可以比作是一个桌子,将要压缩的文件同时放在这个桌子上,这个桌子上可以放多少文件的大小,这个值也不越大越好,他比较占内存,值增加建议是2的倍数,可接受的值为1k, 2k, 4k, 8k, 16k, 32k, 64k, 128k, 256k, 512k, 1m, 2m,和4m。8m 16m
brotli_min_length
语法:brotli_min_length
默认值:20
适用于: http、server、location
作用:指定进行压缩的文件最小的长度,如果小于这个值则不压缩。
#加载动态模块 load_module "/usr/local/nginx/modules/ngx_http_brotli_filter_module.so"; load_module "/usr/local/nginx/modules/ngx_http_brotli_static_module.so"; worker_processes 1; events { worker_connections 1024; } http { server { listen 80; server_name localhost; location / { #brotli配置 brotli on; # 开启 压缩 brotli_static on; # 是否开启预先压缩,开启之后就会 .br的压缩包 brotli_comp_level 6; # 压缩等级 brotli_buffers 16 8k; # 缓冲区大小 ,已经启用 brotli_min_length 20; # 压缩时文件最小限制 # 对哪些mime.types类型进行压缩 brotli_types text/plain text/css text/javascript application/javascript text/xml application/xml application/xml+rss application/json image/jpeg image/gif image/png; } } }
因为默认 brotli 是必现 https 请求才能使用的,因为 http的请求 请求头的 Accept-Encoding 是没有 br的,所以服务器是无法知道客户端可以使用的。
测试方案:
使用 linux 的 curl 命令 :
curl -H 'Accept-Encding : br' -I 192.168.101.128/index.html
[root@localhost sbin]# curl -H Accept-Encoding:br -I http://192.168.101.128/static_page.html HTTP/1.1 200 OK Server: nginx/1.20.2 Date: Fri, 17 Feb 2023 08:11:05 GMT Content-Type: text/html Last-Modified: Fri, 17 Feb 2023 03:28:14 GMT Connection: keep-alive Keep-Alive: timeout=65 Vary: Accept-Encoding ETag: W/"63eef44e-31" Content-Encoding: br [root@localhost sbin]# curl -I http://192.168.101.128/static_page.html HTTP/1.1 200 OK Server: nginx/1.20.2 Date: Fri, 17 Feb 2023 08:11:54 GMT Content-Type: text/html Last-Modified: Fri, 17 Feb 2023 03:28:14 GMT Connection: keep-alive Keep-Alive: timeout=65 Vary: Accept-Encoding ETag: W/"63eef44e-31"
Atas ialah kandungan terperinci Bagaimana untuk melaksanakan pemampatan permintaan Nginx. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!