如何优化Nginx性能?

Nginx

1 前言

一个问题,一篇文章,一出故事。
笔者的WordPress安装Google的Site Kit插件,发现核心网页指标不达标,于是想到优化Nginx,于是整理此文。

2 最佳实践

2.1 多核并发

vim /etc/nginx/nginx.conf

增加如下配置,

#...
worker_processes  2;
#...
http {
    #...
}

重载使配置生效,

systemctl reload nginx.service

配置生效后,可以使用如下命令验证,

pgrep -u nginx -a

可见如下输出,

17118 nginx: worker process
17119 nginx: worker process
17120 nginx: cache manager process

注:两个“worker process”
另外,可以增加如下参数绑定进程到CPU内核,

#...
worker_processes  2;
worker_cpu_affinity 0001 0010
#...
http {
    #...
}

注:“0001”与“0010”为4位二进制数,即十进制“1”与“2”,如果核数大于4,可用8位二进制表示,即“00000001”与“00000010”(极限值8核)

2.2 服务器最大连接数

vim /etc/nginx/nginx.conf

增加如下配置,

#...
worker_rlimit_nofile 65535;
events {
    worker_connections  65535;
}
#...
http {
    #...
}

重载使配置生效,

systemctl reload nginx.service

以上需要根据服务器的内存与CPU性能设置,可用如下命令调试,

ab -c 1000 -n 1000 https://www.cmdschool.org/

详细地,请参阅以下文章,

如何优化Nginx与PHP-FPM的性能?

2.3 设置gzip压缩

vim /etc/nginx/nginx.conf

增加如下配置,

http {
    #...
    gzip on;
    gzip_min_length 2k;
    gzip_buffers 4 32k;
    gzip_http_version 1.1;
    gzip_comp_level 6;
    gzip_types text/plain text/css text/javascriptapplication/json application/javascript application/x-javascriptapplication/xml;
    gzip_vary on;
    gzip_proxied any;
    #...
}

配置解析如下,
– “gzip on”声明启用压缩功能
– “gzip_min_length 2k”声明压缩页面最小字节数,字节数从“header”的“Content-Length”取,需大于1K,否则越压越大。
– “gzip_buffers 4 32k”声明压缩缓冲区大小,即申请4单位的32K内存作为压缩结果缓冲区,默认值申请与原始数据一致的空间。
– “gzip_http_version 1.1”声明压缩版本,默认值为“1.1”受到大部分浏览器支持
– “gzip_comp_level 6”声明压缩比例,值小则压缩比低,处理快;值大压缩比高,处理慢(耗费CPU),可选值“1-9”
– “gzip_types text/html”声明压缩类型“text/html”类型总会被压缩,默认值“text/html”
– “gzip_vary on”声明支持varyheader,选项使前端缓存服务器支持缓存GZIP压缩过的页面
– “gzip_proxied any”声明为所有代理请求启用压缩
重载使配置生效,

systemctl reload nginx.service

2.4 开启高效传输模式

vim /etc/nginx/nginx.conf

增加如下配置,

http {
    #...
    sendfile       on;
    tcp_nopush     on;
    #...
}

配置解析如下,
– “sendfile on”声明调用sendfile函数输出文件,如负载重的下载类型应当设置为“off”
– “tcp_nopush on”声明将响应头与正文开始部分一起发送以防止网络阻塞(需“sendfile”设为“on”)
重载使配置生效,

systemctl reload nginx.service

2.5 设置链接超时

vim /etc/nginx/nginx.conf

增加如下配置,

http {
    #...
    keepalive_timeout 65;
    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;
    client_max_body_size 10M;
    #...
}

