百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Nginx-性能优化

off999 2025-01-07 14:56 27 浏览 0 评论

前言

这篇关于 Nginx 的性能优化,是我查阅资料研究所成,并没有用于实际生产环境,如若你想用于实践,请谨慎测试之后使用。

Nginx 性能优化,主要是减少磁盘 io。

  • 请求头、请求体、响应体都在缓冲区操作。
  • 文件信息的读取

减少网络 io。

  • gzip 压缩。前端资源也可以提前进行 gzip 压缩,这样请求的时候就不用再压缩了,减少对 cpu 的损耗。
  • 强缓存。减少对后端的静态资源的请求。

http 链接的尽快释放,减少请求的堆积。

linux 内核优化。这部分主要是查阅资料加上自己的理解。内容来自 《深入理解 Nginx 模块开发与架构设计》。

调账参数之后可以使用 ab 和 jmeter 进行压测,根据实际效果来进行调优。

Nginx 一定要在安全的情况下做性能优化。不然 tcp 攻击就能给你服务器搞挂了,能用才是王道。安全访问第一,性能第二。

调优之后,一定记得要做限流哦。

下个系列准备写 Mysql 相关,已经在做准备了。

linux 内核优化

可以修改 /etc/sysctl.conf 来修改内核参数。这部分优化慎重

  • 查看 tcp 相关系统参数
 sysctl -a | grep 'net.ipv4.tcp' | grep -v grep
fs.file-max = 999999
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 15
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_rmem = 4096 32768 262144
net.ipv4.tcp_wmem = 4096 32768 262144
net.ipv4.tcp_max_orphans = 262144 
net.core.netdev_max_backlog = 262144
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 2097152
net.core.wmem_max = 2097152
net.core.somaxconn = 262144 
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog=262144

修改之后执行以下命令,使配置生效。

sysctl -p

上面的参数意义解释如下:

  • fs.file-max:999999 这个参数表示进程(比如一个worker进程)可以同时打开的最大句柄数,这 个参数直接限制最大并发连接数,需根据实际情况配置。
  • net.ipv4.tcp_tw_reuse: 这个参数设置为1,表示允许将TIME-WAIT状态的socket重新用于新的 TCP连接,这对于服务器来说很有意义,因为服务器上总会有大量TIME-WAIT状态的连接。
  • net.ipv4.tcp_keepalive_time: 这个参数表示当keepalive启用时,TCP发送keepalive消息的频度。 默认是2小时,若将其设置得小一些,可以更快地清理无效的连接。
  • net.ipv4.tcp_fin_timeout: 这个参数表示当服务器主动关闭连接时,socket保持在FIN-WAIT-2状态的最大时间。
  • net.ipv4.tcp_max_tw_buckets: 这个参数表示操作系统允许TIME_WAIT套接字数量的最大值, 如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。该参数默认为 180000,过多的TIME_WAIT套接字会使Web服务器变慢。
  • net.ipv4.ip_local_port_range: 这个参数定义了在UDP和TCP连接中本地(不包括连接的远端) 端口的取值范围。
  • net.ipv4.tcp_rmem: 这个参数定义了TCP接收缓存(用于TCP接收滑动窗口)的最小 值、默认值、最大值。
  • net.ipv4.tcp_wmem: 这个参数定义了TCP发送缓存(用于TCP发送滑动窗口)的最小 值、默认值、最大值。
  • net.ipv4.tcp_max_orphans 选项用于记录那些尚未收到客户端确认信息的连接请求的最大值。对于有128MB内存的系统而言,此参数的默认值是1024,对小内存的系统则是128。
  • net.core.netdev_max_backlog: 当网卡接收数据包的速度大于内核处理的速度时,会有一个队列 保存这些数据包。这个参数表示该队列的最大值。
  • net.core.net.core.rmem_default: 这个参数表示内核套接字接收缓存区默认的大小。
  • net.core.wmem_default: 这个参数表示内核套接字发送缓存区默认的大小。
  • net.core.rmem_max: 这个参数表示内核套接字接收缓存区的最大大小。
  • net.core.wmem_max: 这个参数表示内核套接字发送缓存区的最大大小。

滑动窗口的大小与套接字缓存区会在一定程度上影响并发连接的数目。

每个 TCP连接都会为维护TCP滑动窗口而消耗内存,这个窗口会根据服务器的处理速度收缩或扩 张。

