Nginx性能调优5招35式不可不知的策略实战

nginx · 浏览次数 : 111

小编点评

Nginx性能调优的关键在于系统层面、Nginx配置、缓存利用、压缩和负载均衡五个方面的优化。 **一、系统层面** - **内核参数调整**:增加系统文件描述符限制、TCP连接队列大小等。 - **文件描述符限制**:修改用户级和系统级限制,增加允许的文件描述符数量。 - **网络栈优化**:禁用Syn Cookies、调整TCP Keepalive时间等。 **二、Nginx配置** - **Worker进程数**:设置为CPU核心数以充分利用多核性能。 - **Worker连接数**:根据服务器内存和负载调整worker_connections。 - **HTTP/2启用**:使用HTTP/2以获得更好的性能。 - **缓存配置**:启用文件缓存、浏览器缓存等。 - **静态资源处理**:优化sendfile和tcp_nopush等参数。 - **负载均衡策略**:选择合适的负载均衡策略,如轮询、最少连接数等。 **三、缓存利用** - **启用Nginx内置缓存**:文件系统缓存、内存缓存等。 - **配置浏览器缓存**:通过设置HTTP头指示浏览器缓存。 - **使用CDN**:缓存静态资源并分发至全球节点。 - **配置反向代理缓存**:为反向代理服务器配置缓存。 **四、压缩** - **启用Gzip压缩**:设置压缩级别、类型和最小压缩大小。 - **配置浏览器缓存**:减轻服务器压力,提高用户体验。 **五、负载均衡策略** - **选择合适的负载均衡策略**:如轮询、最少连接数、IP哈希等。 - **配置健康检查**:确保流量只被定向到健康的服务器。 - **使用持久连接**:减少建立和关闭连接的次数。 - **调整超时时间**:确保Nginx能够快速响应后端服务器的变化。 - **限制连接数**:避免单个客户端占用过多资源。 - **监控和调整**:使用Nginx统计模块监控负载均衡性能,并根据数据调整策略。 综上所述,Nginx性能调优需要综合考虑多个方面,根据实际项目需求和服务器状况进行针对性的优化。

正文

Nginx是一个高性能的HTTP和反向代理服务器,它在全球范围内被广泛使用,因其高性能、稳定性、丰富的功能以及低资源消耗而受到青睐。今天V哥从5个方面来介绍 Nginx 性能调优的具体策略,希望对兄弟们有帮助,废话不多说,马上开整。

1. 系统层面:

  • 调整内核参数:例如,增加系统文件描述符的限制、TCP连接队列的大小等。
  • 网络优化:可以使用TCP Fast Open、选择更高效的网络协议等。

2. Nginx配置:

  • Worker进程数:通常设置为等于服务器的CPU核心数。
  • 连接数:通过调整worker_connections参数,可以增加每个Worker进程可以打开的连接数。
  • 使用HTTP/2:HTTP/2提供了更好的性能,包括头部压缩和服务器推送等功能。

3. 缓存利用:

  • 启用文件缓存:Nginx可以将静态文件缓存在服务器本地,减少磁盘I/O操作。
  • 使用代理缓存:例如,使用Nginx作为反向代理服务器时,可以缓存后端服务器的响应内容。

4. 压缩:

  • 启用Gzip压缩可以减少数据传输量,提高响应速度。

5. 负载均衡策略:

  • 根据服务器的性能和负载情况,选择合适的负载均衡策略,如轮询、最少连接数、IP哈希等。

下面 V 哥针对每个点结合业务场景来详细介绍,老铁们坐稳了,要发车了。

1. 系统层面

Nginx性能调优可以从多个层面进行,这里我们重点讨论系统层面的调优步骤。系统层面的调优主要是对操作系统进行优化,以更好地支持Nginx的高并发处理能力。

1. 内核参数调整

内核参数的调整可以通过修改/etc/sysctl.conf文件来实现,这些参数会影响网络栈的行为。

  • net.core.somaxconn:这个参数设置了一个系统范围内所有监听Socket的未完成连接队列的最大长度。调高这个值可以避免在高峰期出现"connection refused"的错误。
