如何使用nginx加快静态文件的传送速度? (将它们缓存在内存中?)

时间:2013-07-28 07:27:00

标签: caching nginx

我的设置(在Debian 7上运行):

  1. 端口80上的nginx

  2. 端口8080上的apache

  3. 在nginx中使用proxy_pass http://127.0.0.1:8080将所有动态(php)请求推送到apache

  4. 使用静态子域直接通过nginx(不使用apache)传递静态内容(img,css,js,...)。配置如下所示:

    server {
        server_name static.DOMAIN.net;
        root /var/www/DOMAIN.net/static/;
        access_log off;
        error_log /var/log/nginx/DOMAIN.net/error.log;
        location / {
            expires max;
            add_header Pragma public;
            add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        }
    }
    
  5. 根据我的理解,它目前对静态文件的作用是,nginx从/var/www/DOMAIN.net/static/抓取文件并传递它,添加此文件长时间不会过期的标头信息,但客户端应该总是检查是否有更新的版本(因为目前这些静态文件不时被更新,我希望它们确保客户端使用最新的css和imgs)。基本上我告诉客户在他们的浏览器中缓存静态内容。

    我的问题:我的网站有一个约12 KB大小的缩小css文件。现在,用户访问DOMAIN.net/some.php。根据Google的Critical Path Explorer,将html-result传递给请求用户需要大约5ms。这可以。然后发送css需要300-400ms。在这种情况下,关键路径显然是“加载html,然后加载css,然后完成”。基本上这意味着在用户的浏览器可以显示网站之前需要大约400毫秒,然后开始异步请求图像并在它们到达时显示它们。图像的大小也很慢,但至少它们不会阻止网站在浏览器中加载/显示。所以我真的需要加快静态文件的传递。证明在400ms内交付12KB css是可悲的:我也在本网站上使用文件http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js。这个文件要大得多,但只需要大约10毫秒。我知道我不是谷歌,可能无法达到他们的时间,但我目前的交货时间很糟糕。

    我的理论:我需要更改nginx,以便将静态文件缓存在内存中。我研究了有关nginx和缓存文件的abit,但是我发现的所有命令都是proxy_cache这些命令,虽然用于其他目的(在我的设置中我会用它来缓存nginx从apache获取的东西 - 我不是我想缓存动态php的东西,我想缓存静态css和图像)。

    那么:我如何加快静态文件传递? nginx能以某种方式将文件存储在内存中吗?还有什么可以加快交付速度?

    当前nginx.conf

    user www-data;
    worker_processes 4;
    pid /var/run/nginx.pid;
    
    events {
            worker_connections 4096;
            # multi_accept on;
    }
    
    http {
    
            ##
            # Basic Settings
            ##
    
            sendfile on;
            tcp_nopush on;
            tcp_nodelay on;
            keepalive_timeout 5;
            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_buffers 16 8k;
            gzip_comp_level 6;
            gzip_http_version 1.1;
            gzip_min_length 10;
            gzip_types text/plain text/css image/png image/gif image/jpeg application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript im$
            gzip_vary on;
            gzip_proxied any;
            gzip_disable "MSIE [1-6]\.(?!.*SV1)";
    
            ##
            # Proxy Settings
            ##
    
            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;
    
            ##
            # 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/*;
    }
    

3 个答案:

答案 0 :(得分:2)

您的问题可能是与托管CSS的新域建立连接所需的DNS查找。

答案 1 :(得分:0)

假设您的系统中有足够的内存,那么操作系统应该缓存css文件。

我将multi_accept on;放在事件部分中,否则您的配置看起来很好。 Nginx应该快速为你的css文件gzip提供服务。

我倾向于用另一个文件测试它,并且看看它与从Apache代理文件的比较。我觉得你的问题不在你想象的地方。

答案 2 :(得分:0)

如果您有足够的RAM,可以将静态资产(或nginx proxy_cache)放在tmpfs文件夹中。并从那里服务。