参数wmem_max的设置,需要平衡物理内存的总大小、Nginx并发处理的最大连接数量 (由nginx.conf中的worker_processes和worker_connections参数决定)而确定。

当然,如果仅仅 为了提高并发量使服务器不出现Out Of Memory问题而去降低滑动窗口大小,那么并不合 适,因为滑动窗口过小会影响大数据量的传输速度。

rmem_default、wmem_default、 rmem_max、wmem_max这4个参数的设置需要根据我们的业务特性以及实际的硬件成本来综 合考虑。

  • net.core.somaxconn 选项表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目。
  • net.ipv4.tcp_syncookies: 设置为 1。该参数与性能无关,用于解决TCP的SYN攻击。
  • net.ipv4.tcp_max_syn_backlog: 这个参数表示TCP三次握手建立阶段接收SYN请求队列的最大 长度,默认为1024,将其设置得大一些可以使出现Nginx繁忙来不及accept新连接的情况时, Linux不至于丢失客户端发起的连接请求。

内存及磁盘资料优化

client_header_buffer_size 1k;

作为静态资源访问 1k 足够了。

客户端请求头部的缓冲区大小,默认 1k,当请求接口的时候,根据请求头数据设置 4k 整数倍。

4k 为系统内存页大小,命令 getconf PAGESIZE 内存页大小

large_client_header_buffers

client_body_in_single_buffer

设置为 on,http 包一律写入到内存 buffer 中,如果包体超过 client_body_buffer_size 的大小,还是会写入到磁盘文件中。

client_body_buffer_size

x64 默认 16K。定义接受请求体内存缓冲区大小,请求先写入到缓存区,超过在写入临时文件中。

client_max_body_size 100m;

设置客户端请求体最大允许大小,默认 1m。检查的是 Content-Length。设置为 0 不检查。针对具体 location 配置。防止被请求攻击,在需要调大的地方设置,不要全局设置。

sendflie on;

文件内容读取减少了内核态到用户态的拷贝,直接从内核态到网卡设备,提高了发送效率。

open_file_cache

缓存文件的存储信息。max 表示最大存储数量,超过这个数量,采用 LRU 淘汰

inactive 指定时间段,该时间段内没有被访问过的元素,会被淘汰

open_file_cache max=65535 inactive=20s;

open_file_cache_min_uses

默认为 1。与 open_file_cache 的 inactive 配合使用,如果在 inactive 指定的时间内,访问次数超过 open_file_cache_min_uses 指定的次数,不会淘汰缓存。

调大文件句柄限制

linux 一切皆文件,但是进程打开的文件数会有限制。可针对用户和进程来限制文件句柄数。

  • 文件句柄,可以针对用户,进程设置 全局设置 /etc/security/limits.conf
* hard nofile 65535
* soft nofile 65535
root hard nofile 65535
- nginx 进程配置
worker_rlimit_nofile 20480;

日志优化

可适当减少日志操作。比如访问静态资料的日志记录,如果你感觉不重要,可以取消日志记录。这样请求资源的时候就会减少日志的磁盘 io。

# 关闭日志
access_log off;
# 禁用文件未找到的错误到日志中去
log_not_found off;

反向代理优化

如果你用 nginx 作为代理服务器,也要减少磁盘 io 的读取。

proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 16 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_set_header Host $http_host;
proxy_set_header X-REAL-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Nginx 优化配置

# 配置 worker 进程所属用户,用户组
user nginx nginx;

# 配置 worker 进程数量,为避免 cpu 切换损耗,配置和系统内核数一样即可,或者 auto
worker_processes auto;

# 配置 cpu 亲和,auto 代表自动绑定
worker_cpu_affinity auto;

# nginx 进程打开文件描述符数目,此值覆盖 ulimit -n 的值。
worker_rlimit_nofile 65535;