sysctl -w net.core.somaxconn=65535
  • net.ipv4.tcp_max_syn_backlog:这个参数设置了TCP连接建立时,SYN队列的最大长度。在高负载情况下,增加这个值可以防止SYN洪水攻击。
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
  • net.ipv4.ip_local_port_range:这个参数定义了本地端口范围,增加这个范围可以允许更多的并发连接。
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
  • net.ipv4.tcp_fin_timeout:这个参数决定了系统回收TCP连接的时间。减小这个值可以加快回收速度,释放资源。
sysctl -w net.ipv4.tcp_fin_timeout=30
  • net.ipv4.tcp_tw_reuse 和 net.ipv4.tcp_tw_recycle:这两个参数控制了TCP连接的TIME_WAIT状态。开启它们可以更快地重用和回收处于TIME_WAIT状态的连接。
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_tw_recycle=1

2. 文件描述符限制

增加系统允许的文件描述符数量,以便Nginx可以打开更多的连接。

  • 用户级限制:修改/etc/security/limits.conf文件,增加Nginx用户(通常是www-data或nginx)的nofile限制。
nginx soft nofile 65535
nginx hard nofile 65535
  • 系统级限制:修改/proc/sys/fs/file-max文件,增加整个系统的最大文件描述符数。
echo 65535 > /proc/sys/fs/file-max

3. 网络栈优化

  • 禁用Syn Cookies:在高峰期,可以临时禁用Syn Cookies,以提高TCP连接的建立速度。
sysctl -w net.ipv4.tcp_syncookies=0
  • 调整TCP Keepalive:通过调整net.ipv4.tcp_keepalive_time等参数,可以优化长连接的管理。
sysctl -w net.ipv4.tcp_keepalive_time=600

4. 硬件和架构优化

  • 使用SSD存储:使用固态硬盘可以显著提高I/O性能,尤其是对于需要频繁读写文件的Nginx服务器。
  • 网络硬件:使用高带宽和低延迟的网络硬件,如万兆以太网,可以提高数据传输速度。
  • 负载均衡:如果服务器面临极高的负载,可以考虑使用硬件负载均衡器来分担Nginx的压力。

5. 操作系统选择和优化

  • 选择合适的操作系统:不同的操作系统对网络性能的支持不同,选择一个适合高并发网络服务的操作系统是很有帮助的。
  • 关闭不必要的系统服务:减少系统运行的进程和服务,可以释放更多的系统资源给Nginx使用。

在进行系统层面的调优时,需要注意平衡性能提升和系统稳定性之间的关系。过度的优化可能会导致系统不稳定,甚至出现资源耗尽的情况。因此,建议在调优过程中进行充分的测试,并根据服务器的具体情况进行调整。

2. Nginx配置

Nginx的性能调优可以通过修改其配置文件nginx.conf来实现。以下是一些具体的调优步骤和建议:

1. Worker进程数

Nginx使用多进程模型,通常情况下,Worker进程的数量应该设置为等于服务器的CPU核心数。这样可以最大化利用多核CPU的性能。

worker_processes auto;  # 或者指定具体的进程数,如 worker_processes 4;

2. Worker连接数

每个Worker进程可以同时处理的最大连接数由worker_connections指令设置。这个值应该根据服务器的内存大小和系统负载来合理设置。

events {
    worker_connections  4096;  # 根据服务器能力适当调整
}

3. 使用HTTP/2

如果客户端支持,可以启用HTTP/2,它提供了更好的性能,包括头部压缩和服务器推送等功能。

listen 443 ssl http2;

4. 文件描述符限制

增加Nginx可以打开的文件描述符数量,以处理更多的并发连接。

worker_rlimit_nofile 65535;

5. 启用Gzip压缩

压缩可以减少数据传输量,提高响应速度。

gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

6. 缓存配置

配置浏览器缓存,减少重复请求。

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
    add_header Cache-Control "public";
}

7. 静态资源处理

对于静态资源,可以使用sendfile快速传输文件。

location /static/ {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay off;
}

8. 负载均衡

如果有多台后端服务器,可以使用Nginx的负载均衡功能。

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
    keepalive 64;  # 保持活动的连接数
}

server {
    location / {
        proxy_pass http://backend;
    }
}

9. 优化SSL/TLS

