我正在尝试使用nginx(第一次)来提供静态文件(400 kb)。我在linode服务器上安装了ubuntu 14.4(2GB ram,2核3tb传输)和nginx。
打开的文件设置为9000,gzip打开,processes = 2,worker connections 4000
使用50位用户的jmeter和10秒加速我实现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/*;
}
答案 0 :(得分:3)
如前所述 - 如果要使用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内存,但直接到网络套接字)。
打开文件缓存可防止在每个请求上检查文件系统的文件更改,因为没有理由每秒检查1000x。您可以根据nginx手册调整值。增加它超过几秒没有多大好处。
如果您向浏览器提供多个文件(通常只有少量javascript,css,少量图片),Keepalive 非常重要。没有它,客户端需要为每个连接创建一个新的TCP连接,这很慢(我看到你已经启用了这个)。如果你通常只为每个用户提供1个文件,你可以禁用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 worker只有在准备好1kbyte数据时才会写入logfile - 请注意,如果使用awstats或其他日志分析软件,如果日志文件中的时间倒退,则会出现问题。在这种情况下,根据req / s估计缓冲区大小,以便每个工作人员将其填充不到0.5秒(例如,日志中的每一行是200字节,1000 req / s,2工人意味着1s每个工人产生100 kb的数据,所以我们可以将缓冲区设置为64kb)。
答案 1 :(得分:2)
动态Gzipping正在扼杀你的表现。由于您正在提供静态文件,请考虑提前压缩它们。
有一个单独的扩展程序可以为您启用此功能:http://nginx.org/en/docs/http/ngx_http_gzip_static_module.html