events {
    # 用这个模型来高效处理异步事件
    use epoll;

    # 设置为 on worker 进程轮流接受新链接,官方推荐设置为 off.高负载的情况下设置为 on.
    accept_mutex on;

    # worker进程是否同时接受连接所有新请求。默认为off,表示一次只接受一个新的请求。官方推荐 off
    multi_accept on;

    # 配置 一个 woker 进程处理的连接数
    worker_connections 65535;
}
http {
    # 关闭日志
    access_log off;
    # 隐藏响应头中的有关操作系统和web server(Nginx)版本号的信息,这样对于安全性是有好处的。
    server_tokens off;
    sendfile on;
    # 设置为非零值时,可限制单个 sendfile() 调用时传输的数据量。如果没有限制,一个快速 连接可能会完全占用工作进程。
    sendfile_max_chunk 5m;
    # tcp_nopush 和 tcp_nodeny 可以一起生效
    # 等数据包累计到一定大小发送,启用 sendfile 生效
    tcp_nopush on;
    # 该选项仅在连接转换到 keep-alive ,长连接状态时启用。让 tcp 尽快发包。
    tcp_nodelay on;
    # 为了尽快释放连接,可以设置小点. 15 至 30
    keepalive_timeout 15;

    # 客户端请求头部的缓冲区大小,默认 1k,当请求接口的时候需要设置 4k 整数倍.内存设置为系统内存页大小,命令 getconf PAGESIZE 内存页大小
    client_header_buffer_size 4k;

    large_client_header_buffers 8 8k;

    # 根据需求设置,接口请求可以设置大些
    client_body_buffer_size 128k;

    # 设置客户端请求体最大允许大小,默认 1m。检查的是 Content-Length。设置为 0 不检查。针对具体 location 配置
    client_max_body_size 1m;


    # 下面这个参数将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,
    # inactive是指经过多长时间文件没被请求后删除缓存。
    open_file_cache max=262140 inactive=20s;
    # 下面这个是指多长时间检查一次缓存的有效信息。
    open_file_cache_valid 30s;
    # open_file_cache指令中的inactive参数时间内文件的最少访问次数,低于这个数,缓存清除
    open_file_cache_min_uses 1;
    open_file_cache_errors on;

    reset_timedout_connection on;
    client_body_timeout 10;
    send_timeout 2;

    # 限制每个 ip 的连接数
    limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;

    # 限制每个 ip 每秒的请求数
    limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;

    gzip on;
    # 在响应头中增加,Vary: Accept-Encoding
    gzip_vary on;
    # gzip压缩级别1-9,数字越大压缩效果越好,压缩时间也就越长CPU越高
    gzip_comp_level 5;
    # 申请内存时大小,如果源文件 9k,超过了 8K,那会申请 16*8K。
    gzip_buffers 8 128k;
    gzip_min_length 5K;
    gzip_proxied any;
    gzip_disable msie6;
    gzip_http_version 1.1;
    # 文本(js、text、css、xml、json)压缩比较好,图片已经进行过压缩,在压缩,效果不是很明显,还浪费 cpu
    gzip_types text/plain text/css text/xml text/javascript application/javascript application/json application/xml+rss application/rss+xml application/atom+xml image/svg+xml;

    # 安全相关 header
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header Feature-Policy "autoplay 'none'; camera 'none'" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "no-referrer-when-downgrade" always;
    add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;


    server {
        listen 80 backlog=262144;

        limit_conn conn_limit_per_ip 10;
        limit_req zone=req_limit_per_ip burst=10 nodelay;
        # assets, media
        location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
            # 强缓存,时间为一年,浏览器和 cdn 中间件可以缓存
            add_header Cache-Control "max-age=31536000";
            etag off;
            access_log off;
            # 禁用文件未找到的错误到日志中去
            log_not_found off;
        }

        # svg, fonts
        location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff2?)$ {
            # 强缓存,时间为一年,浏览器和 cdn 中间件可以缓存
            add_header Cache-Control "max-age=31536000";
            etag off;
            access_log off;
            # 禁用文件未找到的错误到日志中去
            log_not_found off;
        }
    }

}

资料参考

http-security-headers

Nginx Performance Tuning – Tips & Tricks

《深入理解 Nginx 模块开发与架构设计》。


本文由 张攀钦的博客 http://www.mflyyou.cn/ 创作。 可自由转载、引用,但需署名作者且注明文章出处。

如转载至微信公众号,请在文末添加作者公众号二维码。微信公众号名称:Mflyyou

相关推荐

怎么查询家里wifi密码(怎么查询家里wifi密码是多少)

一、通过已连接wifi的电脑查看1、找到电脑右下角的无线网图标,就是类似信号的图标,点开;2、然后右键自己的wifi名称,选择“属性”;3、进去之后勾选“显示字符”,然后就可以看见密码框的密码以数字显...

分区工具diskgenius怎么合并分区

DiskGenius是一款功能全面的磁盘管理工具,其可以帮助我们进行磁盘分区管理,包括创建新分区、删除分区、扩展分区等。如果您想要合并分区到C盘,可以按照以下步骤进行操作:1.打开DiskGeniu...