如果使用SSL/TLS,可以优化相关配置以提高性能。

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

10. 日志配置

减少不必要的日志记录,可以减少磁盘I/O和CPU使用。

access_log off;  # 或者将日志写入内存文件系统

在进行Nginx配置调优时,应该逐步进行,每次更改后都要进行测试,以确保更改确实提高了性能,并且没有引入新的问题。此外,不同的应用场景可能需要不同的优化策略,因此最好根据实际情况进行调整。

3. 缓存利用

Nginx缓存利用是提高性能的重要手段,它可以通过减少服务器负载、降低响应时间和减少网络带宽使用来显著提升用户体验。以下是缓存利用的具体调优步骤:

1. 启用Nginx内置缓存

Nginx内置了多种缓存机制,如文件系统缓存、内存缓存等。可以通过配置nginx.conf来启用这些缓存。

  • 文件系统缓存(HTTP缓存)

在HTTP模块中,可以使用proxy_cache指令启用代理缓存。

http {
    # 定义缓存区域
    proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

    server {
        location / {
            proxy_cache my_cache;  # 使用定义的缓存区域
            proxy_cache_valid 200 302 10m;  # 对200和302响应缓存10分钟
            proxy_cache_valid 404 1m;  # 对404响应缓存1分钟
            proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;  # 在指定情况下使用过期缓存
        }
    }
}
  • 内存缓存(FastCGI缓存)

如果使用FastCGI(如与PHP-FPM配合),可以使用fastcgi_cache指令启用缓存。

http {
    # 定义FastCGI缓存区域
    fastcgi_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m;

    server {
        location ~ \.php$ {
            fastcgi_cache my_cache;  # 使用定义的缓存区域
            fastcgi_cache_key $request_uri;  # 定义缓存键
            fastcgi_cache_valid 200 30m;  # 对200响应缓存30分钟
        }
    }
}

2. 配置浏览器缓存

通过设置HTTP头,可以指示浏览器缓存静态资源。

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;  # 设置资源的过期时间
    add_header Cache-Control "public";  # 指示资源可以被浏览器和代理缓存
}

3. 使用CDN

内容分发网络(CDN)可以缓存静态资源,并将其分发到全球各地的节点,用户可以从最近的节点获取内容,从而减少延迟。

4. 配置反向代理缓存

如果Nginx作为反向代理服务器,可以配置它来缓存后端服务器的响应。

location / {
    proxy_pass http://backend;
    proxy_cache my_cache;  # 使用定义的缓存区域
    proxy_cache_valid 200 30m;  # 对200响应缓存30分钟
}

5. 监控和调整缓存性能

  • 使用Nginx的统计模块(如ngx_http_stub_status_module)来监控缓存命中率和缓存大小。
  • 根据监控数据调整缓存大小和过期时间,以优化性能。

6. 清理缓存

定期清理缓存,以释放空间和提高缓存效率。可以使用Nginx的缓存清理功能或编写脚本来实现。

在进行缓存调优时,需要注意以下几点:

  • 缓存大小和过期时间需要根据实际情况进行调整,以找到最佳平衡点。
  • 监控缓存命中率,以确保缓存配置有效地提高了性能。
  • 确保缓存内容的一致性,特别是在动态内容缓存时。

通过合理利用缓存,可以显著提高Nginx的性能,减少服务器负载,并提高用户体验。

4. 压缩

Nginx中的压缩功能可以通过Gzip模块来实现,它可以在服务器端对响应数据进行压缩,以减少传输数据的大小,从而提高加载速度,尤其是在带宽有限的情况下。以下是压缩的具体调优步骤:

1. 启用Gzip压缩

首先,确保在Nginx中启用了Gzip模块。这通常是通过在nginx.conf文件的http块中添加以下指令来完成的:

http {
    gzip on;  # 启用Gzip压缩
}

2. 设置压缩级别

gzip_comp_level指令用于设置压缩级别,级别越高,压缩率越大,但CPU消耗也越高。通常设置为1到9之间的值,其中1是最快的压缩,9是最高压缩率。推荐设置为6,这是一个性能和压缩率的平衡点。

http {
    gzip_comp_level 6;  # 设置压缩级别
}

