【问题标题】:Nginx Reverse Proxy SSL / MinificationNginx 反向代理 SSL / 缩小
【发布时间】:2012-07-11 17:16:02
【问题描述】:

我正在尝试使用 NginX 作为一些 IIS 服务器的反向代理。目标是让 NginX 从 IIS / Apache 服务器缓存静态项目,如 CSS / JS / 图像。我还试图让 NginX 使用其 perl 模块自动缩小 js / css 文件。

我在这里找到了一个用于缩小的示例脚本:

http://petermolnar.eu/linux-tech-coding/nginx-perl-minify-css-js/

使用脚本一切正常,除了反向代理中断。

问题:

  1. 我正在努力实现的目标是否可能?我希望 NginX 在将它们保存到缓存之前先缩小脚本。
  2. nginX 可以自动设置正确的过期标头,以便尽可能长时间缓存静态项目,并且仅在查询字符串更改时替换 (jquery.js?timestamp=march-2012)
  3. 可以在发送资源之前使用 NginX GZIP 压缩资源。
  4. 如果 NGinx 无法连接到后端服务器,它可以转发请求或提供“Down For Maintenance 页面”。

任何帮助将不胜感激。

到目前为止,这是我的网站启用/默认设置。

    server {


    location / {

        proxy_pass             http://mywebsite.com;
        proxy_set_header       Host $host;
        proxy_cache            STATIC;
        proxy_cache_valid      200  1d;
        proxy_cache_use_stale  error timeout invalid_header updating
                              http_500 http_502 http_503 http_504;
    }


    location @minify {
                    perl Minify::minify_handler;
            }

            location ~ \.css$ {
                    try_files $uri.min.css @minify;
            }




            location /*.js {
                 expires 30d;
            }



}

【问题讨论】:

  • 发布配置的人可能有更好的洞察力。您可以在链接网站上使用 cmets 部分。
  • 我也尝试在那里发帖。如果他回答我会确保把它带到堆栈溢出。我试图弄清楚它是否是一个好的用例。现在我们混合运行 IIS7 和 Apache。我们在 IIS7 上使用 RequestReduce,这是一种缩小和合并的好方法,但在代理级别完成此操作是有意义的。能够将一个小的 js 或 css 更改推送到我们的主服务器并在第一次请求时将它们缩小听起来很性感。特别是在使用 NginX 创建 CDN 的情况下,就像 maxcdn / netdna 的人一样。
  • 顺便说一句,cloudflare cdn 提供了很多内置的 minify / cdn。问题是他们有严重的延迟投诉。 x-pose.org/2012/02/speed-up-your-site-disable-cloudflare

标签: iis-7 nginx minify reverse-proxy


【解决方案1】:

Nginx 是反向代理的理想解决方案,也是 Unix 方式“做一件事,做好”。所以我建议你将内容服务和缩小过程分开,而不是使用第三方插件一次做很多事情。

最佳实践是在进行生产部署之前在本地系统上进行 minify&obfuscate 阶段,这说起来容易做起来也不难,请参阅the google way 压缩静态资产。一旦你的资产准备好使用,我们就可以设置 nginx 配置。

答案:

  1. 在将其部署到生产环境之前使用 minify&obfuscate

  2. 您可以通过正则表达式(目录名或文件扩展名)查找资产

    位置 ~ ^/(assets|images|javascripts|stylesheets|swfs|system)/ { gzip_static 开启; 最大过期; add_header 缓存控制公共; add_header Last-Modified ""; add_header ETag ""; 休息; }

  3. 使用 gzip ongzip_static on 来提供 gzip 文件,而不是每次收到请求时都对其进行压缩。

  4. 使用try_files检测维护页面是否存在

    try_files $uri /system/maintenance.html @mywebsite;

    if (-f $document_root/system/maintenance.html) { 返回503; }

查看适用于您的案例的完整 nginx 配置:

http {
  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;

  upstream mywebsite {
    server                  192.168.0.1 # change it with your setting
  }

  server {
    try_files               $uri /system/maintenance.html @mywebsite;

    location @mywebsite {
      proxy_set_header      X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header      X-Forwarded-Proto $scheme;
      proxy_set_header      Host $http_host;
      proxy_redirect        off;
      proxy_pass            http://mywebsite;
    }

    location ~ ^/(assets|images|javascripts|stylesheets|swfs|system)/ {
      gzip_static       on;
      expires           max;
      add_header        Cache-Control public;
      add_header        Last-Modified "";
      add_header        ETag "";
      break;
    }

    if (-f $document_root/system/maintenance.html) {
      return            503;
    }

    location @503 {
      error_page 405 = /system/maintenance.html;
      if (-f $document_root/system/maintenance.html) {
        rewrite         ^(.*)$ /system/maintenance.html break;
      }
      rewrite           ^(.*)$ /503.html break;
    }

  }

}

【讨论】:

  • 用优化设置构建 nginx,你可以使用这个 gist gist.github.com/3052776
  • 我不知道为什么这被否决了,这是一个很好的开始。但是我们正在尝试做的是直接在反向代理之前缩小。原因是我们混合了 IIS / Apache 服务器。不使用 MVC 时,IIS 上的缩小受到限制。手动操作很不合适,每次推送更新时都会创建额外的待办事项。
  • @Frank 我明白你的意思,但让我解释一下我们如何处理资产压缩。由于我们有零停机部署,我们试图减少部署时间,所有额外的工作在发布特殊脚本之前已经完成,这一切都是自动化的。之后,一切都将在回购中提交。我对这个 perl 模块有疑问 - 如何避免狗桩效应?
  • 什么是狗堆效应?我只是好奇nginx是否能够运行“脚本”然后代理存储内容。这对于邮件代理来说也是一个很酷的功能。
  • @Frank dog-pile effect 一旦多个客户端同时请求生成缓存(或类似的方法来最小化资产静态),就会发生。一次执行多个 perl 脚本可能会导致服务器端的额外负载。
猜你喜欢
  • 2020-06-06
  • 2018-05-31
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 2016-12-20
  • 2020-11-22
  • 2014-09-06
  • 2023-03-25
相关资源
最近更新 更多