我正在试验nginx(第一次(来提供静态文件(400kb(。我已经在linode服务器(2gb ram,2核3tb传输(和nginx上安装了ubuntu 14.4。
打开的文件设置为9000,gzip打开,进程=2,工作连接4000
在50个用户和10秒的斜坡上使用jmeter,我实现了800毫秒的采样时间,cpu和mem显然不是一个因素,100个用户,这增加到5/6秒,转出速度应该是250 mbps,这就解释了这一点。
但是,是否有优化可以使进程更优雅地处理负载?即2秒而不是5/6?
nginx文件:
user www-data;
worker_processes 2;
pid /run/nginx.pid;
events {
worker_connections 4000;
multi_accept on;
use epoll;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 15;
#types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 9;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css text/html application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
##
# nginx-naxsi config
##
# Uncomment it if you installed nginx-naxsi
##
#include /etc/nginx/naxsi_core.rules;
##
# nginx-passenger config
##
# Uncomment it if you installed nginx-passenger
##
#passenger_root /usr;
#passenger_ruby /usr/bin/ruby;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
如前所述,如果您想使用gzip,请使用http_gzip_static
模块,这样nginx就不必在每次请求时对文件进行gzip处理。然而,您需要自己放置文件的gzip版本,nginx只有在找到它时才会提供它们(它不会创建它们(。
在提供静态文件时,可以调整更多参数以获得最大性能:
sendfile on;
open_file_cache max=2500 inactive=120s;
open_file_cache_valid 10s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
Sendfile通过减少用户和内核空间之间在内存内复制数据的次数,可以更快地提供静态文件(它对内核说,不要将文件内容复制到我的nginx内存,而是直接复制到网络套接字(。
打开文件缓存防止在每次请求时检查文件系统中的文件更改,因为没有理由每秒检查1000次。您可以根据nginx手册调整这些值。将其增加到几秒钟以上并没有多大好处。
Keepalive如果您向浏览器提供多个文件(通常只有很少的javascript、css和图像(,那么Keepalive是非常重要的。如果没有它,客户端将需要为它们中的每一个创建一个新的TCP连接,这相当慢(我看到您已经启用了这一功能(。如果你通常只为每个用户提供一个文件,你可以禁用keepalive,但使用nginx,它不会给你带来什么好处,你不会因为无用的开放套接字而浪费服务器内存。
multi_accept on
也可能对性能产生负面影响,您需要对其进行基准测试,看看什么更适合您。accept_mutex
也是如此。或者,如果你的nginx至少是v1.9.1,你可以使用listen ...
reuseport
为每个工作线程提供单独的侦听套接字,这应该具有最好的性能。
为了获得真正高的性能,您可能还需要调整服务器的TCP/IP堆栈参数。
对日志文件使用缓冲,这样nginx就不必经常对它们进行写入,例如access_log /var/log/nginx/access.log common buffer=1k;
。每个nginx工作程序只有在准备好1字节的数据时才会写入日志文件-请注意,如果您使用awstats或其他日志分析软件,如果日志文件中的时间倒退,它可能会出现问题。在这种情况下,根据req/s来估计缓冲区大小,这样每个工作者将在0.5s内填满它(例如,日志中的每一行是200字节,1000 req/s和2个工作者意味着每个工作者在1秒内产生100kb的数据,所以我们可以将缓冲区设置为64kb(。
Gzipping正在扼杀您的性能。由于您提供的是静态文件,请考虑提前压缩它们。
有一个单独的扩展为您启用此功能:http://nginx.org/en/docs/http/ngx_http_gzip_static_module.html