阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Nginx从入门到放弃03-Nginx调优

1,138次阅读
没有评论

共计 4403 个字符,预计需要花费 12 分钟才能阅读完成。

Nginx 从入门到放弃 03-Nginx 调优

一、调优的必要性

在聊调优之前,我们先要知道为何调优,业务运行和调优的关系。

笔者把自己总结的文档分为几遍,合集在 https://g.xgss.net/nginx/

Nginx 从入门到放弃 03-Nginx 调优

业务运行:线上业务正常运行,承载了公司业务。监控业务:通过监控业务对线上业务进行监控,及时发现问题。优化业务:通过监控分析,发现业务问题或者瓶颈,及时对业务或者软件就行调整、优化。测试优化:优化完成后,需要对现有的优化进行测试,保证业务在当前优化模式中稳定、高效,能够解决当前问题。这就是业务运行的一个流程,也是我们保证业务稳定、高效、高可用的运维之道。

二、调优

调优类的文章是最难写的,因为我只能告诉你调优的选项,无法告诉你具体的阈值,因为不同的业务运行在不同的机器,所消耗的资源是不同的;又因为场景不同,对应的调优项及阈值是千变万化的。不能为了调优而调优,要根据实际情况、测试环境还是生产环境、实际业务等需求来实际配置,所以 nginx 的基本配置需要了解是什么意思,才能调优

CPU 优化

1)为什么要绑定 nginx 进程到不同的 CPU 上:CPU 调度的时候两个进程有可能被分配达到一个 CPU 上,从而会导致一个非常的空闲,一个非常的忙,无法充分发挥 CPU 的运算能力

(2)如何分配不同的 nginx 进程给不同的 CPU 处理

 4 核 CPU
# 启动工作进程数量
worker_processes 4;
# 指定运行的核的编号,采用掩码的方式设置编号
worker_cpu_affinity   0001 0010 0100 1000;

最大打开文件数优化

events {
单个工作进程维护的请求队列长度
  worker_connections 65535;
}

如果 65535 改为 1024,则会报错打开文件数过多,那为什么刚好 1024 也会报错呢,nginx 内部的工作线程数也会占用,如果线程 4 个工作进程,则最大支持 1020,如果现在是 8 个工作进程,则最大支持 1016

开启高效传输模式

nclude mime.types:媒体类型,include 只是一个在当前文件中包含另一个文件内容的指令。

default_type application/octet-stream:默认媒体类型足够。

sendfile on:开启高效文件传输模式,sendfile 指令指定 nginx 是否调用 sendfile 函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘 IO 重负载应用,可设置为 off,以平衡磁盘与网络 I / O 处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成 off。

