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

use*_*253 8 caching nginx

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

  1. 端口80上的nginx

  2. 端口8080上的apache

  3. proxy_pass http://127.0.0.1:8080在nginx中使用将所有动态(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";
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

根据我的理解,它目前对静态文件的作用是,nginx从中获取文件/var/www/DOMAIN.net/static/并传递它,添加此文件长时间不会过期的标头信息,但客户端应始终检查是否有更新的文件版本(因为目前这些静态文件不时更新,我希望它们确保客户端使用最新的css和imgs).基本上我告诉客户端在浏览器中缓存静态内容.

我的问题:我有一个网站,其缩小的css文件大小约为12 KB.现在用户访问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/*;
}
Run Code Online (Sandbox Code Playgroud)

小智 0

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

我会放入multi_accept on;事件部分,但否则你的配置看起来不错。Nginx 应该能够快速地为你的 css 文件提供 gzip 服务。

我倾向于用另一个文件来测试它,并看看它与从 Apache 代理文件相比如何。我有一种感觉,你的问题并不在你想象的地方。