2009-03-25 30 views
40

Mi servidor estaba funcionando bien hasta ayer. Estaba ejecutando Redmine, y era el pequeño servidor más feliz hasta mi "amigo" importó una tabla SQL que mi pequeño no podía tomar. Desafortunadamente, después de una hora de tratar de hacer que el tipo lil respondiera, tuvimos que darle un ciclo a él.¿Por qué recibo un error Apache Proxy 503?

Ahora después de reiniciar, obtenemos un error 503 al tratar de visitar el dominio conectado a Redmine. Está conectado a un daemon Mongrel, y usamos Apache Proxy para dirigir todas las conexiones al puerto en el que se está ejecutando Redmine.

Usando Lynx en el servidor (http://localhost:8000) puede ver que la aplicación Ruby funciona bien. Pero este bit no está funcionando en mi archivo de configuración de Apache:

<VirtualHost *:80> 
    ServerName sub.example.com 
    ProxyPass/http://localhost:8000 
    ProxyPassReverse/http://localhost:8000 
    ProxyPreserveHost on 
    LogLevel debug 
</VirtualHost> 

Aquí está la salida de registro de errores de Apache:

 
[debug] mod_proxy_http.c(54): proxy: HTTP: canonicalising URL //localhost:8000 
[debug] proxy_util.c(1335): [client 216.27.137.51] proxy: http: found worker http://localhost:8000 for http://localhost:8000/ 
[debug] mod_proxy.c(756): Running scheme http handler (attempt 0) 
[debug] mod_proxy_http.c(1687): proxy: HTTP: serving URL http://localhost:8000/ 
[debug] proxy_util.c(1755): proxy: HTTP: has acquired connection for (localhost) 
[debug] proxy_util.c(1815): proxy: connecting http://localhost:8000/ to localhost:8000 
[debug] proxy_util.c(1908): proxy: connected/to localhost:8000 
[debug] proxy_util.c(2002): proxy: HTTP: fam 2 socket created to connect to localhost 

[error] (13)Permission denied: proxy: HTTP: attempt to connect to 127.0.0.1:8000 (localhost) failed 
[error] ap_proxy_connect_backend disabling worker for (localhost) 

[debug] proxy_util.c(1773): proxy: HTTP: has released connection for (localhost) 
+0

Hola, por favor, vuelva a la siguiente publicación. Como su error similar es http://stackoverflow.com/questions/9461086/tomcat-application-not-responding-with-no-logs/23710275#23710275 –

Respuesta

-1

Para que esto funcione, necesitaba activar SELinux, y luego agregar barras diagonales a las líneas "localhost: 8000".

Aquí está el código para desactivar SELinux:

echo 0 >/selinux/enforce 
+7

Eso es un agujero de seguridad – Antonio

+0

Tampoco explica por qué la aplicación funcionó durante un tiempo, luego falló al reiniciar. Es * posible * el OP se estaba ejecutando con SELinux deshabilitado, luego se habilitó automáticamente al reiniciar, pero la situación dada en la respuesta de exshovelrydr es mucho más probable. –

+1

No debe apagar selinux, simplemente deshabilite la política./usr/sbin/setsebool httpd_can_network_connect verdadero –

2

¿Estás seguro de que están reiniciando en el orden correcto? He tenido problemas extraños en los que se inicia Apache, luego se inicia Mongrel y, aunque Mongrel se está ejecutando, Apache aún arroja el error de proxy.

He resuelto esto en el pasado con varios conjuros y reinicios de Apache y, finalmente, los dioses están felices. Parece que a veces los procesos de Mongrel no se cierran correctamente, así que tienes que matarlos manualmente. Aquí hay un link con algo de [posible] ayuda.

Terminé agregando una opción "matar" a mi secuencia de comandos mongrel /etc/init.d/ porque sucedió tanto. Se detiene Mongrel, mató a todas las sesiones de Mongrel, inició Mongrel y reinició Apache.

<snip> 
    kill) 
     echo "Stopping, killing, starting, and restarting Apache..." 
     mongrel_cluster_ctl stop -c $CONF_DIR --clean 
     killall -u mongrel 
     mongrel_cluster_ctl start -c $CONF_DIR --clean 
     /etc/init.d/httpd restart 
     RETVAL=$? 
    ;; 
