2011-04-08 19 views
10

he aprendido cómo conseguir Nginx para volver 503 páginas de error del cliente, pero no puedo encontrar la manera de hacer lo siguiente: archivo de configuración¿Cómo puedo configurar una página de error 503 personalizada en NGINX?

muestra:

location/{ 
     root www; 
     index index.php; 
     try_files /503.html =503; 
    } 

    error_page 503 /503.html; 
    location = /503.html { 
     root www; 
    } 

Como se puede ver, de acuerdo con el código anterior, si una página llamada 503.html se encuentra en mi directorio raíz, el sitio devolverá esta página al usuario.

Pero parece que aunque el código anterior funciona cuando alguien simplemente visita mi sitio tecleando

no lo hace peticiones trampa como:

Con mi código, el usuario aún puede ver la página de perfil o cualquier otra página además de index.php.

La pregunta:

¿Cómo puedo atrapar solicitudes a todas las páginas en mi sitio y las remitirá al 503.html503.html siempre está presente en mi carpeta de raíz?

Respuesta

6

Actualizado: cambiado "if -f" a "try_files".

Prueba esto:

server { 
    listen  80; 
    server_name mysite.com; 
    root /var/www/mysite.com/; 

    location/{ 
     try_files /maintenance.html $uri $uri/ @maintenance; 

     # When maintenance ends, just mv maintenance.html from $root 
     ... # the rest of your config goes here 
    } 

    location @maintenance { 
     return 503; 
    } 

} 

Más información:

https://serverfault.com/questions/18994/nginx-best-practices

http://wiki.nginx.org/HttpCoreModule#try_files

+0

try_files es la mejor práctica. Además, no falta. Es solo incompleto. – ASPiRE

+0

@Vini cuál es la diferencia entre no faltar e incompleto, para mí es lo mismo. Actualicé el ejemplo para incluir try_files en lugar de if -f. Espero que ayude. –

+0

Gracias Ken. Por cierto, ¿qué hace $ uri? Lo veo dos veces seguidas. – ASPiRE

5

La configuración de abajo funciona para cerca de la última nginx estable 1.2.4. No pude encontrar una forma de habilitar una página de mantenimiento sin usar un if pero aparentemente de acuerdo con IfIsEvil es un if.

  • Para habilitar el mantenimiento touch /srv/sites/blah/public/maintenance.enable. Puede rm el archivo para deshabilitar.
  • El error 502 se mapeará en 503, que es lo que la mayoría de la gente quiere. No desea darle a Google un 502.
  • personalizado 502 y 503 páginas. Tu aplicación generará las otras páginas de error.

Existen otras configuraciones en la web pero no parecen funcionar en la última nginx.

server { 
    listen  80; 
    server_name blah.com; 

    access_log /srv/sites/blah/logs/access.log; 
    error_log /srv/sites/blah/logs/error.log; 

    root /srv/sites/blah/public/; 
    index index.html; 

    location/{ 
     if (-f $document_root/maintenance.enable) { 
      return 503; 
     } 
     try_files /override.html @tomcat; 
    } 

    location = /502.html { 
    } 

    location @maintenance { 
     rewrite ^(.*)$ /maintenance.html break; 
    } 

    error_page 503 @maintenance; 
    error_page 502 =503 /502.html; 

    location @tomcat { 
     client_max_body_size 50M; 

     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 Referer $http_referer; 
     proxy_set_header X-Forwarded-Proto http; 
     proxy_pass http://tomcat; 
     proxy_redirect off; 
    } 
} 
+0

Gracias por esto. No pude encontrar una manera de hacerlo sin usar un 'si' tampoco. Me alegra ver que es un uso aceptable! –

3

Las otras respuestas son ambas correctas, pero sólo para añadir, que si se utiliza proxies internos también hay que añadir proxy_intercept_errors on; en uno de los servidores proxy.

Así, por ejemplo ...

proxy_intercept_errors on; 
    root /var/www/site.com/public; 
    error_page 503 @503; 
    location @503 { 
     rewrite ^(.*)$ /scripts/503.html break; 
    } 
Cuestiones relacionadas