3. 选择要压缩的内容类型

使用gzip_types指令指定要压缩的MIME类型。通常,文本文件(如HTML、CSS、JavaScript)和XML文件可以从压缩中受益。

http {
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}

4. 设置最小压缩大小

使用gzip_min_length指令设置触发压缩的最小文件大小。对于小文件,压缩可能不会带来太多好处,而且会增加CPU负担。

http {
    gzip_min_length 256;  # 只有大于256字节的响应才会被压缩
}

5. 禁用IE6的压缩

老版本的IE浏览器(IE6及以下)可能不支持Gzip压缩,可以通过gzip_disable指令禁用对这些浏览器的压缩。

http {
    gzip_disable "MSIE [1-6]\.";  # 禁用IE6及以下版本的Gzip压缩
}

6. 配置浏览器缓存

虽然压缩可以减少服务器带宽使用,但它会增加CPU负载。为了减轻服务器压力,可以配置浏览器缓存,让浏览器存储压缩后的内容,减少重复请求。

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;  # 设置资源的过期时间
    add_header Cache-Control "public";  # 指示资源可以被浏览器和代理缓存
}

7. 测试和监控

  • 在应用这些配置后,使用工具如curl或在线Gzip检测服务来测试压缩是否生效。
  • 监控服务器的CPU使用情况和响应时间,以确保压缩带来的性能提升大于CPU负载的增加。

通过合理配置Gzip压缩,可以在不显著增加服务器负载的情况下,显著减少网络传输数据的大小,提高用户体验。在进行压缩调优时,需要根据服务器的CPU能力和网络条件来平衡压缩级别和最小压缩大小,以达到最佳的性能。

5. 负载均衡策略

Nginx作为高性能的HTTP和反向代理服务器,提供了多种负载均衡策略,可以帮助分散流量,提高网站的可用性和性能。以下是负载均衡策略的具体调优步骤:

1. 选择合适的负载均衡策略

Nginx支持多种负载均衡策略,包括:

  • 轮询(Round Robin):这是默认的策略,请求按时间顺序逐一分配到不同的服务器,如果服务器宕机,自动剔除。
  • 最少连接(Least Connections):分配到当前连接数最少的服务器。
  • IP哈希(IP Hash):根据请求的来源IP地址,将请求分配到固定的服务器,可以在一定程度上保持用户的会话状态。
  • 权重(Weight):指定不同服务器的权重,权重越高,分配的请求越多。

在nginx.conf的upstream块中定义负载均衡策略:

upstream backend {
    server backend1.example.com weight=3;
    server backend2.example.com;
    server backend3.example.com backup;  # 备用服务器
    ip_hash;  # 使用IP哈希策略
}

2. 配置健康检查

使用health_check模块可以对后端服务器进行健康检查,以确保流量只被定向到健康的服务器。

server {
    location / {
        proxy_pass http://backend;
        health_check interval=10 fails=3 passes=2;
    }
}

3. 使用持久连接

对于HTTP/1.1客户端,可以使用持久连接(Keepalive)来减少建立和关闭连接的次数。

upstream backend {
    server backend1.example.com;
    keepalive 32;  # 保持活动的连接数
}

4. 调整超时时间

适当调整超时时间,以确保Nginx能够快速响应后端服务器的变化。

proxy_connect_timeout 5s;  # 设置与后端服务器建立连接的超时时间
proxy_read_timeout 60s;    # 设置从后端服务器读取响应的超时时间
proxy_send_timeout 5s;     # 设置向后端服务器发送请求的超时时间

5. 限制连接数

为了避免单个客户端占用过多资源,可以限制每个客户端的连接数。

limit_conn_zone $binary_remote_addr zone=mylimit:10m;
limit_conn mylimit 5;  # 每个IP地址最多允许5个同时连接

6. 监控和调整

  • 使用Nginx的统计模块(如ngx_http_stub_status_module)来监控负载均衡的性能。
  • 根据监控数据调整负载均衡策略和服务器权重,以优化性能。

7. 考虑使用第三方负载均衡解决方案

对于大型应用或需要更多高级功能的场景,可以考虑使用商业负载均衡器或云服务提供的负载均衡解决方案。