</snip> 

Probablemente no era una solución muy buena, pero el mal se fue.

+0

desafortunadamente eso no funciona :( – blackrobot

+0

La respuesta de exshovelrydr explica por qué el orden importa, y cómo cambiar la configuración de Apache para que la orden de inicio * no * importe. –

1

intente ejecutar Monit para controlar sus chuchos detrás de Apache, y de esa manera se puede reiniciar mestizos para que si mueren o se acercan demasiado hambriento de memoria. Si por alguna razón Apache aún se confunde, puede que tenga que reiniciar apache y debería resolverse solo, pero para el 99% de los casos tener Monit vigilando a sus mestizos debería evitar que esto vuelva a ocurrir. La otra opción es buscar en Phusion Passenger.

+0

lol un voto a favor en una respuesta de 6 años sin explicación. – nitecoder

30

Ejecutar comando siguiente

# /usr/sbin/setsebool httpd_can_network_connect 1 

O

# /usr/sbin/setsebool httpd_can_network_connect true 

y después de que httpd restart

# service httpd restart 
+5

setseboo l -P ... hace que los cambios persistan. –

+2

Esto no me sirve de nada. Apache + mongrel Esto está deshabilitando el SELinux y no puedo ver ninguna relación con la pregunta. –

77

Apache responderá con de 503 durante al menos 60 segundos en cualquier momento se detecta que el servidor de back-end está inactivo. Este es el comportamiento predeterminado.Como en su ejemplo, si reinicia su servidor backend (Rails en este ejemplo) y alguien intenta acceder a él a través del proxy Apache antes de que Rails esté listo, Apache devolverá los 503 durante los próximos 60 segundos independientemente de si su servidor ahora está 'activo' . Por favor, vea la documentación de Apache en ProxyPass donde se afirma:

reintento 60

Conexión de trabajo de grupo plazo de reintento en segundos. Si el trabajador del grupo de conexión al servidor back-end está en el estado de error, Apache no reenviará ninguna solicitud a ese servidor hasta que expire el tiempo de espera. Esto permite cerrar el servidor backend para mantenimiento y volver a ponerlo en línea más adelante. Un valor de 0 significa siempre reintentar a los trabajadores en un estado de error sin tiempo de espera.

Así que si cambia el paso de proxy para incluir reintentos = 0 no verá del 503 al reiniciar el servicio de back-end. ¡Esto también es útil cuando se usa Apache como proxy inverso durante el desarrollo! Por ejemplo:

ProxyPass/http://localhost:8000 reintentos = 0

+6

Como referencia, un enlace a [documentos ProxyPass para Apache 2.2] (http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypass). – Pistos

+0

¿Es lo mismo que nginx? – HFX

0

En primer lugar comprobar si el puerto 8080 está escuchando o no por el siguiente comando

netstat -tlpn 

Si no que reiniciar el servidor Jenkins por el siguiente comando

sudo /etc/init.d/jenkins start 

It sh debería funcionar ahora. Espero eso ayude.

0

Puño, debe instalar selinux: (SELinux significa Security-Enhanced Linux.)

apt-get install selinux 

Después de eso, se puede habilitar la Política de Seguridad de SElinux por el comando siguiente:

sed -i 's/SELINUX=.*/SELINUX=permissive/' /etc/selinux/config 

Aviso :

#  enforcing - SELinux security policy is enforced. 
#  permissive - SELinux prints warnings instead of enforcing. 
#  disabled - No SELinux policy is loaded. 

Final, reinicie apache!

+2

Su respuesta cambia la configuración SELINUX dos veces? Desactivar selinux ya es la respuesta aceptada. No estoy seguro de lo que está agregando aquí. Además, comente/explique lo que hace su respuesta; esto mejora el valor a largo plazo de SO. –

+0

Lo siento, el inglés no es mi lengua materna, así que estoy un poco atrapado en la interpretación de texto :) –

+0

- He encontrado este error y lo arreglé con la declaración anterior. SELinux significa Security-Enhanced Linux. Es una forma de mejorar la seguridad del servidor. Cuando SELinux está habilitado, Apache utilizará la política de SELinux en lugar de la política de Apache. –

Cuestiones relacionadas