2012-06-14 45 views
9

我正在嘗試創建一個nginx conf文件,其中有很少的重複。我使用nginx的爲靜態文件,以及它代理404或PHP內容到指定的位置@varnish:如何讓多個位置塊使用相同的命名@location

location @varnish { 
    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; 
    proxy_pass_header Set-Cookie; 
    proxy_pass http://localhost:6081; 
    proxy_set_header Request-URI $request_uri; 
} 

對於「標準」的情況,即nginx的要檢查,看它是否有一個文件,然後通過通過到後端,以下工作正常:但是

location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { 
    access_log  off; 
    add_header  Pragma public; 
    add_header Cache-Control "public, must-revalidate, proxy-revalidate"; 
    expires   max; 
    open_file_cache_valid 120m; 
    try_files $uri @varnish; 
} 

,對於PHP,我甚至不希望其嘗試的文件,它應該只是立即將請求重定向到@varnish:

location ~ \.php$ { 
    rewrite . @varnish last; 
} 

但是,這似乎不起作用。讓兩個單獨的幾乎相同的塊(一個用於@backend,另一個用於php)引用相同的代理似乎是一種痛苦,並且是人類可以忘記將某個東西放在一個而不是另一箇中的問題。

回答

12

如果您將代理設置放入服務器上下文中並讓位置繼承它們,那麼它沒有太多的重複。您還可以設置上游區塊,以便更容易地更改代理目標,如果您需要:

upstream _varnish { 
    server localhost:6081; 
} 

server { 
    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; 
    proxy_set_header Request-URI $request_uri; 
    proxy_pass_header Set-Cookie; 

    location @varnish { 
    proxy_pass http://_varnish; 
    } 

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { 
    access_log off; 
    add_header Pragma public; 
    add_header Cache-Control "public, must-revalidate, proxy-revalidate"; 
    expires max; 
    open_file_cache_valid 120m; 
    try_files $uri @varnish; 
    } 

    location ~ \.php$ { 
    proxy_pass http://_varnish; 
    } 
} 
+0

工作就像一個魅力! – shrikeh

相關問題