本节内容主要参考了: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;
}
现在感觉你的应用速度如何?