2015-05-07 40 views
0

我有我的虚拟服务器之一以下nginx的配置:如何修复这个nginx配置与几乎重复的代理位置?

upstream app_example_https { 
    server 127.0.0.1:1340; 
} 

proxy_cache_path /Users/jaanus/dev/nginxcache levels=1:2 keys_zone=S3CACHE:10m; 
proxy_cache_key "$scheme$request_method$host$request_uri"; 

server { 
    listen 0.0.0.0:1338; 
    server_name localhost; 

    ssl on; 
    ssl_certificate /Users/jaanus/dev/devHttpsCert.pem; 
    ssl_certificate_key /Users/jaanus/dev/devHttpsKey.pem; 

    location =/{ 

    proxy_http_version  1.1; 
    proxy_set_header  Connection ""; 
    proxy_set_header  Host 'something.s3-website-us-east-1.amazonaws.com'; 
    proxy_set_header  Authorization ''; 
    proxy_hide_header  x-amz-id-2; 
    proxy_hide_header  x-amz-request-id; 
    proxy_hide_header  Set-Cookie; 
    proxy_ignore_headers Set-Cookie; 

    proxy_cache   S3CACHE; 
    proxy_cache_valid  any 60m; 
    add_header    X-Cached $upstream_cache_status; 

    proxy_pass    http://something.s3-website-us-east-1.amazonaws.com/; 

    } 

    location /static/ { 

    proxy_http_version  1.1; 
    proxy_set_header  Connection ""; 
    proxy_set_header  Host 'something.s3-website-us-east-1.amazonaws.com'; 
    proxy_set_header  Authorization ''; 
    proxy_hide_header  x-amz-id-2; 
    proxy_hide_header  x-amz-request-id; 
    proxy_hide_header  Set-Cookie; 
    proxy_ignore_headers Set-Cookie; 

    proxy_cache   S3CACHE; 
    proxy_cache_valid  any 60m; 
    add_header    X-Cached $upstream_cache_status; 

    proxy_pass    http://something.s3-website-us-east-1.amazonaws.com/static/; 

    } 


    location/{ 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-NginX-Proxy true; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_pass http://app_example_https/; 
    proxy_redirect off; 
    } 
} 

这里做英文:

有供应请求无论是从静态的亚马逊S3站点或应用程序的nginx的前端服务器。

对/(站点根)和/ static的所有请求都是从Amazon S3反向代理的。所有其他请求都是从应用程序服务器反向代理的。

现在,问题:S3有两个几乎相同的位置块。这是我如何使配置工作的唯一方式,其中两个特定的文件夹(root和/静态)由S3提供,其他所有内容都转到应用程序服务器。

两个几乎相同的块看起来很笨,不可扩展。当我添加这样的文件夹时,我不想重复块。

如何将两个位置合并到一个位置块中,同时保持所有工作方式相同?

+0

将重复的部分放入外部文件并包含它。 –

+0

有趣。这将工作,并使其看起来更好,但它仍然需要几个位置块。我更喜欢一些让我只用两个位置块(一个用于S3,另一个用于应用服务器)的东西。 – Jaanus

+0

这是个坏主意。几个简单的地点比例如地理位置更容易理解(并且更高效)。奇怪的正则表达式位置。 –

回答

2

你可以把重复的部分放到外部文件中并且include它。

amazon.inc

proxy_http_version  1.1; 
proxy_set_header  Connection ""; 
proxy_set_header  Host 'something.s3-website-us-east-1.amazonaws.com'; 
proxy_set_header  Authorization ''; 
proxy_hide_header  x-amz-id-2; 
proxy_hide_header  x-amz-request-id; 
proxy_hide_header  Set-Cookie; 
proxy_ignore_headers Set-Cookie; 

proxy_cache   S3CACHE; 
proxy_cache_valid  any 60m; 
add_header    X-Cached $upstream_cache_status; 

proxy_pass    http://something.s3-website-us-east-1.amazonaws.com; 

你的配置

location =/{ 
    include amazon.inc; 
} 

location /static/ { 
    include amazon.inc; 
} 

location/{ 
    # proxy to you app 
} 

如果您希望保留所有在一个文件中,你可以使用这一招:

error_page 470 = @amazon; 
location =/{ 
    return 470; 
} 

location /static/ { 
    return 470; 
} 

location @amazon { 
    # proxy to amazon 
} 

你可以使用正则表达式合并几个location一起,但我不会推荐这样做,因为它很难阅读和理解,并且比简单的前缀位置效率低。但是,仅作为示例:

# NOT RECOMMENDED 
location ~ ^/($|static/) { 
    # proxy to amazon 
}