Wave Spread...

Linux 运维手册之 NGINX 性能优化及注意事项

分类:Linux 评论: 0

NGINX 的性能优化是网站体验中重要的一环,在机器性能一定的情况下,参数优化能明显提高网站加载速度。

NGINX 性能优化

系统级优化

文件句柄数限制了系统打开文件的最大限制,在访问用户多的情况下就会导致可用资源枯竭,因此需要优化。

vi /etc/security/limits.conf

添加以下两行(添加至文件末尾)

* soft nofile 51200
* hard nofile 51200

配置级优化

资源优化参数

语法:sendfile
选项:on / off
默认:关闭
语段:http, server, location, if in location

实例配置

location /video/ {
    sendfile       on;
    tcp_nopush     on;
    aio            on;
}

此选项可优化磁盘 I/O,不阻塞磁盘读写,会发送一个消息提示所需资源不在内存中,然后读取文件的前 128K 字节 (取决于 read_ahead 参数)来启动异步数据加载。

语法:tcp_nopush
选项:on / off
默认:关闭
语段:http, server, location

实例配置

location /video/ {
    sendfile       on;
    tcp_nopush     on;
    aio            on;
}

此选项启用或禁用在 UNIX 上使用 TCP_NOPUSH 套接字选项或在 Linux 上使用 TCP_CORK 套接字选项。仅在使用 sendfile 时才启用这些选项。

启用该选项允许在 UNIX/Linux 中发送响应头和文件的开头,然后以完整数据包发送文件。

语法:aio
选项:on | off | threads[=pool]
默认:关闭
语段:http, server, location

实例配置

location /video/ {
    aio            on;
    directio       512;
    output_buffers 1 128k;
}

此选项启用或禁用在FreeBSD和Linux上使用异步文件 I/O(AIO)

资源传输参数

使用 Gzip 压缩参数可以压缩资源,节约传输流量及带宽。

语法:gzip
选项:on | off
默认:关闭
语段:http, server, location, if in location

是否启用数据压缩,默认情况下不使用。

语法:gzip_comp_level level
选项:level
默认:gzip_comp_level 1
语段:http, server, location

数据压缩比率(等级),等级越高,压缩率越高,相应地消耗处理器资源也越高。

语法:gzip_http_version
选项:1.0 | 1.1
默认:1.1
语段:http, server, location

使用压缩的协议,默认是 1.1。

实例配置

    location ~ .*\.(jpg|gif|png)$ {
        gzip on;
        gzip_http_version 1.1;
        gzip_comp_level 2;
        gzip_types text/plain application/json application/x-javascript application/css application/xml application/xml+rss text/javascript application/x-httpd-php image/jpeg image/gif image/png;
        root /static/img;

小贴士:不推荐在压缩比低的资源中使用压缩功能,节约的带宽有限,但是会明显提高系统资源的占用,得不偿失。

除了 Gzip 之外,还有一个更好的压缩方式 Brotli。

Brotli 是基于LZ77算法的一个现代变体、霍夫曼编码和二阶上下文建模。Google软件工程师在2015年9月发布了包含通用无损数据压缩的Brotli增强版本,特别侧重于HTTP压缩。其中的编码器被部分改写以提高压缩比,编码器和解码器都提高了速度,流式API已被改进,增加更多压缩质量级别。

与常见的通用压缩算法不同,Brotli使用一个预定义的120千字节字典。该字典包含超过13000个常用单词、短语和其他子字符串,这些来自一个文本和HTML文档的大型语料库。预定义的算法可以提升较小文件的压缩密度。

使用Brotli替换Deflate来对文本文件压缩通常可以增加20%的压缩密度,而压缩与解压缩速度则大致不变。

Brotli is a generic-purpose lossless compression algorithm that compresses data using a combination of a modern variant of the LZ77 algorithm, Huffman coding and 2nd order context modeling, with a compression ratio comparable to the best currently available general-purpose compression methods. It is similar in speed with deflate but offers more dense compression.

此功能在原生 NGINX 中没有包含,需要自行重新编译,安装需要用到开发工具(编译环境)

CentOS 如下

# yum groups install 'Development Tools'

Debian 如下

# apt install autoconf libtool automake

本文以 CentOS 7 为例进行演示,其他发行版请自行修改路径及软件包。

安装 libbrotli

# cd /usr/local/src/
# git clone https://github.com/bagder/libbrotli
# cd libbrotli
# ./autogen.sh
# ./configure
# make && make install

安装 ngx_brotli

# cd /usr/local/src/
# git clone https://github.com/google/ngx_brotli
# cd ngx_brotli && git submodule update --init

安装 nginx

# cd /usr/local/src
# wget http://nginx.org/download/nginx-1.14.0.tar.gz
# tar xf nginx-1.14.0.tar.gz

查询当前编译参数

[root@domain ~]# nginx -V
nginx version: nginx/1.14.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'

在参数最后添加编译参数 --add-module=/usr/local/src/ngx_brotli

开始编译

cd /usr/local/src/nginx-1.14.0
./configure [参数]
make && make install

配置参数

    brotli on;
    brotli_comp_level 6;
    brotli_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;

添加位置和参数功能与 Gzip 一致

检查是否生效

打开你的网页,用浏览器开发者工具调试,在 Network 选项中,发现有 content-encoding:br

可能的报错

nginx: error while loading shared libraries: libbrotlienc.so.1: cannot open shared object file: No such file or directory

解决方法是把对应的库文件在 /lib(64) 或者 /usr/lib(64) 中做上软链接:

# 64 bit
$ ln -s /usr/local/lib/libbrotlienc.so.1 /lib64
# 32 bit
$ ln -s /usr/local/lib/libbrotlienc.so.1 /lib

NGINX 其他优化

禁止使用 IP 访问

背景:

Q:为什么要禁止ip访问页面呢?
A:这样做是为了避免他人把未备案的域名解析到自身服务器 IP ,而导致服务器被断网,防止此类事情的发生。

方案:

1)在 server 段里插入正则,例如:

listen       80;
server_name  www.domain.com;
if ($host != 'www.domain.com') {
    return 403;
}

2)添加一个 server 主机,例如:

server {
    listen 80 default;
    server_name _;
    return 403;
}

在一般情况下使用方案二比较简单,若域名申请了证书并配置了 HTTPS ,请使用 方案一。且在 443 主机内也需要配置。

除了配置文件外,架构上的优化也很明显,特别对于高负载的场景下。

架构性优化

此部分在此省略,在相关链接中有详细介绍。

安全性优化


相关链接


参考链接

回复