2012-07-12 158 views
4

我想使用Nginx作为几个IIS服务器的反向代理。目标是让Nginx从IIS/Apache服务器缓存静态项目,如CSS/JS/Images。我也试图让NginX使用它的perl模块自动缩小js/css文件。Nginx反向代理SSL /缩小

我发现了一个示例脚本用于缩小率在这里:

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

随着纸条一切工作正常,但反向代理断裂。

问题:

  1. 就是我试图完成甚至可能吗?我希望NginX在将脚本保存到缓存之前首先将脚本缩小。
  2. 可以Nginx的automtically设置适当的过期头,使静态的项目,只要可能的缓存,只有当查询字符串被改变取代(的jquery.js?时间戳=行军2012)
  3. 能nginx的GZIP发送之前的资源他们出去了。
  4. 如果NGinx无法连接到后端服务器,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; 
      } 



} 
+0

发布该配置是可能有一个更好地了解这个人。您可以在链接的网站上使用评论部分。 – Dayo 2012-07-12 16:08:47

+0

我尝试过也在那里张贴。如果他回答我会确保把它带到堆栈溢出。我试图弄清楚它是否是一个很好的用例。现在我们运行IIS7和Apache的组合。我们在IIS7上使用RequestReduce,这是一种缩小和合并的好方法,但是在代理级别完成这一点是有道理的。能够将小的js或css更改为我们的主要服务器,并在首次请求时缩小它们听起来很性感。特别是在NginX被用来创建像maxcdn/netdna中的家伙一样的CDN的情况下。 – Frank 2012-07-12 16:22:07

+0

顺便说一句,cloudflare cdn提供了很多minify/cdn内置在一个。问题是他们有重大延迟投诉。 http://x-pose.org/2012/02/speed-up-your-site-disable-cloudflare/ – Frank 2012-07-12 16:31:59

回答

5

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

最佳实践是在对生产进行部署之前在本地系统上进行混淆处理,这很容易说并且难度很大,请参阅the google way来压缩静态资产。一旦你的资产准备好使用,我们可以设置nginx配置。

答案:

  1. 使用再压缩前&模糊处理生产部署

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

    位置〜^ /(资产寻找资产|图像| javascripts |样式表| swfs |系统)/ { gzip_static on; expires max; add_header Cache-Control public; add_header Last-Modified“”; add_header ETag“”; 休息; }

  3. 使用gzip的gzip_static上服务gzip压缩的文件,而不是压缩每次都当请求到来。

  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; 
    } 

    } 

} 
+0

建立优化设置的nginx,你可以使用这个要点https://gist.github.com/3052776 – Anatoly 2012-07-14 11:58:03

+0

我不知道为什么这是被拒绝的,这是一个很好的开始。但我们要做的是在反向代理之前直接进行Minify。原因是我们有IIS/Apache服务器的混合。不使用MVC时,IIS上的缩小比例是有限的。手动执行它只是简单的unsexy,并且每次我们推送更新时都会创建额外的todos。 – Frank 2012-07-14 21:39:22

+0

@Frank我明白你的意思,但让我解释我们如何处理资产压缩。由于我们有零宕机时间的部署,我们试图减少部署时间,所有额外的工作都在发布特殊脚本之前完成,它都是自动化的。之后,所有事情都将在回购中完成。我对这个perl模块有一个疑问 - 这是如何避免dogpile效应的? – Anatoly 2012-07-15 06:38:36