Nginx 的性能优化主要从 Nginx 运行工作进程数量、Nginx 运行 CPU 亲和力、Nginx 最大打开文件数、Nginx 事件处理模型、开启高效传输模式、连接超时时间、fastcgi 调优、gzip 调优、expires 缓存调优和内核参数优化以及系统连接数的优化等方面。
Nginx 运行工作进程个数一般设置 CPU 的核心或者核心数 x2。如果不了解 cpu 的核数,可以 top 命令之后按 1 看出来,也可以查看 /proc/cpuinfo 文件,具体命令如下:
grep ^processor /proc/cpuinfo | wc -l
执行完成后,如下图所示:
我们可以看到,我们这里 CPU 的核数为 4,因此,我们可以修改 nginx 的配置如下:
vim /etc/nginx/nginx.conf
worker_processes 4;
修改完成后,如下图所示:
我们看到,我们这里将 nginx 的工作进程数调成了与 CPU 的核数相等。
如果是 4 核配置,那么配置如下:
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000
如果是 8 核配置,那么配置如下:
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 0000100000010000 00100000 01000000 10000000;
worker_processes 最多开启 8 个,8 个以上性能提升不会再提升了,而且稳定性变得更低,所以 8 个进程够用了。
当然,更好的是使用自动模式,即如下配置:
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 65535;
这个指令是指当一个 nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与 nginx进程数相除,但是 nginx 分配请求并不是那么均匀,所以最好与 ulimit -n 的值保持一致。
注:文件资源限制的配置可以在 /etc/security/limits.conf
设置,针对 root/user 等各个用户或者 *
代表所有用户来设置。
* soft nofile 65535
* hard nofile 65535
用户重新登录生效(ulimit -n)。
events {
use epoll;
worker_connections 65535;
multi_accept on;
}
nginx 采用 epoll 事件模型,处理效率高。
work_connections 是单个 worker 进程允许客户端最大连接数,这个数值一般根据服务器性能和内存来制定,实际最大值就是 worker 进程数乘以 work_connections。
实际我们填入一个 65535,足够了,这些都算并发值,一个网站的并发达到这么大的数量,也算一个大站了!
multi_accept 告诉 nginx 收到一个新连接通知后接受尽可能多的连接,默认是 on,设置为 on 后,多个 worker 按串行方式来处理连接,也就是一个连接只有一个 worker 被唤醒,其他的处于休眠状态,设置为 off 后,多个worker 按并行方式来处理连接,也就是一个连接会唤醒所有的 worker,直到连接分配完毕,没有取得连接的继续休眠。当你的服务器连接数不多时,开启这个参数会让负载有一定的降低,但是当服务器的吞吐量很大时,为了效率,可以关闭这个参数。
http {
include mime.types;
default_type application/octet-stream;
……
sendfile on;
tcp_nopush on;
……
}
主要目的是保护服务器资源,CPU,内存,控制连接数,因为建立连接也是需要消耗资源的。
keepalive_timeout 60;
tcp_nodelay on;
client_header_buffer_size 4k;
open_file_cache max=102400 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 1;
client_header_timeout 15;
client_body_timeout 15;
reset_timedout_connection on;
send_timeout 15;
server_tokens off;
client_max_body_size 10m;
fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_temp_path/usr/local/nginx1.10/nginx_tmp;
fastcgi_intercept_errors on;
fastcgi_cache_path/usr/local/nginx1.10/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128minactive=1d max_size=10g;
说明
nginx 的缓存功能有:proxy_cache / fastcgi_cache
使用 gzip 压缩功能,可能为我们节约带宽,加快传输速度,有更好的体验,也为我们节约成本,所以说这是一个重点。
Nginx 启用压缩功能需要你来 ngx_http_gzip_module 模块,apache 使用的是 mod_deflate。
一般我们需要压缩的内容有:文本,js,html,css,对于图片,视频,flash 什么的不压缩,同时也要注意,我们使用 gzip 的功能是需要消耗 CPU 的!
gzip on;
gzip_min_length 2k;
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_typestext/plain text/css text/javascriptapplication/json application/javascript application/x-javascriptapplication/xml;
gzip_vary on;
gzip_proxied any;
gzip on; #开启压缩功能
gzip_min_length 1k :设置允许压缩的页面最小字节数,页面字节数从 header 头的 Content-Length 中获取,默认值是 0,不管页面多大都进行压缩,建议设置成大于 1K,如果小与 1K 可能会越压越大。
gzip_buffers 4 32k :压缩缓冲区大小,表示申请 4 个单位为 32K 的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储 gzip 压缩结果。
gzip_http_version 1.1 :压缩版本,用于设置识别 HTTP 协议版本,默认是 1.1,目前大部分浏览器已经支持GZIP 解压,使用默认即可。
gzip_comp_level 6 :压缩比例,用来指定 GZIP 压缩比,1 压缩比最小,处理速度最快,9 压缩比最大,传输速度快,但是处理慢,也比较消耗 CPU 资源。
gzip_types text/css text/xml application/javascript :用来指定压缩的类型,‘text/html’ 类型总是会被压缩。默认值: gzip_types text/html (默认不对js/css文件进行压缩)
gzip_vary on :varyheader 支持,改选项可以让前端的缓存服务器缓存经过 GZIP 压缩的页面,例如用 Squid 缓存经过 nginx 压缩的数据。
缓存,主要针对于图片,css,js 等元素更改机会比较少的情况下使用,特别是图片,占用带宽大,我们完全可以设置图片在浏览器本地缓存 365d,css,js,html 可以缓存个 10 来天,这样用户第一次打开加载慢一点,第二次,就非常快了!缓存的时候,我们需要将需要缓存的拓展名列出来, Expires 缓存配置在 server 字段里面。
location ~* \.(ico|jpe?g|gif|png|bmp|swf|flv)$ {
expires 30d;
#log_not_found off;
access_log off;
}
location ~* \.(js|css)$ {
expires 7d;
log_not_found off;
access_log off;
}
注:log_not_found off;是否在 error_log 中记录不存在的错误。
expire 功能优点:
expire 功能缺点:
解决办法:第一个缩短缓存时间,例如:1天,但不彻底,除非更新频率大于 1 天;第二个对缓存的对象改名。
网站不希望被缓存的内容:
完整配置如下:
fs.file-max = 999999
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 10240 87380 12582912
net.ipv4.tcp_wmem = 10240 87380 12582912
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 40960
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65000
linux 默认值 open files 为 1024。查看当前系统值:
ulimit -n
运行后,终端输出如下:
说明 server 只允许同时打开 1024 个文件。
使用 ulimit -a 可以查看当前系统的所有限制值,使用 ulimit -n 可以查看当前的最大打开文件数。
新装的 linux 默认只有 1024 ,当作负载较大的服务器时,很容易遇到 error: too many open files。因此,需要将其改大,在 /etc/security/limits.conf 最后增加:
* soft nofile 65535* hard nofile 65535* soft noproc 65535* hard noproc 65535
Nginx 的性能优化主要从 Nginx 运行工作进程数量、Nginx 运行 CPU 亲和力、Nginx 最大打开文件数、Nginx 事件处理模型、开启高效传输模式、连接超时时间、fastcgi 调优、gzip 调优、expires 缓存调优和内核参数优化以及系统连接数的优化等方面。