Nginx服务器性能调优

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 发布于:2019-11-21 13:58:15