通过合理配置负载均衡策略,可以有效分散流量,提高网站的可用性和性能。在进行负载均衡调优时,需要根据服务器的具体情况和实际需求来选择合适的策略,并进行持续的监控和调整。

最后

以上 V 哥总结的5个方面关于 Nginx性能调优的策略,实际应用中需要结合实际项目的情况来测试,希望对你有帮助,欢迎关注威哥爱编程,技术路上我们一起成长。

与Nginx性能调优5招35式不可不知的策略实战相似的内容:

Nginx性能调优5招35式不可不知的策略实战

Nginx是一个高性能的HTTP和反向代理服务器,它在全球范围内被广泛使用,因其高性能、稳定性、丰富的功能以及低资源消耗而受到青睐。今天V哥从5个方面来介绍 Nginx 性能调优的具体策略,希望对兄弟们有帮助,废话不多说,马上开整。 1. 系统层面: 调整内核参数:例如,增加系统文件描述符的限制、T

[转帖]Nginx性能调优实战

https://cloud.tencent.com/developer/article/1513125?from=article.detail.1860295 1、Nginx运行工作进程数量 Nginx运行工作进程个数一般设置CPU的核心或者核心数x2。如果不了解cpu的核数,可以top命令之后按1

[转帖]Nginx性能调优实战

https://cloud.tencent.com/developer/article/1513125?from=article.detail.1860295 1、Nginx运行工作进程数量 Nginx运行工作进程个数一般设置CPU的核心或者核心数x2。如果不了解cpu的核数,可以top命令之后按1

[转帖]Nginx性能调优

https://www.jianshu.com/p/024b33d1a1a1/ 本文翻译自Tuning NGINX for Performance Nginx以高性能负载均衡、缓存和web服务器出名,支撑着世界上繁忙网站中的40%。大多数使用场景下,Nginx和Linux系统的默认配置表现较好,但是

[转帖]Nginx服务器性能调优

Worker 相关worker设置比较简单,只需要设置正确的数量。 Worker Processes 如果您的站点流量不大,Nginx,数据库和Web应用程序都运行在同一台服务器上。则在/etc/nginx/nginx.conf中,设置worker_processes 1; 如果您的站点流量比较大或

[转帖]记一次压测引起的nginx负载均衡性能调优

https://xiaorui.cc/archives/3495 这边有个性能要求极高的api要上线,这个服务端是golang http模块实现的。在上线之前我们理所当然的要做压力测试。起初是 “小白同学” 起头进行压力测试,但当我看到那压力测试的结果时,我也是逗乐了。 现象是,直接访问Golang

[转帖]专注于GOLANG、PYTHON、DB、CLUSTER 记一次压测引起的nginx负载均衡性能调优

https://xiaorui.cc/archives/3495 rfyiamcool2016年6月26日 0 Comments 这边有个性能要求极高的api要上线,这个服务端是golang http模块实现的。在上线之前我们理所当然的要做压力测试。起初是 “小白同学” 起头进行压力测试,但当我看到

[转帖]nginx调优参数整理总结

nginx性能优化考虑点 当我需要进行性能优化时,说明我们服务器无法满足日益增长的业务。性能优化是一个比较大的课题,需要从以下几个方面进行探讨: 当前系统结构瓶颈了解业务模式性能与安全 当前系统结构瓶颈 首先需要了解的是当前系统瓶颈,用的是什么,跑的是什么业务。里面的服务是什么样子,每个服务最大支持

[转帖]Nginx应用调优案例

https://bbs.huaweicloud.com/blogs/146367 【摘要】 1 问题背景nginx的应用程序移植到TaiShan服务器上,发现业务吞吐量没有达到硬件预期,需要做相应调优。 2 原因分析l 网卡配置该应用场景下网络吞吐量大,网卡的配置能对性能提升起到很大的作用。l 操作

[转帖]Nginx应用调优案例

https://bbs.huaweicloud.com/blogs/146367 【摘要】 1 问题背景nginx的应用程序移植到TaiShan服务器上,发现业务吞吐量没有达到硬件预期,需要做相应调优。 2 原因分析l 网卡配置该应用场景下网络吞吐量大,网卡的配置能对性能提升起到很大的作用。l 操作