优化Ubunto和nginx以处理静态文件

时间:2015-07-06 22:17:48

标签: nginx ubuntu-14.04

我正在尝试使用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/*;
    }

2 个答案:

答案 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