kn007的个人博客
♥ You are here: > > > 详谈nginx如何使用转发规则异步请求目标地址

详谈nginx如何使用转发规则异步请求目标地址

by | 48 Comments

瓜瓜Mr.小可的要求,详细(废话多一点)的说一下怎么解决相册请求的图片地址必须为本地,将其改为远程的办法。。。

改PHP什么的就不用我废话了,大家不用继续看下去了。。。本文不讲这个。

讲的是文章将相册请求转接到又拍云,并用ImageMagick压缩中有关如何将相册请求的本地地址,请求到又拍云。

我的相册是Imagevue,第一次看见他,是在SAM老哥那看到的。具体文件呢,也是SAM老哥慷慨提供(之前下的不知为毛不能用)。

这个相册不错,但是呢,只能请求本地文件夹,虽然偶带宽什么都是够多,但是也不想过多的图片在我的服务器上,而且又搞了又拍云(你妹的,又拍云就是为相册买的,有木有,不能用,搞毛啊),不能读取远程又拍云图片真是太坑爹了。

在上面那个传送门文章,我说了使用了nginx直接重定向向到又拍云,会使得Imagevue相册无法打开。悲剧。于是偶采用了另类办法。

Imagevue相册请求的图片地址是我的本地目录的/content/目录,里面还有小目录,细分是什么名字的相册。于是我利用nginx将所有请求到该目录的地址,一律转发到又拍云,为了不使得非图片文件转发到远程读取,我限定了,只有jpg|JPG才能读取,因为我里面只有jpg的图片,为毛有大小写呢?因为linux是区分大小写。

具体的nginx.conf是:

server {
   listen       11314;
   server_name default;
   index index.php;
   root  /data/album;
   location ~ /content/.*\.(JPG|jpg)$  {
       expires      30d;
       rewrite ^/content/(.*)$ /content/$1 break;
       proxy_pass http://kn007.b0.upaiyun.com;
    }
       location ~ .*\.(php|php5)?$
           {
               try_files $uri =404;
               fastcgi_pass  unix:/tmp/php-cgi.sock;
               fastcgi_index index.php;
               include fcgi.conf;
           }
   access_log off;
}

 当然啦,要是图片有显示必须确保http://kn007.b0.upaiyun.com/content/是存在并且按照规定放置图片的。

大概请求示意图:

这样就ok了。。。据说ngg请求本地目录是/wp-content/gallery/,那么,同上,可得:

server {
   listen       11314;
   server_name default;
   index index.php;
   root  /data/album;
   location ~ /wp-content/gallery/.*\.(JPG|jpg)$  {
       expires      30d;
       rewrite ^/wp-content/gallery/(.*)$ /ngg/$1 break;
       proxy_pass http://kn007.b0.upaiyun.com;
    }
       location ~ .*\.(php|php5)?$
           {
               try_files $uri =404;
               fastcgi_pass  unix:/tmp/php-cgi.sock;
               fastcgi_index index.php;
               include fcgi.conf;
           }
   access_log off;
}

确保http://kn007.b0.upaiyun.com/ngg/是存在并且按照规定放置图片的就ok了。

因此,ngg的请求也异步到了又拍。。。

使用异步定向,也就是保持了原始地址读取,实际由指定地址读取内容。(这样的话,对本身主机响应请求速度有要求,图片不耗本机流量,请求的流量很小,可忽略不计)。

最后还是提提偶的相册地址 album.kn007.net

转载请注明转自:kn007的个人博客的《详谈nginx如何使用转发规则异步请求目标地址

donate
有所帮助?

Comments

48 Comments立即评论
Loading...
  1. :cry: 看不懂 :x

    1. MOD回复

      @小可: 不懂问百度。。 :lol:

  2. 回复

    有一个疑问。这样转发、Nginx 相当于反向代理。为什么图片可以不耗本机流量?这数据是实测的吗?

    1. MOD回复

      @wifay: 呵呵,事实胜于雄辩,你为何不测试一下。你所需要耗的只是服务器的响应,这个流量可以忽略不计。你可以在转发的服务器上存在文件,在本地不存在就清楚了。或者都存在,查看nginx的日志,你就可以发现了。。当然啦,这个说的是可行性。你说流量的外流反向的问题,我是这样判断的。第一,我自身长时候后访问的流量统计,实际并未增多,其次又拍云是我所使用的转发服务器,他记录的实际ip,而不是我服务器的ip。正常来说服务器反向的话,也应该是服务器的ip才对。还有一个猜测的来源是来自于当服务器受到cc流量攻击时,nginx转发除了减少服务器负担,也会相应减少流量消耗。可能nginx这方面可以配置,或者可能我用了squid。

    2. 回复

      @kn007: 囧、最近正准备把网站的图片做多重负载,才遇到了这个问题,网站本身每天图片流量过大,不便用作测试;用了博客做了小规模测试,流量又计算不出来。就是因为查看 Nginx 日志记录、作为反向代理的前端Nginx和后端Nginx日志都有图片文件大小的数据输出记录。问题就在“又拍云”或者说后端Nginx上面,如果不做特别处理,后端Nginx的日志记录的全部是来自前端Nginx单个IP的访问记录,所以我才产生了这个疑问。

    3. MOD回复

      @wifay: 嗯,这个问题确实值得探讨,我确实并未深入了解。不过就当时测试而言,前端流量的消耗并不大,而且探针的网卡数据反应不大。

  3. 七七,这代码貌似有问题啊。我在米国VPS放了一个test.jpg大小为200KB,然后在又拍放了一个同名的test.jpg 大小为100KB,但是我去浏览器测试的时候发现下载下来的图片是200KB的,也是是说不是又拍云的,这个改咋办啊?

    1. MOD回复

      @天域剑客: 删除你的vps的文件,有什么结果?

  4. 相册在这里 album.tyjk.org

    1. MOD回复

      @天域剑客: 我看了没用,我监测不到的

icon_wink.gificon_neutral.gificon_mad.gificon_twisted.gificon_smile.gificon_eek.gificon_sad.gificon_rolleyes.gificon_razz.gificon_redface.gificon_surprised.gificon_mrgreen.gificon_lol.gificon_idea.gificon_biggrin.gificon_evil.gificon_cry.gificon_cool.gificon_arrow.gificon_confused.gificon_question.gificon_exclaim.gif