技术教程 · 2020年2月29日 0

如何在CentOS 8的Nginx中启用Brotli压缩

Brotli是Google研发的通用无损压缩算法,是Gzip,Zopfli和Deflate的替代产品,它结合了LZ77算法的现代变体,霍夫曼编码和二阶上下文建模以及压缩功能,对数据进行压缩比率可与目前最好的通用压缩方法相媲美。它的速度与放气相似,但压缩更紧密。

Brotli是根据MIT许可证开源的。

Nginx没有官方支持,但是有一个由Google开发的名为ngx_brotli的第三方模块,您可以利用该模块为Nginx添加支持。

本教程将向您展示如何在CentOS 8服务器上向Nginx Web服务器添加Brotli支持。

注意: 本指南将以 “johndoe”作为示例用户”和 “ ” 作为示例域。请根据您的姓名替换它们。example.com

要求

  • CentOS 8服务器
  • Nginx版本1.11.5或更高版本
  • 带有A/ AAAA记录的域名
  • TLS证书

初始步骤

检查您的CentOS版本:

cat /etc/centos-release
# CentOS Linux release 8.0.1905 (Core)

设置时区:

timedatectl list-timezones
sudo timedatectl set-timezone 'Region/City'

更新您的操作系统软件包(软件)。这是重要的第一步,因为它可以确保您具有操作系统默认软件包的最新更新和安全修复程序:

sudo dnf update -y

安装一些基本软件包,这些软件包是CentOS操作系统的基本管理所必需的:

sudo dnf install -y curl wget vim git unzip socat bash-completion epel-release socat && sudo dnf groupinstall "Development Tools"

步骤1-安装Acme.sh并从Let’s Encrypt获得TLS证书

Brotli要求您设置和使用HTTPS。在这一部分中,我们将从Let’s Encrypt获得可信证书。

下载并安装Acme.sh:

sudo mkdir /etc/letsencrypt
git clone https://github.com/Neilpang/acme.sh.git
cd acme.sh
sudo ./acme.sh --install --home /etc/letsencrypt --accountemail your_email@example.com
cd ~
source ~/.bashrc

检查版本:

acme.sh --version
# v2.8.6

取得RSA和ECDSA证书 example.com:

# RSA 2048
sudo /etc/letsencrypt/acme.sh --issue --standalone --home /etc/letsencrypt -d example.com --accountemail your_email@example.com --ocsp-must-staple --keylength 2048
# ECDSA/ECC P-256
sudo /etc/letsencrypt/acme.sh --issue --standalone --home /etc/letsencrypt -d example.com --accountemail your_email@example.com --ocsp-must-staple --keylength ec-256

运行上述命令后,您的证书和密钥将位于以下位置:

  • RSA: /etc/letsencrypt/example.com
  • ECC / ECDSA: /etc/letsencrypt/example.com_ecc

第2步–从官方Nginx存储库安装Nginx

您需要从官方Nginx存储库下载并安装最新的主线Nginx :

安装先决条件:

sudo yum install yum-utils

要设置yum存储库,请创建包含以下内容的文件/etc/yum.repos.d/nginx.repo:

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

默认情况下,使用稳定的nginx软件包的存储库。我们需要使用主线nginx软件包。运行以下命令以使用主线源:

sudo yum-config-manager --enable nginx-mainline

要安装nginx,请运行以下命令:

sudo yum install -y nginx

检查Nginx版本:

sudo nginx -v
# nginx version: nginx/1.17.8

启用并启动Nginx服务:

sudo systemctl enable nginx.service
sudo systemctl start nginx.service

步骤3 –下载并编译Brotli源代码

安装Nginx之后,我们需要将Brotli模块(ngx_brotli)构建为动态Nginx模块。从Nginx版本1.11.5起,可以编译单个动态模块,而无需编译完整的Nginx软件。在接下来的几个步骤中,我们将动态构建Brotli模块,而无需编译完整的Nginx。

下载最新版本的主线Nginx源代码并解压缩:

wget https://nginx.org/download/nginx-1.17.8.tar.gz && tar zxvf nginx-1.17.8.tar.gz

注意: Nginx软件包的版本号和Nginx源代码相匹配非常重要。如果从官方Nginx存储库安装了Nginx 1.17.8,则必须下载相同版本的源代码 1.17.8。

去掉 nginx-1.17.8.tar.gz:

rm nginx-1.17.8.tar.gz

ngx_brotli从GitHub 克隆:

git clone https://github.com/google/ngx_brotli.git
cd ngx_brotli && git submodule update --init && cd ~

导航到Nginx源代码目录:

cd ~/nginx-1.17.8

下载所需的库:

sudo dnf install -y pcre pcre-devel zlib zlib-devel openssl openssl-devel

将其编译ngx_brotli为动态模块,并将其复制到Nginx模块的标准目录中,/etc/nginx/modules:

./configure --with-compat --add-dynamic-module=../ngx_brotli
make modules
sudo cp objs/*.so /etc/nginx/modules

列出其中的文件/etc/nginx/modules,您将看到ngx_http_brotli_filter_module.so和ngx_http_brotli_static_module.so:

ls /etc/nginx/modules

将644所有.so文件的权限设置为:

sudo chmod 644 /etc/nginx/modules/*.so

步骤4 –配置Nginx

我们准备在Nginx中配置Brotli支持。

运行sudo vim /etc/nginx/nginx.conf并在文件顶部添加以下两个指令以加载新的Brotli模块:

load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;

测试配置:

sudo nginx -t

为其创建文档根目录,example.com并index.html在其中创建一些内容:

sudo mkdir -p /var/www/example.com
sudo -s
echo "Hello from example.com" >> /var/www/example.com/index.html
exit

为创建虚拟主机 example.com:

sudo vim /etc/nginx/conf.d/example.com.conf

用以下配置填充它:

server {
  listen 80;
  server_name example.com; # Replace with your domain name
  return 301 https://$server_name$request_uri;
}

server {    
  listen 443 ssl http2;
  server_name example.com; # Replace with your domain name

  root /var/www/example.com; # Replace with your document root

  # RSA
  ssl_certificate /etc/letsencrypt/example.com/fullchain.cer;
  ssl_certificate_key /etc/letsencrypt/example.com/example.com.key;
  # ECDSA
  ssl_certificate /etc/letsencrypt/example.com_ecc/fullchain.cer;
  ssl_certificate_key /etc/letsencrypt/example.com_ecc/example.com.key;

  brotli on;
  brotli_static on;
  brotli_types text/plain text/css text/javascript application/javascript text/xml application/xml image/svg+xml application/json;
}

测试配置:

sudo nginx -t

重新加载Nginx:

sudo systemctl reload nginx.service

在网络浏览器中访问您的网站,然后打开开发者工具的“网络”标签。您将Content-Encoding: br在响应标题中看到。这表明Brotli压缩正在起作用。

Nginx中的Brotli支持

内容编码

而已。您已在CentOS 8系统上启用了Brotli压缩。

原文:https://www.howtoforge.com/how-to-enable-brotli-compression-in-nginx-on-centos-8/