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

nginx,服务器,性能 · 浏览次数 : 0

小编点评

归纳总结以上内容,生成内容时需要带简单的排版,并带一些简单的说明。以下是一些建议: 1. 使用简单的排版格式,例如空格或缩进。 2. 使用简单的说明,例如注释或说明。 3. 使用简单的格式,例如列表或表格。 4. 使用简单的格式,例如代码格式。 5. 使用简单的格式,例如图片格式。 6. 使用简单的格式,例如视频格式。 7. 使用简单的格式,例如音乐格式。 8. 使用简单的格式,例如图片格式。 9. 使用简单的格式,例如视频格式。 10. 使用简单的格式,例如音乐格式。

正文

Worker



相关worker设置比较简单,只需要设置正确的数量。

Worker Processes

如果您的站点流量不大,Nginx,数据库和Web应用程序都运行在同一台服务器上。则在/etc/nginx/nginx.conf中,设置worker_processes 1;
如果您的站点流量比较大或者服务器只运行了Nginx,请为每个CPU核心设置一个工作线程:worker_processes auto;
如果你想手动设置,你可以使用grep ^processor /proc/cpuinfo | wc -l来查找服务器的cpu线程数。

Worker Connections

worker_connections选项设置每个worker进程一次可以处理的最大连接数。 默认情况下,worker连接限制为512,但系统可以处理比这值更多的连接。
适当的值可以通过测试得出。 系统的核心限制也可以通过使用ulimit找到:

  1. ulimit -n

输出:

  1. 65536

您还可以设置使用epoll,一个可扩展的I/O事件通知机制来触发事件,确保充分利用I/O性能。
最后,您可以使用multi_accept使worker一次接受所有新连接。
设置如下:

  1. events {
  2.     worker_connections 66536;
  3.     use epoll;
  4.     multi_accept on;
  5. }

HTTP和TCP优化


Keep Alive

Keep alive能减少浏览器重新连接的次数。
keepalive_timeout和keepalive_requests控制保持活动设置。
sendfile优化Nginx提供文件系统的静态文件服务的性能,如logo。
tcp_nodelay允许Nginx使TCP发送多个缓冲区作为单独的数据包。
tcp_nopush通过激活TCP堆栈中的TCP_CORK选项来优化一次向下游发送的数据量。 TCP_CORK阻塞数据,直到分组到达MSS,这等于MTU减去IP报头的40或60字节。
/etc/nginx/nginx.conf

  1. keepalive_timeout 65;
  2. keepalive_requests 100000;
  3. sendfile on;
  4. tcp_nopush on;
  5. tcp_nodelay on;

Buffer Size

调整缓冲区大小可能是有利的。 如果缓冲区大小太低,那么Nginx将写入一个临时文件。 这将导致过多的磁盘I/O。
client_body_buffer_size处理客户端缓冲区大小。 大多数客户端缓冲区都来自POST方法表单提交。 128k通常是此设置的不错选择。
client_max_body_size设置最大body缓冲区大小。 如果请求中的大小超过配置的值,则会将413(请求实体过大)错误返回给客户端。 不过浏览器无法正确显示413错误。 将大小设置为0将禁用对客户机请求正文大小的检查。
client_header_buffer_size处理客户端头大小。 默认情况下,1k通常是一个合理的选择。
large_client_header_buffers设置客户端头的缓冲区的最大数量和大小。 4个报头与4k缓冲区应该足够了。
output_buffers设置用于从磁盘读取响应的缓冲区的数量和大小。 如果可能,客户端数据的传输将被推迟,直到Nginx至少具有要发送的数据的字节数的集合大小。 零值禁止推迟数据传输。
/etc/nginx/nginx.conf:

  1. client_body_buffer_size      128k;
  2. client_max_body_size         10m;
  3. client_header_buffer_size    1k;
  4. large_client_header_buffers  4 4k;
  5. output_buffers               1 32k;
  6. postpone_output              1460;

连接队列

可以更改/etc/sysctl.conf文件中的某些指令,以便为连接和buckets设置Linux队列的大小。 更新net.core.somaxconn和net.ipv4.tcp_max_tw_buckets会更改等待Nginx接受的连接的队列大小。 如果内核日志中有错误消息,请增加该值,直到错误消失。
/etc/sysctl.conf:

  1. net.core.somaxconn = 65536
  2. net.ipv4.tcp_max_tw_buckets = 1440000