配置解析如下,
– “keepalive_timeout 65”声明客户端与服务器保持会话的时间,超时连接会断开
– “tcp_nodelay on”声明禁止TCP Nagle算法,禁用即允许同时有多个未确认未完成分组,无需ACK即可再次发送分组
– “client_header_buffer_size 4k”声明客户端请求头缓冲区大小,需据系统分页大小设置(命令“getconf PAGESIZE”可获取)
– “open_file_cache max=102400 inactive=20s”声明打开文件缓存“max”声明开启数量“inactive”声明开启多久无请求删除
– “open_file_cache_valid 30s”声明多久校验一次缓存是否有效
– “open_file_cache_min_uses 1”声明“open_file_cache max”的“inactive”定义时间内文件最少使用的次数
– “client_header_timeout 15”声明请求头超时时间,超时无数据则返回“request time out”错误
– “client_body_timeout 15”声明请求体超时时间,超时无数据则返回“request time out”错误
– “reset_timedout_connection on”声明启用重置无响应客户端连接并释放内存
– “send_timeout 15”声明客户端多久无法送超时则关闭连接
– “client_max_body_size 10M”声明上传文件大小限制
重载使配置生效,

systemctl reload nginx.service

2.6 开启高效传输模式

vim /etc/nginx/nginx.conf

增加如下配置,

http {
    #...
    sendfile       on;
    tcp_nopush     on;
    #...
}

配置解析如下,
– “sendfile on”声明调用sendfile函数输出文件,如负载重的下载类型应当设置为“off”
– “tcp_nopush on”声明将响应头与正文开始部分一起发送以防止网络阻塞(需“sendfile”设为“on”)
重载使配置生效,

systemctl reload nginx.service

2.7 fastcgi调优

vim /etc/nginx/nginx.conf

增加如下配置,

http {
    #...
    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 /var/cache/nginx/nginx_tmp;
    fastcgi_intercept_errors on;
    fastcgi_cache_path /var/cache/nginx/fastcgi_temp levels=1:2 keys_zone=cache_fastcgi:128m inactive=1d max_size=10g;
    #...
}

配置解析如下,
– “fastcgi_connect_timeout 600”声明连接到后端FastCGI的超时时间
– “fastcgi_send_timeout 600”声明向FastCGI传送请求的超时时间
– “fastcgi_read_timeout 600”声明接收FastCGI应答的超时时间
– “fastcgi_buffer_size 64k”声明读取FastCGI应答第一部分所需的缓冲区大小
– “fastcgi_buffers 4 64k”声明4个64k缓冲区装载单个页面(建议根据PHP页面平均大小设定)
– “fastcgi_busy_buffers_size 128k”声明繁忙时的buffer大小(建议值为“fastcgi_buffer”的两倍)
– “fastcgi_temp_file_write_size 128k”声明写入“fastcgi_temp_path”的数据块大小(默认值为“fastcgi_buffer”的两倍)
– “fastcgi_temp_path /var/cache/nginx/nginx_tmp”声明缓存临时路径
– “fastcgi_intercept_errors on”声明是否传递4xx与5xx错误信息到客户端
– “fastcgi_cache_path”声明缓存目录层级“levels”、名称“cache_fastcgi”、缓存大小“128m”、失效时间“inactive”、最大空间“max_size”
重载使配置生效,

systemctl reload nginx.service

2.8 延长大文件浏览器缓存时间

vim /etc/nginx/conf.d/www.cmdschool.org_443.conf

增加如下配置,

server {
    #...
    location ~* \.(ico|jpe?g|gif|png|bmp|swf|flv)$ {
        expires 30d;
        access_log off;
    }

    location ~* \.(js|css)$ {
        expires 7d;
        log_not_found off;
        access_log off;
    }
    #...
}

注:以上缓存到浏览器本地的文件需要根据具体的需求设定,否则会出现文件已经更新但不会重新下载的情况而影响用户使用。
重载使配置生效,

systemctl reload nginx.service

2.9 设置防盗链减压

如何实现Nginx的防盗链功能?

参阅文档
==================
http://nginx.org/en/docs/ngx_core_module.html
http://nginx.org/en/docs/http/ngx_http_gzip_module.html
http://nginx.org/en/docs/http/ngx_http_core_module.html
http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html
https://www.cnblogs.com/cheyunhua/p/10670070.html

没有评论

发表评论

Nginx
如何拒绝外网用户访问特定URL?

1 前言 一个问题,一篇文章,一出故事。 笔者有一个认证接口需要拒绝intetnet的用户访问同时允 …

Nginx
如何实现私网地址重写策略?

1 前言 一个问题,一篇文章,一出故事。 笔者的nextcloud需要透过反向代理实现企业外部2FA …