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找到:
ulimit -n
输出:
65536
您还可以设置使用epoll,一个可扩展的I/O事件通知机制来触发事件,确保充分利用I/O性能。
最后,您可以使用multi_accept使worker一次接受所有新连接。
设置如下:
events { worker_connections 66536; use epoll; multi_accept on; }
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
keepalive_timeout 65; keepalive_requests 100000; sendfile on; tcp_nopush on; 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:
client_body_buffer_size 128k; client_max_body_size 10m; client_header_buffer_size 1k; large_client_header_buffers 4 4k; output_buffers 1 32k; postpone_output 1460;
连接队列
可以更改/etc/sysctl.conf文件中的某些指令,以便为连接和buckets设置Linux队列的大小。 更新net.core.somaxconn和net.ipv4.tcp_max_tw_buckets会更改等待Nginx接受的连接的队列大小。 如果内核日志中有错误消息,请增加该值,直到错误消失。
/etc/sysctl.conf:
net.core.somaxconn = 65536 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:
client_header_timeout 3m; client_body_timeout 3m; send_timeout 3m;
静态资源服务
如果您的网站提供静态资源(如CSS/JavaScript/images),Nginx可以缓存这些文件很短的时间。 在配置块中添加这个命令会告诉Nginx缓存1000个文件30秒,不包括在20秒内未被访问的任何文件,只有5倍或更多的文件。 如果你不经常部署,你可以安全地把这些数字调得更高。
/etc/nginx/nginx.conf:
open_file_cache max=1000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 5; open_file_cache_errors off;
您还可以缓存特定位置的资源。 缓存文件很长时间是有好处的,尤其是如果文件由版本控制系统管理。
/etc/nginx/nginx.conf
location ~* .(woff|eot|ttf|svg|mp4|webm|jpg|jpeg|png|gif|ico|css|js)$ { expires 365d; }
Gzip压缩内容
对于纯文本的内容,Nginx可以使用gzip压缩将这些资源返回给客户端。 现代的网络浏览器都支持gzip压缩的内容,这将减少网络传输的字节数。 下面的列表是可压缩内容类型的“安全”列表; 但是,您只需要启用您在Web应用程序中使用的内容类型。
/etc/nginx/nginx.conf:
gzip on; gzip_min_length 1000; 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; gzip_disable "MSIE [1-6].";
文件系统优化
临时端口
当Nginx充当代理时,到上游服务器的每个连接使用临时或短暂的端口。
ip_local_port_range定义端口范围值。 常见设置为
net.ipv4.ip_local_port_range 1024 65000。
tcp_fin_timeout指定端口必须处于非活动状态才能重用于其他连接的时间。 默认值通常为60秒,但通常可以安全地减少到30或甚至15秒:
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:
soft nofile 4096 hard nofile 4096
示例文件
/etc/sysctl.conf:
net.core.somaxconn = 65536 net.ipv4.tcp_max_tw_buckets = 1440000 net.ipv4.ip_local_port_range = 1024 65000 net.ipv4.tcp_fin_timeout = 15 net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_max_syn_backlog = 3240000
/etc/security/limits.conf:
soft nofile 4096 hard nofile 4096
nginx.conf:
pid /var/run/nginx.pid; worker_processes 2; events { worker_connections 65536; use epoll; multi_accept on; } http { keepalive_timeout 65; keepalive_requests 100000; sendfile on; tcp_nopush on; tcp_nodelay on; client_body_buffer_size 128k; client_max_body_size 10m; client_header_buffer_size 1k; large_client_header_buffers 4 4k; output_buffers 1 32k; postpone_output 1460; client_header_timeout 3m; client_body_timeout 3m; send_timeout 3m; open_file_cache max=1000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 5; open_file_cache_errors off; gzip on; gzip_min_length 1000; gzip_buffers 4 4k; 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; gzip_disable "MSIE [1-6]."; # [ debug | info | notice | warn | error | crit | alert | emerg ] error_log /var/log/nginx.error_log warn; log_format main '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" ' '"$gzip_ratio"'; log_format download '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" ' '"$http_range" "$sent_http_content_range"'; map $status $loggable { ~^[23] 0; default 1; } server { listen 127.0.0.1; server_name 127.0.0.1; root /var/www/html; access_log /var/log/nginx.access_log main; location / { proxy_pass http://127.0.0.1/; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; proxy_temp_path /etc/nginx/proxy_temp; } location ~* .(woff|eot|ttf|svg|mp4|webm|jpg|jpeg|png|gif|ico|css|js)$ { expires 365d; } } }
版权声明:Nginx服务器性能调优是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。