8

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

  1. 80端口上的nginx

  2. 8080端口上的阿帕奇

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

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

    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";
        }
    }
    

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

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

我的理论:我需要更改 nginx,以便将静态文件缓存在内存中。我对 nginx 和缓存文件进行了一些研究,但我发现的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/*;
}
4

3 回答 3

2

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

于 2013-09-15T23:32:10.730 回答
0

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

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

我倾向于用另一个文件来测试它,并看看它与从 Apache 代理文件的比较。我感觉你的问题不是你想的那样。

于 2013-07-28T21:19:08.860 回答
0

如果你有足够的内存,你可以把你的静态资产(或你的 nginx proxy_cache)放在一个 tmpfs 文件夹中。并从那里服务。

于 2017-09-12T13:31:27.110 回答