启用最新的 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 的文件,如果有,就直接返回了。所以这是预先压缩的好处。
brotli-help.jpg


当前服务器上同时装了 php 7.4 和 php 8.0,是因为目前还有很多 php 程序还没有兼容到 php8.0,还做不到完全使用 php 8.0,不过我想再有半年的时间,应该有很多程序都能做到兼容了。那时候,就可以舍弃 php 7.4 了。

对了,为了比较,减少其它方面的影响,把本站的 CDN 都去了。



搜索
关于
David Yin
研究(SEO)搜索引擎优化排名和(PPC)竞价排名技术,总结搜索营销学的各种方法和趋势。专业SEO优化研究,致力于搜索引擎优化技术的普及和推广。
David Yin
Email:seo[AT]g2soft.net
版权说明
如果想转载,而又不明白转载的条件,请看本站的详细版权说明
推荐
Dreamhost Hosting
使用优惠码“save252015”,节省更多,每月只要 $2.59。
归档
标签云
热门标签