压缩Rails资产和Nginx Gzip

12

如果我已经使用 rake assets:precompile 压缩了Rails的资源文件,那么我是否需要配置nginx来压缩这些文件(gzip设置为on)?我的意思是这样做有意义吗?性能会更好还是更差?谢谢!

5个回答

18

运行rake assets:precompile命令后,您需要配置nginx以发送文件的gzip版本,我使用以下配置。

user www-data www-data;
worker_processes 4;

pid /var/run/nginx.pid;

events{
    worker_connections 2048;
    use epoll;
}

http{
    include mime.types;
    default_type application/octet-stream;

    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    server_tokens off;
    server_name_in_redirect off;
    ignore_invalid_headers on;

    gzip off;
    sendfile on;

    upstream reverse-proxy{
        server 127.0.0.1:3000;
        server 127.0.0.1:3001;
        server 127.0.0.1:3002;
        server 127.0.0.1:3003;
    }   

    server{
        listen 80;
        server_name _;
        root /home/www-data/my_website/public;

        client_max_body_size 10M;
        client_body_buffer_size 512k;

        location ~ ^/assets/ {
            gzip_static on;

            add_header Cache-Control public;
            expires 4w;
            gzip on;
            gzip_vary on;
            gzip_proxied any;
            gzip_disable "MSIE [1-6]\.";
            gzip_comp_level 6;
            gzip_types application/x-javascript text/css text/html image/x-icon image/png image/jpeg image/gif;
        }

        location / {
            try_files $uri @ruby;
        }

               location @ruby {
                        proxy_set_header  X-Real-IP  $remote_addr;
                        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
                        proxy_set_header  Host $http_host;
                        proxy_redirect    off;

                        proxy_pass http://reverse-proxy;
                }

    }

}

4
nginx文档指出,我们不需要添加text/html,因为这是默认完成的(在gzip_types下)。使用基于位置的gzip压缩时有一个问题,显然在443端口无法工作,对吧?我将其移动到http块中,以便所有内容都能解压缩。顺便说一下,你的expires设置也很棒。 - pjammer
1
我从未在 https 上进行测试(也无法工作,因为我将监听设置为端口 80),而我的过期时间是因为 Google 页面速度建议将其设置为 4 周。 - Jonathan Vukovich-Tribouharet

7
不,它们不是同一种类型的压缩。当您运行rake assets:precompile时,您真正做的就是将一堆文件连接成一个文件并将其转储到磁盘上。实际上,根据官方文档,这是两个文件:
引用:

在预编译文件时,Sprockets还会创建您资产的gzipped (.gz)版本。Web服务器通常配置为使用适度的压缩比率作为折衷方案,但由于预编译仅发生一次,因此Sprockets使用最大压缩比率,从而将数据传输大小减少到最小限度。另一方面,Web服务器可以配置为直接从磁盘提供压缩内容,而不是自己解压非压缩文件。

这对您很重要,因为它允许您使用gzip(如果您愿意),但不强制您这样做。 Gzip压缩是真正的压缩(不仅仅是串联文件),可减少您必须传输的数据量,但以处理器功率为代价(压缩和解压缩)。这可能会极大地改善您的站点,具体取决于页面大小和您(以及您的用户)的硬件。

当运行rake assets:precompile命令时,不再创建已压缩版本的文件了 :( https://multiplethreads.wordpress.com/2015/08/08/generate-gzip-assets-with-rails-sprockets-3/ - Nishant

4

下面是完整的配置(我在我的网站上使用它):

常规配置

http {
passenger_root /usr/local/lib/ruby/gems/1.9.1/gems/passenger-4.0.5;
passenger_ruby /usr/local/bin/ruby;

include mime.types;

default_type application/octet-stream;
server_tokens off;
sendfile on;
keepalive_timeout 70;

gzip on;
gzip_http_version 1.1;
gzip_disable "msie6";
gzip_vary on;
gzip_min_length 1100;
gzip_buffers 64 8k;
gzip_comp_level 3;
gzip_proxied any;
gzip_types text/plain text/css application/x-javascript text/xml application/xml;


add_header Strict-Transport-Security "max-age=16070400; includeSubdomains";
add_header X-Frame-Options DENY;

limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

include /opt/nginx/conf/nginx_host.conf;
}

/opt/nginx/conf/nginx_host.conf的内容;

主机配置

server {
listen 80;
server_name *.domain.com;
root APP_PATH/current/public;
        passenger_enabled on;
        access_log off;

error_log /dev/null;

# Cross domain webfont access
location ~* \.(?:ttf|ttc|otf|eot|woff|font.css)$ {
    add_header "Access-Control-Allow-Origin" "*";
    expires 1M;
    access_log off;
    add_header Cache-Control "public";
}

location ~* \.(ico|css|gif|jpe?g|png)(\?[0-9]+)?$ {
    expires max;
}

location ~ ^/(assets|uploaded_assets|system)/  {
  root   /home/travelobd/rails_apps/travelobd/current/public;
  gzip_static on; # to serve pre-gzipped version
  expires max;
  add_header Cache-Control public;
 }
}

用于提供资产:

server {
        listen 80;
        server_name     static.domain.com;
        root APP_PATH/current/public;
        location / {
                if ($request_filename ~ "\.(jpg|css|gif|png|swf|ico|js)$") {
                        break;
                }
        return 404;
        }
        }
 

1
如果您想提高性能,应该这样做。只需将以下代码块添加到您的网站配置中即可:
location ~ ^/(assets)/  {
  root /path/to/public; # CHANGE THIS
  gzip_static on; # to serve pre-gzipped version
  expires max;
  add_header Cache-Control public;
}

在配置中更改根路径。就是这样简单。

文档推荐™:http://guides.rubyonrails.org/asset_pipeline.html


0

对我有用的是配置Nginx:

location ~ ^/(assets)/ {
  gzip_static on;
}

然后在 application.rb 中:

  config.middleware.insert_before(Rack::Sendfile, Rack::Deflater)

  # Compress JavaScripts and CSS.
  config.assets.compress = true
  config.assets.js_compressor = Uglifier.new(mangle: false)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接