可以通过使用net.core.netdev_max_backlog标记设置最大积压量,将数据包缓存在网卡中,然后交给CPU。 有关更改此值的建议,请参阅网卡文档。

超时

超时设置还可以大幅提高性能。
client_body_timeout指令设置服务器等待客户端完成发送body的最大时间。
client_header_timeout指令设置服务器等待客户端完成发送header的最大时间。
sent_timeout指定对客户端的响应超时。 此超时不适用于整个传输,而是仅应用于两个后续的客户端读取操作之间。 因此,如果客户端没有读取任何数据这段时间,那么Nginx关闭连接。
/etc/nginx/nginx.conf:

  1. client_header_timeout  3m;
  2. client_body_timeout    3m;
  3. send_timeout           3m;

静态资源服务

如果您的网站提供静态资源(如CSS/JavaScript/images),Nginx可以缓存这些文件很短的时间。 在配置块中添加这个命令会告诉Nginx缓存1000个文件30秒,不包括在20秒内未被访问的任何文件,只有5倍或更多的文件。 如果你不经常部署,你可以安全地把这些数字调得更高。
/etc/nginx/nginx.conf:

  1. open_file_cache max=1000 inactive=20s;
  2. open_file_cache_valid 30s;
  3. open_file_cache_min_uses 5;
  4. open_file_cache_errors off;

您还可以缓存特定位置的资源。 缓存文件很长时间是有好处的,尤其是如果文件由版本控制系统管理。
/etc/nginx/nginx.conf

  1. location ~* .(woff|eot|ttf|svg|mp4|webm|jpg|jpeg|png|gif|ico|css|js)$ {
  2.     expires 365d;
  3. }

Gzip压缩内容

对于纯文本的内容,Nginx可以使用gzip压缩将这些资源返回给客户端。 现代的网络浏览器都支持gzip压缩的内容,这将减少网络传输的字节数。 下面的列表是可压缩内容类型的“安全”列表; 但是,您只需要启用您在Web应用程序中使用的内容类型。

/etc/nginx/nginx.conf:

  1. gzip on;
  2. gzip_min_length 1000;
  3. gzip_types: text/html application/x-javascript text/css application/javascript text/javascript text/plain text/xml application/json application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/xml font/eot font/opentype font/otf image/svg+xml image/vnd.microsoft.icon;
  4. gzip_disable "MSIE [1-6]\.";

文件系统优化


临时端口

当Nginx充当代理时,到上游服务器的每个连接使用临时或短暂的端口。
ip_local_port_range定义端口范围值。 常见设置为

  1. net.ipv4.ip_local_port_range 1024 65000。

tcp_fin_timeout指定端口必须处于非活动状态才能重用于其他连接的时间。 默认值通常为60秒,但通常可以安全地减少到30或甚至15秒:

  1. net.ipv4.tcp_fin_timeout 15

最大Backlog Packets设置

net.ipv4.tcp_max_syn_backlog设置保留在Backlog中的最大数据包数量,超过后内核会丢弃。 正常值为net.ipv4.tcp_max_syn_backlog = 3240000。

文件描述符

文件描述符是用于处理诸如连接和打开文件等操作系统资源。 Nginx每个连接最多可以使用两个文件描述符。 例如,如果它是代理,通常有一个文件描述符用于客户端连接,另一个用于连接到代理服务器,不过如果使用HTTP keep alives,这个比率要低得多。 对于需要服务大量连接的系统,可能需要调整这些设置。
sys.fs.file max定义文件描述符的系统范围限制。 nofile定义用户文件描述符限制,在/etc/security/limits.conf文件中设置。
/etc/security/limits.conf:

  1. soft nofile 4096
  2. hard nofile 4096

示例文件



/etc/sysctl.conf:

  1. net.core.somaxconn = 65536
  2. net.ipv4.tcp_max_tw_buckets = 1440000
  3. net.ipv4.ip_local_port_range = 1024 65000
  4. net.ipv4.tcp_fin_timeout = 15
  5. net.ipv4.tcp_window_scaling = 1
  6. net.ipv4.tcp_max_syn_backlog = 3240000

/etc/security/limits.conf:

  1. soft nofile 4096
  2. hard nofile 4096

