2012-06-07 7 views
5

Estoy usando Nginx frente al unicornio. Cuando la aplicación tiene mucha carga y todos los trabajadores del unicornio están ocupados, nginx devolverá una respuesta 502 diciendo que la puerta de enlace está mal configurada. Estoy de acuerdo con este comportamiento, pero en esta condición quiero que nginx devuelva un código de respuesta 503 (servidor ocupado, intente de nuevo más tarde), que es una respuesta mucho más apropiada.Cambia el código de estado que Nginx devuelve cuando el unicornio está ocupado

vi esta respuesta: Is it possible to change the HTTP status code returned when proxy_pass gateway is down in nginx?

que describe cómo volver a escribir algunos códigos de estado devueltos por el proxy ascendente:

location/{ 
    proxy_pass http://backend; 
    proxy_intercept_errors on; 
    error_page 502 503 504 =503 @proxyisdown; # always reply with 503 
} 

location @proxyisdown { 
    add_header Retry-After 500; 
    index my_pretty_error_page.html; 
} 

Pero hay 2 problemas con esto:

  1. La aplicación ascendente a veces devuelve códigos de respuesta 502 para situaciones válidas que deben conservarse
  2. No estoy seguro de que el proxy en sentido ascendente devuelva este código de estado erróneo, es más probable que nginx no pueda colocar el elemento en el búfer (tcp?) Y luego nginx devuelva el código de estado engañoso.

¿Hay alguna forma de que pueda controlar el código de estado devuelto por nginx en esta situación para que sea un 503 en lugar de un 502?

+0

¿Por qué configura 'proxy_intercept_errors on;' si no desea interceptar errores del proxy? ¿Y por qué crees que "nginx devuelve el código de estado engañoso"? – VBart

+1

El ejemplo de código es de la pregunta a la que se hace referencia dentro de mi pregunta, no es mi código. Creo que nginx devuelve un código de estado engañoso porque se devuelve un 502 cuando el servidor web ascendente no tiene ninguna capacidad adicional. El servidor no está mal configurado, simplemente está ocupado, debería ser un 503. – Macdiesel

+1

¿Cómo puede saber nginx que el servidor está ocupado si no responde correctamente? – VBart

Respuesta

0

¿Ha considerado abordar esto con el servidor back-end? Ajuste el número de clientes que acepta el servidor de respaldo, para que las solicitudes a él generalmente tengan éxito o fallen, y no se quede atascado en el estado de melaza que devuelve 503. Idealmente, podrá sintonizar el servidor de fondo para devolver 503 cuando se quede sin clientes disponibles, y Nginx continuará devolviendo 502 cuando el servidor de back-end esté realmente inactivo.

Cuestiones relacionadas