优化 Ubuntu 和 nginx 处理静态文件

Optimize Ubunto and nginx to handle static files

我正在尝试使用 nginx(第一次)来提供静态文件 (400 kb)。我已经在 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://nginx.org/en/docs/http/ngx_http_gzip_static_module.html

如前所述 - 如果您想使用 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 通过减少其数据在用户和内核之间在内存中复制的次数来实现更快的静态文件服务 space(它告诉内核不要'将文件内容复制到我的 nginx 内存,但直接复制到网络套接字)。

打开文件缓存 阻止在每次请求时检查文件系统的文件更改,因为没有理由每秒检查 1000 次。您可以根据 nginx 手册调整这些值。将它增加到几秒之后没有太大好处。

Keepalive 如果您向浏览器提供多个文件(通常很少 javascript、css、很少图像),则非常重要。没有它,客户端将需要为它们中的每一个创建一个新的 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 的数据时才会写入日志文件 - 请注意,如果您使用 awstats 或其他日志分析软件,如果日志文件中的时间倒退,它可能会出现问题。在这种情况下,根据 req/s 估计缓冲区大小,以便每个工作人员将在 0.5 秒内填满它(例如,日志中的每一行是 200 字节,1000 req/s 和 2 个工作人员将意味着在 1 秒内每个工人产生 100 kb 的数据,因此我们可以将缓冲区设置为 64 kb)。