2012-06-14 10 views
9

Estoy tratando de crear un archivo nginx conf que tenga poca repetición en él. Estoy usando nginx para servir archivos estáticos, y proxies 404 o contenidos PHP para la ubicación @varnish llamado:Cómo tener múltiples bloques de ubicación use el mismo nombre @ ubicación

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

Para la situación "normal" por el que nginx debe comprobar para ver si tiene un archivo y luego pasar hasta el back-end, el siguiente funciona bien:

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

sin embargo, para PHP, ni siquiera quiero que probar el archivo, se debe simplemente redirigir inmediatamente la solicitud de @varnish:

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

Sin embargo, esto no parece funcionar. Parece un dolor tener dos bloques separados casi idénticos (uno para @backend y otro para php) que hacen referencia al mismo proxy, y es el tipo de problema en el que los humanos pueden olvidarse de poner algo en uno y no en el otro.

Respuesta

12

Si coloca la configuración de proxy en el contexto del servidor y deja que las ubicaciones la hereden, entonces no es mucho para duplicar. También puede configurar un bloque ascendente para que sea más fácil cambiar el destino proxy en caso de que lo necesite:

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

¡Funcionó como un encanto! – shrikeh

Cuestiones relacionadas