2012-06-14 11 views
9

少し繰り返しているnginx confファイルを作成しようとしています。 nginxのは、それがファイルを持っているかどうかを確認してから渡す必要となる複数のロケーションブロックを同じ名前の@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のを使用しています、そして、それは名前の場所@varnishに404エラーやPHPのコンテンツをプロキシバックエンドに至るまで、次は正常に動作します:

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

しかし、これは動作していないようです。同じプロキシを参照する2つの別々のほぼ同一のブロック(@ 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

関連する問題