Nginx Rails / Passenger没有提供gzip压缩文件

时间:2017-02-23 02:05:24

标签: ruby-on-rails nginx

Nginx 1.10.1 Rails 5.0.1。资产管道正在制作css和js文件的压缩版本和本机版本,但只有未压缩的版本才会提供给浏览器。我可以在公共/资产中看到这两个版本,我可以通过附加' .gz'来使用curl来检索压缩版本。发给我的css / js资产网址。

我正在使用CDN(AWS CloudFront),但是在没有CDN的情况下进行了测试,无论如何它仍然应该指向我的压缩版本,对吗?

nginx有--with-http_gzip_static_module。使用this answer作为指南,我的nginx配置(已编辑)具有:

http {
    server {
        listen       80;
        server_name  idoimaging.com www.idoimaging.com;
        return 301 https://$server_name$request_uri;
    }

    server {
        listen 443 ssl;
        server_name  idoimaging.com www.idoimaging.com;
        root /var/www/idoimaging/current/public;
        location ~ ^/(assets)/ {
            gzip_static on;
        }
    }
}

我还尝试/assets/作为location中的正则表达式。在我的production.rb

# Have also tried setting this to false
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
config.middleware.insert_before(Rack::Sendfile, Rack::Deflater)
config.assets.compress = true
config.assets.js_compressor = Uglifier.new(mangle: false)

我正在使用已禁用缓存的Chrome进行测试,同时我还认为curl https://idoimaging.com | grep assets的速度与浏览器具有相同的行为?

我不知道为什么nginx在出现时不会提供gzip' ed js / css资源文件。

编辑:我还看到this guide采用了另一种方法:使用Rails作为静态资产服务器而不是nginx。这会是一种更好的方法吗?

1 个答案:

答案 0 :(得分:1)

鉴于Rails正在生成gzip资产,我们可以确信该问题仅存在于nginx中。所以,让我们专注于那里!

我相信Nginx在提供静态资产方面比Rails更快,所以在任何情况下我都不会将它用作静态资产服务器。

现在查看您提供的网址(https://idoimaging.com),您的服务器似乎提供了gzip压缩文件。所以问题只在于您的测试方法(假设这是正确的URL,并且自此帖后您没有更改服务器配置)。

您的curl命令不包含Accept-Encoding: gzip标头,该标头告诉服务器您的客户端能够处理gzip压缩文件。没有它,Nginx将提供未压缩的版本。您可以在this gist中看到命令和输出的差异。不同之处在于Content-LengthContent-Encoding响应标头。

如果你看到不同的东西,请告诉我!

编辑1

奇怪的是,CloudFront似乎已经为你的CSS和你的JS重定向了重定向。

richardseviora:Richards-MacBook-Pro@~> curl "https://cdn.idoimaging.com/assets/application-0cd41e63d35c1e5a7ab76ded23fbaf2ef1d1b786144134a80a1dfa9c765cff0d.css" -I -H "accept-encoding: gzip"
HTTP/1.1 301 Moved Permanently
Content-Type: text/html
Content-Length: 185
Connection: keep-alive
Server: nginx/1.10.1
Date: Thu, 23 Feb 2017 03:30:49 GMT
Location: https://idoimaging.com/assets/application-0cd41e63d35c1e5a7ab76ded23fbaf2ef1d1b786144134a80a1dfa9c765cff0d.css
Age: 942
X-Cache: Hit from cloudfront
Via: 1.1 d8b73f8fefd106d5c95f11977e132c46.cloudfront.net (CloudFront)
X-Amz-Cf-Id: ao8PwibmSj1JhmfbmuNfC2gYi9x-RTcCrJDAqLWAUIyOjP_3qYTGQA==


# It should look like this instead.
richardseviora:Richards-MacBook-Pro@~> curl -I -H "accept-encoding: gzip" "http://cdn.sweatrecord.com/assets/application-b932da0ddcf53d3650da5135b083224e863b349c784f3d1e3ca992b36ce3e31d.css"
HTTP/1.1 200 OK
Content-Type: text/css
Connection: keep-alive
Accept-Ranges: bytes
Content-Encoding: gzip
Date: Thu, 23 Feb 2017 03:50:13 GMT
Last-Modified: Mon, 30 Jan 2017 16:29:44 GMT
Server: Apache
Vary: Accept-Encoding,Origin
X-Cache: Miss from cloudfront
Via: 1.1 8b5947aba7280333032d4dcdd80b3489.cloudfront.net (CloudFront)
X-Amz-Cf-Id: FN9FyKl0RCpNTTqBwb0WyQhbDd-rEyyQ05eCtaFCD8YaH_FtjG7Q8Q==

这是Nginx问题,但我不确定究竟是什么原因,因为CloudFront将cache 301s