tcp_nopush on:必须在 sendfile 开启模式才有效,防止网路阻塞,积极的减少网络报文段的数量(将响应头和正文的开始部分一起发送,而不一个接一个的发送。

http {
  include mime.types;
  default_type application/octet-stream;
  ……
  sendfile on;
  tcp_nopush on;
  ……
}

调整服务器内核

# ulimit -a #查看所有的属性值 
# ulimit -Hn 65535 #临时设置硬限制
# ulimit -Sn 65535 #设置软限制
# vim /etc/security/limits.conf
...
* soft nofile 65535
* hard nofile 65535

用户 / 组 软 / 硬限制 需要限制的项目 限制的值
* 号表示任何用户

检查操作系统支持的最大文件数

# ulimit -a|grep files
open files                     (-n) 65535

安装 ab 压测工具:

yum -y install httpd-tools 

安装后测每个 worker 进程的并发数

# ab -n 1024 -c 1024 http://127.0.0.1/index.html

修改配置:worker_connections  1028;

# ab -n 1028 -c 1028 http://127.0.0.1/index.html

事件处理模型

nginx 采用 epoll 事件模型,处理效率高。

events {
  use epoll;
  worker_connections 65535; # 单个 worker 进程允许客户端最大连接数
  multi_accept on; # 告诉 nginx 收到一个新连接通知后接受尽可能多的连接
}

长连接

减少服务器维护因为与客户端建立 http 连接产生的大量 tcp 三次握手四次断开的开销

设置连接超时

keepalive_timeout: 该参数用于设置客户端连接保持会话的超时时间,超过这个时间服务器会关闭该连接

client_header_timeout: 该参数用于设置客户端请求头数据的超时时间,如果超时客户端还没有发送完整的 header 数据,服务器将返回“Request time out(408)错误”

client_body_timeout: 该参数用于设置客户端请求主题数据的超时时间,如果超时客户端还没有发送完整的主体数据,服务器将返回“Request time out(408)错误”

send_timeout: 用于制定响应客户端的超时时间,如果超时这个时间,客户端没有任何活动,nginx 将会关闭连接

tcp_nodelay: 默认情况下当数据发生时,内核并不会马上发送,可能会等待更多的字节组成一个数据包,这样可以提高 I / O 的性能,但是,在每次发生很少字节的业务场景中,使用 tcp_nodelay 等待的时间会比较长。

keepalive_timeout  0;  0 代表关闭
#keepalive_timeout 100;
#keepalive_requests 8192;

# 长连接超时配置
keepalive_timeout 65;
client_header_timeout 15s;
client_body_timeout 15s;
send_timeout 60s;

fastcgi 优化

FastCGI 各大配置项详解

fastcgi_connect_timeout 240; #Nginx 服务器和后端 FastCGI 服务器连接的超时时间
fastcgi_send_timeout 240; #Nginx 服务器允许 FastCGI 服务器返回数据的超时时间,即在规定的时间内后端服务器必须传完所有的数据, 否则 Nginx 将断开这个连接
fastcgi_read_timeout 240; #Nginx 服务器允许 FastCGI 服务器读取响应信息的超时时间,表示连接建立成功后,Nginx 等待后端服务器的响应时间
fastcgi_buffer_size 64k; #Nginx FastCGI 的缓冲区大小,用来读取从 FastCGI 服务器收到的第一部分响应信息的缓冲区大小
fastcgi_buffer 4 64k; #设定用来读取从 FastCGI 服务器端收到的响应信息的缓冲区大小和缓冲区数量
fastcgi_busy_buffers_size 128k; #用于设置系统很忙时可以使用的 proxy_buffers 大小

gzip 压缩

降低传输时间,增加用户体验度;降低公司带宽费用,Gzip 压缩可以配置 http,server 和 location 模块下

gzip  on;
gzip_proxied any;
gzip_min_length 1k;
gzip_buffers 4 8k;
gzip_comp_level 6;
gzip_types text/plain text/css application/x-javascript application/javascript application/xml;


    # 开启 gzip
    gzip off;

    #Nginx 做为反向代理的时候启用:off – 关闭所有的代理结果数据压缩
	expired – 如果 header 中包含”Expires”头信息,启用压缩
	no-cache – 如果 header 中包含”Cache-Control:no-cache”头信息,启用压缩
	no-store – 如果 header 中包含”Cache-Control:no-store”头信息,启用压缩
	private – 如果 header 中包含”Cache-Control:private”头信息,启用压缩
	no_last_modified – 启用压缩,如果 header 中包含”Last_Modified”头信息,启用压缩
	no_etag – 启用压缩,如果 header 中包含“ETag”头信息,启用压缩
	auth – 启用压缩,如果 header 中包含“Authorization”头信息,启用压缩
	any – 无条件压缩所有结果数据


    gzip_proxied any;


    # 启用 gzip 压缩的最小文件,小于设置值的文件将不会压缩
    gzip_min_length 1k;

    # gzip 压缩级别,1-9,数字越大压缩的越好,也越占用 CPU 时间,后面会有详细说明
    gzip_comp_level 1;

    # 进行压缩的文件类型。javascript 有多种形式。其中的值可以在 mime.types 文件中找到。gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/vnd.ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml;

    # 增加响应头”Vary: Accept-Encoding”# 是否在 http header 中添加 Vary: Accept-Encoding,建议开启
    gzip_vary on;

    # 禁用 IE 6 gzip
    gzip_disable "MSIE [1-6]\.";

    # 设置压缩所需要的缓冲区大小     
    gzip_buffers 32 4k;

    # 设置 gzip 压缩针对的 HTTP 协议版本
    gzip_http_version 1.0;

Nginx 的 gzip 压缩功能虽然好用,但是下面两类文件资源不太建议启用此压缩功能

a. 图片类型资源(包括视频文件)

b. 大文件资源

expires 缓存优化

将部分数据缓存在用户本地磁盘,用户加载时,如果本地和服务器的数据一致,则从本地加载。提升用户访问速度,提升体验度。节省公司带宽成本。

expires 指令:开启缓存并指定静态缓存时间

location ~*  \.(png|gif)$ {
              expires 1h;  # 缓存 1 小时
              expires 30d; # 缓存 30 天
              expires max; # 最大缓存,10 年
              expires -1; # 禁止缓存,永不过期
         }

隐藏版本号

隐藏 nginx 的版本显示,响应头信息可以看到 nginx 的版本号,版本号暴露是不安全的,所以需要隐藏下 nginx 的版本号,配置 server_tokens off; 下面就看不到了。

server_tokens off;

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-06-24发表,共计4403字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7999873
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
星哥带你玩飞牛NAS-2:飞牛配置RAID磁盘阵列

星哥带你玩飞牛NAS-2:飞牛配置RAID磁盘阵列

星哥带你玩飞牛 NAS-2:飞牛配置 RAID 磁盘阵列 前言 大家好,我是星哥之前星哥写了《星哥带你玩飞牛 ...
三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

  三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Andr...
星哥带你玩飞牛NAS-5:飞牛NAS中的Docker功能介绍

星哥带你玩飞牛NAS-5:飞牛NAS中的Docker功能介绍

星哥带你玩飞牛 NAS-5:飞牛 NAS 中的 Docker 功能介绍 大家好,我是星哥,今天给大家带来如何在...
每年0.99刀,拿下你的第一个顶级域名,详细注册使用

每年0.99刀,拿下你的第一个顶级域名,详细注册使用

每年 0.99 刀,拿下你的第一个顶级域名,详细注册使用 前言 作为长期折腾云服务、域名建站的老玩家,星哥一直...
星哥带你玩飞牛NAS-8:有了NAS你可以干什么?软件汇总篇

星哥带你玩飞牛NAS-8:有了NAS你可以干什么?软件汇总篇

星哥带你玩飞牛 NAS-8:有了 NAS 你可以干什么?软件汇总篇 前言 哈喽各位玩友!我是是星哥,不少朋友私...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你 为什么要用宝塔跑分? 宝塔跑分其实就是对 CPU、内存、磁盘、IO 做...
星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的 NAS 中! 大家对「数据安全感」的需求越来越高 ...
手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板 前言 大家好,我是星哥。星哥发现很多新手刚接触服务器时,都会被“选购...
星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

  星哥带你玩飞牛 NAS-16:不再错过公众号更新,飞牛 NAS 搭建 RSS 对于经常关注多个微...
每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站 - 手机博物馆 -CHAZ 3D Experience 一句话介绍:一个用 3D 方式重温...