nginx.conf:

  1. pid /var/run/nginx.pid;
  2. worker_processes  2;
  3.     
  4. events {
  5.     worker_connections   65536;
  6.     use epoll;
  7.     multi_accept on;
  8. }
  9.     
  10. http {
  11.     keepalive_timeout 65;
  12.     keepalive_requests 100000;
  13.     sendfile         on;
  14.     tcp_nopush       on;
  15.     tcp_nodelay      on;
  16.         
  17.     client_body_buffer_size    128k;
  18.     client_max_body_size       10m;
  19.     client_header_buffer_size    1k;
  20.     large_client_header_buffers  4 4k;
  21.     output_buffers   1 32k;
  22.     postpone_output  1460;
  23.         
  24.     client_header_timeout  3m;
  25.     client_body_timeout    3m;
  26.     send_timeout           3m;
  27.         
  28.     open_file_cache max=1000 inactive=20s;
  29.     open_file_cache_valid 30s;
  30.     open_file_cache_min_uses 5;
  31.     open_file_cache_errors off;
  32.         
  33.     gzip on;
  34.     gzip_min_length  1000;
  35.     gzip_buffers     4 4k;
  36.     gzip_types       text/html application/x-javascript text/css application/javascript text/javascript text/plain text/xml application/json application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/xml font/eot font/opentype font/otf image/svg+xml image/vnd.microsoft.icon;
  37.     gzip_disable "MSIE [1-6]\.";
  38.  
  39.     # [ debug | info | notice | warn | error | crit | alert | emerg ]
  40.     error_log  /var/log/nginx.error_log  warn;
  41.         
  42.     log_format main      '$remote_addr - $remote_user [$time_local]  '
  43.       '"$request" $status $bytes_sent '
  44.       '"$http_referer" "$http_user_agent" '
  45.         '"$gzip_ratio"';
  46.  
  47.     log_format download  '$remote_addr - $remote_user [$time_local]  '
  48.       '"$request" $status $bytes_sent '
  49.       '"$http_referer" "$http_user_agent" '
  50.         '"$http_range" "$sent_http_content_range"';
  51.         
  52.     map $status $loggable {
  53.         ~^[23]  0;
  54.         default 1;
  55.     }
  56.         
  57.     server {
  58.         listen        127.0.0.1;
  59.         server_name   127.0.0.1;
  60.         root         /var/www/html;
  61.         access_log   /var/log/nginx.access_log  main;
  62.             
  63.         location / {
  64.             proxy_pass         http://127.0.0.1/;
  65.             proxy_redirect     off;
  66.             proxy_set_header   Host             $host;
  67.             proxy_set_header   X-Real-IP        $remote_addr;
  68.             proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
  69.             proxy_connect_timeout      90;
  70.             proxy_send_timeout         90;
  71.             proxy_read_timeout         90;
  72.             proxy_buffer_size          4k;
  73.             proxy_buffers              4 32k;
  74.             proxy_busy_buffers_size    64k;
  75.             proxy_temp_file_write_size 64k;
  76.             proxy_temp_path            /etc/nginx/proxy_temp;
  77.         }
  78.             
  79.         location ~* .(woff|eot|ttf|svg|mp4|webm|jpg|jpeg|png|gif|ico|css|js)$ {
  80.             expires 365d;
  81.         }
  82.     }
  83. }

与[转帖]Nginx服务器性能调优相似的内容:

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

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

[转帖]Nginx性能调优

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

[转帖]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 操作

[转帖]记一次压测引起的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报错404,由于请求处理时间过长

问题复现 近期部门内部有一个应用由于数据量过于庞大,或者说sql优化性能问题,导致查询全量数据时老报错nginx404,后来查看浏览器timing信息,发现其竟然时常达到可怕的2分钟十秒,抛去解决sql优化问题,这里从Nginx端的配置来说如何解决这类问题! 存在的问题 服务器处理请求时间过长,导致

[转帖]基于 Nginx 实现 10万+ 并发,Linux 内核优化

来源:http://t.cn/EyQTMwG 由于默认的Linux内核参数考虑的是最通用场景,这明显不符合用于支持高并发访问的Web服务器的定义,所以需要修改Linux内核参数,是的Nginx可以拥有更高的性能; 在优化内核时,可以做的事情很多,不过,我们通常会根据业务特点来进行调整,当Nginx作

[转帖]Nginx10万+并发 内核优化

由于默认的linux内核参数考虑的是最通用场景,这明显不符合用于支持高并发访问的Web服务器的定义,所以需要修改Linux内核参数,是的Nginx可以拥有更高的性能; 在优化内核时,可以做的事情很多,不过,我们通常会根据业务特点来进行调整,当Nginx作为静态web内容服务器、反向代理或者提供压缩服