Nginx反向代理SSL / 最小化

5
我正在尝试将NginX用作几个IIS服务器的反向代理。目标是让NginX坐在IIS / Apache服务器前面,缓存静态项目,如CSS / JS / Images。我还尝试使用其perl模块使NginX自动缩小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转发请求或提供“维护页面”。
任何帮助都将不胜感激。

这是我在sites-enabled / default中拥有的内容。
    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;
            }



}

发布配置文件的人可能有更好的见解。您可以在链接网站上使用评论部分。 - Dayo
我也尝试在那里发布。如果他回答了,我会确保把它带到Stack Overflow上。我正在努力弄清楚这是否是一个好的用例。现在我们运行IIS7和Apache的混合。我们在IIS7上使用RequestReduce来压缩和组合文件,但在代理层完成这些操作是有意义的。能够将小的js或css更改推送到我们的主服务器,并在第一次请求时对它们进行压缩听起来很不错。特别是在像maxcdn/netdna这样使用NginX创建CDN的情况下。 - Frank
顺便说一句,Cloudflare CDN提供了很多内置的缩小/CDN功能。问题在于他们存在很严重的延迟抱怨。http://x-pose.org/2012/02/speed-up-your-site-disable-cloudflare/ - Frank
1个回答

6
Nginx是反向代理的理想解决方案,也是Unix的方式“专注于做好一件事情”。因此,我建议您将内容服务和最小化处理过程拆分出来,而不是使用第三方插件同时完成多个任务。
最佳实践是在本地系统上进行缩小和混淆阶段,然后再在生产环境中部署。这很容易说,也不难做到,请参见谷歌的方法以压缩静态资源。一旦准备好要使用的资源,我们就可以设置nginx配置。
  1. 在部署到生产环境之前,请使用minify&obfuscate。

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

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

  3. 使用gzip ongzip_static on来提供gzipped文件,而不是在每次请求时压缩它。

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

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

    if (-f $document_root/system/maintenance.html) { return 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,您可以使用此代码片段https://gist.github.com/3052776 - Anatoly
我不知道为什么这个被投票否决了,它是一个很好的开始。但我们试图做的是在反向代理之前直接进行缩小。原因是我们有一些IIS / Apache服务器的混合使用。在IIS上进行缩小时,如果没有使用MVC,会受到限制。手动操作很麻烦,每次更新时都需要额外的待办事项。 - Frank
1
@Frank,我明白你的意思,但是让我解释一下我们如何处理资产压缩。由于我们有零停机部署,我们试图减少部署时间,所有额外的工作都在船运之前通过特殊脚本完成,这一切都是自动化的。之后,所有东西都将提交到存储库中。我对这个Perl模块有一个问题——它如何避免狗堆效应? - Anatoly
什么是狗堆效应?我只是好奇nginx是否有能力运行一个“脚本”,然后代理存储内容。这也可以成为邮件代理的一个很酷的功能。 - Frank
@Frank,狗堆效应会在多个客户端同时请求生成缓存(或类似的方法来最小化静态资产)时发生。这可能会通过同时执行多个Perl脚本在服务器端造成额外的负载。 - Anatoly
我认为我正在尝试做的是:1. Nginx联系IIS并拉取副本。2. 最小化CSS / JS文件3.将它们缓存到磁盘上,以便不再最小化。我只是困惑为什么更多人不像这样尝试。 - Frank

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