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。这会是一种更好的方法吗?
答案 0 :(得分:1)
鉴于Rails正在生成gzip资产,我们可以确信该问题仅存在于nginx中。所以,让我们专注于那里!
我相信Nginx在提供静态资产方面比Rails更快,所以在任何情况下我都不会将它用作静态资产服务器。
现在查看您提供的网址(https://idoimaging.com),您的服务器似乎提供了gzip压缩文件。所以问题只在于您的测试方法(假设这是正确的URL,并且自此帖后您没有更改服务器配置)。
您的curl
命令不包含Accept-Encoding: gzip
标头,该标头告诉服务器您的客户端能够处理gzip压缩文件。没有它,Nginx将提供未压缩的版本。您可以在this gist中看到命令和输出的差异。不同之处在于Content-Length
和Content-Encoding
响应标头。
如果你看到不同的东西,请告诉我!
奇怪的是,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。