启用最新的 Nginx,php 以及应用 Brotli 压缩
作者:
最后更新于 | 最初发布于 | 分类: 服务器和主机
今天对 VPS 做了一些改动。就是安装了最新版本的 Nginx,Nginx v1.19.7。
davidyin@daisy:~$ nginx -V
nginx version: nginx/1.19.7
built with OpenSSL 1.1.1j 16 Feb 2021
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-qK5Rf9/nginx-1.19.7=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-compat --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_sub_module
在安装了 php 7.4.x 的同时也安装了 php 8.0.x,当前最新的版本是 v8.0.3
davidyin@daisy:~$ php -v
PHP 8.0.3 (cli) (built: Mar 5 2021 07:54:13) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.3, Copyright (c) Zend Technologies
with Zend OPcache v8.0.3, Copyright (c), by Zend Technologies
在里面可以查看 Brotli 的压缩方式也启用了。
davidyin@daisy:~$ brotli -V
brotli 1.0.9
为什么要使用 php 8.0?
这还用说么?大势所趋,JIT 都已经有了,更快更高更强啊。安装是用的 ppa:ondrej 的 PHP 库。
这里我要特别的记录一下,我启用 php8.0 的时候如何设置的 JIT。默认安装 php8.0 并不会自动启用 JIT,反而是关闭的。
如何设置启用 php 8.0 JIT
首先要先安装好 php 8.0。
然后,编辑 /etc/php/8.0/fpm/conf.d/10-opcache.ini
在尾部加上以下参数。
# Turn on the OPcache for command-line PHP, like drush or
# wp-cli, etc.
opcache.enable_cli=1
# 设置 JIT 运行需要的共享内存,一般设置为 opcahce 内存的一半,
# 或者更多。默认是零,自动禁用了 JIT。
opcache.jit_buffer_size=64M
# JIT 控制选项。 用字符串简单参数,或者是4位整数字高级选项。
# 高级参数参见 https://www.php.net/manual/en/opcache.configuration.php#ini.opcache.jit
# 简单参数是两种,tracing 或者 function
opcache.jit=tracing
修改参数之后,重启 php8.0-fpm 就可以了。
启用 php 8.0 的 JIT 之后,可以观察到,从浏览器访问一个 php 页面的时候,其等待页面返回的时间,或者说是 backend time 会减少 30%。这是测试 phpbb 论坛首页的时候的测试结果。平均 120ms 降低到 78ms。
为什么要使用 Brotli?
在2019年的时候,就做过了比较,Brotli 压缩同 Gzip 压缩之比较HTML 可以减少 17%
没有 minify 的 CSS 可以减少 30%
已经 minify 的 CSS 可以减少 27%
没有 minify 的 js 可以减少 30%
已经 minify 的 js 可以减少 19%
减少文件的大小,就减少了数据传输量,也就减少了数据传输时间。
现在的 Brotli 更加成熟,安装更加简单了,直接用 ppa:ondrej 的 nginx 库就行了。
如何启用 Brotli
当然也要先安装好 Brotli,包括命令行的 brotli。编辑 nginx 配置文件,
nano /etc/nginx/nginx.conf
添加下面一段,我一般放在 gzip 参数之前。 ## Brotli Settings
brotli on;
brotli_comp_level 5;
brotli_types text/plain text/css application/javascript application/json image/svg+xml application/xml+rss;
brotli_static on;
设置的参数同 gzip 很类似。通常可以设置压缩水平到 4,或者 5。这个值越大,需要耗费更多 CPU 时间压缩,可获得较小的文件。若设置太大了,造成耗时过多也不合适。其中有一条 brotli_static,这是设置静态文件预压缩的。比如一个 css 文件,并不会常变换,就可以预先压缩好,当用户请求该文件的时候,就不需要实时压缩,直接把预先压缩好的高压缩文件返回就可以。
比如这里有一个文件 blog.css,原始大小为 2.3KB,当没有预压缩,动态 brotli 压缩参数为 5,访问返回的文件为 1.75KB。
我采用一个命令
brotli -Zkf blog.css
这里三个参数, Z 表示用最大的压缩率,也就是压缩参数11, k 表示保留原始文件,f 表示覆盖。
运行命令后生成一个文件叫做 blog.css.br,文件大小只有 901Bytes,当用户访问 blog.css 的时候,Nginx 会先看有没有相对应的后缀名为 br 的文件,如果有,就直接返回了。所以这是预先压缩的好处。
当前服务器上同时装了 php 7.4 和 php 8.0,是因为目前还有很多 php 程序还没有兼容到 php8.0,还做不到完全使用 php 8.0,不过我想再有半年的时间,应该有很多程序都能做到兼容了。那时候,就可以舍弃 php 7.4 了。
对了,为了比较,减少其它方面的影响,把本站的 CDN 都去了。
相关的文章
- Brotli 压缩同 Gzip 压缩之比较
- 安装 Ubuntu 24.04 (LTS), Webmin, Nginx, MariaDB, PHP8.3-FPM,Perl-Fastcgi 到 DigitalOcean 的 VPS(3)
- 安装 Ubuntu 22.04 (LTS), Webmin, Nginx, MariaDB, PHP8.1-FPM,Perl-Fastcgi 到 DigitalOcean 的 VPS(3)
- 安装 Ubuntu 20.04, Webmin, Nginx, MariaDB, PHP7.4-FPM,Perl-Fastcgi 到 DigitalOcean 的 VPS(4)
- 安装 Ubuntu 20.04, Webmin, Nginx, MariaDB, PHP7.4-FPM,Perl-Fastcgi 到 DigitalOcean 的 VPS(3)
- Google 将忽略 Flash 内容, 不再收录 Flash,及其它
- Awstats 和 Nginx 日志格式的写法
- 安装 Ubuntu 18.04, Webmin, Nginx, MariaDB, PHP7.2-FPM,Perl-Fastcgi 到 Linode 的 VPS(3)