windows10易升怎么用(微软windows10易升使用教程)

windows10易升是微软官方的。windows10易升是微软官方发布的升级助理或者叫升级助手(官方下载),帮助你升级到win10最新版本,同时也帮助Win7Win8.1用户升级到Windows1...

300兆光纤买什么路由器(300兆光纤买3000m的路由器有用吗)

对于300Mbps的网速,推荐选择支持AC750及以上的路由器型号。比如TP-LinkArcherC20、D-LinkDIR-816、NetgearR6020等,都是性价比不错的选择。此类路由...

windows10产品密钥查询(查看windows10产品密钥)

要查看电脑上Windows10的产品密钥,你可以按照以下步骤进行操作:打开“开始”菜单,然后点击“设置”图标(齿轮状图标)。在“设置”窗口中,点击“更新和安全”选项。在左侧导航栏中,选择“激活”选项...

电脑怎样设置密码和更改密码
  • 电脑怎样设置密码和更改密码
  • 电脑怎样设置密码和更改密码
  • 电脑怎样设置密码和更改密码
  • 电脑怎样设置密码和更改密码
电脑总死机卡住不动怎么办(电脑老是死机卡住)

如果你的电脑经常卡死,而且只能强制关机,别忘了说明电脑这个配置不够造成的,你需要提高一下它的配置,比如说加一个内存条或者换一个固态硬盘,这样才能够正常运行,不然的话这种电脑是没有办法使用的,现在电脑都...

win10自动修复死循环无法开机

答:1、请确保电脑有充足的电源供应,确保电源可以正常供电;2、检查U盘是否正常安装;3、检查是否有新的软硬件设备接入;4、运行chkdsk,检查硬盘并修复文件系统;5、检查Windows更新,如果存在...

查看台式电脑ip地址(查询台式电脑ip地址)
查看台式电脑ip地址(查询台式电脑ip地址)

如何查看主机名和IP地址:右击我的电脑-属性-网络标识(win2000)/计算机名(winxp)-完整的计算机名称后面的就是你的主机名.右击网上邻居-,属性-右击本地连接-属性-双击INTERNET协议(tcp/ip)就可以看到自己的I...

2025-12-15 19:03 off999

windows7 ultimate(windows7ultimate无法启动)

32位的。1、在下载操作系统镜像的时候,带有x86标识的一般是32位系统,指的是CPU地址总线是32位、fetch、decode解压指令时也按32位字长来进行。x64一般表示系统为64位。2、x86是...

雨林系统u盘安装步骤(雨林重装系统)

如果是ISO镜像那就刻盘安装,如果不想刻盘,就硬盘安装。问题又来了,大部分的都是GHOST的系统,还有就是纯安装版的。我只说一下GHOST的,先把ISO文件给解压了,然后里边会有占主要空间大小的.GH...

0xc000021a手动修复(修复0xc0000225)
0xc000021a手动修复(修复0xc0000225)

出现这样的问题很常见,用以下方法及解决方案就可以解决1、错误代码0xc000021a表示用户模式子系统有所损坏。一般按照蓝屏提示重启系统,即可正常运行。2、如果重启没能解决,则建议通过“最后一次正确的配置”方式启动系统。3、如果系统文件被破...

2025-12-15 17:51 off999

windows7网络驱动(win7网络驱动在哪个文件夹)
windows7网络驱动(win7网络驱动在哪个文件夹)

1.Networkcarddriver。2.右键我的电脑,点击“属性”,选择左侧“设备管理器”3.点击“网络适配器”,如果方框内没有驱动,请下载驱动精灵安装网卡驱动。在Windows7操作系统中,网络驱动程序的名称通常以网络适配器的品...

2025-12-15 17:03 off999

diskgenius的功能介绍(diskgenius是什么)

先打开DiskGenius(如果系统打不开了,可以在PE下运行),在弹出分区工具Diskgenius工具中,依次点击“硬盘——重建主引导记录(MBR)”选项,无需理会弹出的提示窗口,直接按下“是”即可...

网速快但是打开网页慢(网速快但是打开网页慢怎么回事)

原因有很多,有可能是路由器的原因,也有可能是其他原因,总的来说,网速慢的常见原因有以下几种:1.wifi被人蹭网,别人占用了带宽或者给你限速了,可以登录路由器管理页面查看连接的设备数。2.路由器性能...

取消回复欢迎 发表评论: