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/
详细地,请参阅以下文章,
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 设置防盗链减压
参阅文档
==================
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
没有评论