CentOS 7 上安装 LEMP (四):性能优化

本节内容主要参考了:https://tweaked.io/guide/nginx/

Nginx 是一款小而快地 Web 服务器,但仍有优化的余地。

一般性优化

  • 恰当设置 worker_processes 的值
    Nginx 使用固定数量的 Worker,每个 Worker 都会参与请求的处理。一般的经验是把 Worker 的数量设置为与服务器的 CPU 内核数相同。
    取得 CPU 内核数的方法如下:
$ grep ^processor /proc/cpuinfo | wc -l

四核处理器的配置类似这样:

# 每个处理器一个 Worker
worker_processes  4;

events {
    worker_connections  8096;
    multi_accept        on;
    use                 epoll;
}

http {
    # Your content here ..
}
  • 调高 worker_connections
    worker_connections 是每个 Worder 同一时间能够处理连接的最大数。
    默认值比较小,设置的合理值可以通过以下命令取得:

    $ ulimit -n

    你服务器可以处理的最大连接数即为: worker_processes * worker_connections

  • 激活 multi_accept
    使 Nginx 尽可能多的接受连接
  • 使用吞吐量比较好的 epoll 事件模式

压缩
提到性能优化,很多人第一个想到的就是激活 Nginx 的 gzip 模块,压缩向客户端传递文件的尺寸,提升加载速度。

但执行压缩也是要消耗服务器资源的,太频繁的压缩还会事得其反,这需要一个权衡。
比较好的方式是只压缩那些大文件,避免压缩那些不容易降低尺寸的东西(例如图片,可执行文件,二进制文件等)。

下面配置比较明智:

server {
    # Compression
    gzip  on;
    gzip_vary on;
    gzip_min_length 10240;
    gzip_proxied expired no-cache no-store private auth;
    gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml;
    gzip_disable "MSIE [1-6]\.";
}

只对 10K 以上的文件进行压缩,低版本的 IE 不压缩,只压缩文本文件。

使用 GZip Test 可以检测 GZip 是否工作。

客户端缓存
设置缓存是提升性能的另一主要手段,比较简单的方式就是声明图片等资源在某一时期不变。

server {
    location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
        access_log     off;
        log_not_found  off;
        expires        30d;
    }
}

这里我们屏蔽了媒体文件的 Log 输出,配置了图片、CSS 等 30 天有效。
如果 CSS 变更频繁的话可以缩短下这个时间。

文件句柄缓存
如果你提供的服务含有大量静态文件,那么缓存被访问文件的句柄是个好办法,避免文件被重复访问重复开启。

注意:
你应该在不编辑这些文件、而只是向外提供服务时启用这个。
因为 404 和文件尺寸都会被缓存,编辑文件的话看不到最新效果。

下面是个好例子,可以放在 server 或 http 块:

open_file_cache          max=2000 inactive=20s;
open_file_cache_valid    60s;
open_file_cache_min_uses 5;
open_file_cache_errors   off;

这个配置块告诉服务器缓存 2000 个打开的文件句柄,20 秒不使用将关闭。
缓存 60 秒有效,文件被访问 5 次后才被缓存。

最终的结果是被频繁访问的文件被缓存起来,减少了文件系统的访问。

优化 PHP
通过两步优化 PHP:
1. 使用 Unix domain-socket 连接 FPM(这个在第二章已经介绍)
2. 设置 fastcgi 缓存

server {
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        fastcgi_buffer_size 128k;
        fastcgi_buffers 256 16k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;

        include fastcgi_params;
    }
}

缓冲区尺寸(Buffer Size)
缓冲区尺寸太低,Nginx 会写入临时文件,从而导致过多的磁盘 I/O 操作。

http {
    client_body_buffer_size      128k;
    client_max_body_size         10m;
    client_header_buffer_size    1k;
    large_client_header_buffers  4 4k;
    output_buffers               1 32k;
    postpone_output              1460;
}

client_body_buffer_size:处理客户端缓冲区尺寸。大多数客户端缓冲区来自 Post 方法提交的表单 ,设置128K 比较合适。
client_max_body_size:最大缓冲区的尺寸。
client_header_buffer_size:处理客户端头尺寸,默认 1k 是比较理性的选择。
large_client_header_buffers:对于大客户端头显示的缓冲区的最大数量和尺寸,4 个头 4k 缓冲区足够。
output_buffers:从磁盘读取响应内容所使用的缓冲区数量和尺寸。

适当设置超时

http {
    client_body_timeout 12;
    client_header_timeout 12;
    keepalive_timeout 15;
    send_timeout 10;
}

现在感觉你的应用速度如何?

You may also like

Leave a Reply

Your email address will not be published. Required fields are marked *