2014-01-08 21 views
0

提供静态文件我有两台不同的机器(不同的IP不会忽略)实现2台服务器。让我们称之为serverA的serverB上NGINX:从不同的地点

serverA是其中服务器B将为某些静态文件提供数据。

serverA的配置文件是:

limit_req_zone $binary_remote_addr zone=lmz_serverA:10m rate=5r/s; 

server { 
    listen 80; ## listen for ipv4; this line is default and implied 

    server_name serverA; 

    location /server_a { 
    limit_req zone=lmz_serverA burst=5 nodelay; 
    rewrite /server_a/(.*) /$1 break; 
    proxy_intercept_errors  on; 
    proxy_pass http://0.0.0.0:8080; 
    proxy_redirect off; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 


    location /static/BIG/ { 
    root /safe/server_a/; 
    autoindex off; 
    expires 7d; 
    } 

    location /server_a/static/{ 
    root /safe/; 
    autoindex off; 
    expires 7d; 
    } 

    location = /favicon.ico{ 
    alias /safe/server_a/static/images/favicon.ico; 
    } 
} 

serverB上配置文件是:

limit_req_zone $binary_remote_addr zone=lmz_serverB:10m rate=5r/s; 

server { 
    listen 80; ## listen for ipv4; this line is default and implied 

    server_name serverB; 

    location /server_b { 
    limit_req zone=lmz_serverB burst=5 nodelay; 
    rewrite /server_b/(.*) /$1 break; 
    proxy_intercept_errors  on; 
    proxy_pass http://1.0.0.0:8080; 
    proxy_redirect off; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 

    location /server_b/static/ { 
    root /safe/; 
    autoindex off; 
    expires 7d; 
    } 

---结束

现在,想象,这个服务器在不同的大洲..一些静态文件是好吧serverA的送达,但BIG(/静态/ BIG /)的东西是给我一些麻烦,因为大多数用户都在serverB上的同一个大陆。所以我想从serverA的削减那些大的静态文件,并把它们放在serverB上,使他们能够更方便地下载。

有没有人有任何想法,我怎么才能做到这一点,只是通过使这些文件可用serverB和更改nginx配置文件?

重要serverA的实现名为的appA Django应用程序,并serverB上实现名为appB的不同(但仍Django的)应用程序。我无法更改这两个应用程序的代码。

在此先感谢!

回答

0

您可以从想另外一个服务于大文件的服务器做了302 Moved Temporarily重定向。

server_name serverA; 
location /static/BIG/ { 
    return 302 $scheme://serverB$uri; 
} 
+0

谢谢,我会试一试! serverB是否直接将文件提供给请求者,或者文件将从serverB传递到serverA,然后提供服务(使serverA工作一个代理)?我希望这些文件直接提供服务,因为在另一种情况下,我不会获得任何收益。 –

+0

他们将直接送达。但请注意,仍然会向serverA发出请求(伴随一个非常小的重定向响应),因此延迟会受到影响 - 如果这不是您想要的,那么您应该直接将html更改为reference/static/BIG /在serverB上。 – cnst

+0

不好意思,但是......在“return 302 $ scheme:// serverB $ uri;”处 如果serverB的ip:1.1.1.1和文件夹和位置是相同的/ static/BIG你将如何重写该行? return 302 $ scheme:http://1.1.1.1/static/BIG ??? –

0

我无意中发现了这一点的同时寻找类似的东西 - 如何服务于不同的文件名比什么要求。我的最终解决方案:

location /robots.txt { 
     # Try the beta file, which has a disallow everything 
     root /location/to/static/files; 
     try_files /robots-beta.txt =404; 
}