我的设置(在Debian 7上运行):
端口80上的nginx
端口8080上的apache
在nginx中使用proxy_pass http://127.0.0.1:8080
将所有动态(php)请求推送到apache
使用静态子域直接通过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";
}
}
根据我的理解,它目前对静态文件的作用是,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/*;
}
答案 0 :(得分:2)
您的问题可能是与托管CSS的新域建立连接所需的DNS查找。
答案 1 :(得分:0)
假设您的系统中有足够的内存,那么操作系统应该缓存css文件。
我将multi_accept on;
放在事件部分中,否则您的配置看起来很好。 Nginx应该快速为你的css文件gzip提供服务。
我倾向于用另一个文件测试它,并且看看它与从Apache代理文件的比较。我觉得你的问题不在你想象的地方。
答案 2 :(得分:0)
如果您有足够的RAM,可以将静态资产(或nginx proxy_cache)放在tmpfs文件夹中。并从那里服务。