2012-06-14 16 views
9

Sto provando a creare un file conf di nginx che ha una piccola ripetizione in esso. Sto usando nginx per servire i file statici, e proxy 404 o contenuti PHP per la posizione @varnish nome:Come avere più blocchi di posizione utilizzare lo stesso nome @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; 
} 

Per la situazione "standard" per cui nginx dovrebbe controllare per vedere se ha un file e quindi passare fino al backend, funziona bene il seguente:

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

Tuttavia, per PHP, io non voglio nemmeno la pena di provare il file, si deve solo reindirizzare immediatamente la richiesta al @varnish:

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

Tuttavia, questo non sembra funzionare. Sembra un dolore avere due blocchi separati identici (uno per @backend e uno per php) che fanno riferimento allo stesso proxy, ed è il tipo di problema in cui gli umani possono dimenticare di mettere qualcosa in uno e non nell'altro.

risposta

12

Se si inseriscono le impostazioni del proxy nel contesto del server e si lascia che le posizioni li ereditino, non è molto da duplicare. È anche possibile impostare un blocco upstream per facilitare la modifica del target proxy nel caso sia necessario:

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

Ha funzionato come un incantesimo! – shrikeh

Problemi correlati