Error interno 500 Apache, pero ¿nada en los registros?

122

Recibo 500 errores de servidor interno cuando intento hacer un HTTP POST a una dirección específica en mi aplicación. He examinado los registros del servidor en el directorio de registro personalizado especificado en el archivo de hosts virtuales, pero el error no aparece allí, por lo que depurarlo ha sido un dolor de cabeza.

¿Cómo hago para que Apache registre los errores internos 500 en el registro de errores?

wcolbert
fuente
1
Tuve el mismo problema al usar PHP con hosts virtuales ... sin errores (Apache2, Ubuntu). Terminó faltando módulos PHP (mysql, json, etc.)
1
En el nuestro, los estaba enviando al registro de acceso (presumiblemente porque desde el punto de vista de Apache, estaba funcionando correctamente y simplemente los estaba pasando, desde una capa más profunda, en nuestro caso, Passenger / Rails). Solo pongo esta nota aquí en caso de que alguien se esté rascando la cabeza.
Tom Hundt

Respuestas:

-4

Tenga en cuenta: El póster original no preguntaba específicamente sobre PHP. Todas las respuestas centradas en php hacen grandes suposiciones que no son relevantes para la pregunta real.

El registro de errores predeterminado, a diferencia de los registros de errores de los scripts, generalmente tiene el error (más) específico. a menudo serán los permisos denegados o incluso un intérprete que no se puede encontrar.

Esto significa que la falla casi siempre recae en su script. Por ejemplo, ¿cargó un script en Perl pero no le dio permisos de ejecución? o tal vez se corrompió en un entorno Linux, si escribe el script en Windows y luego lo carga al servidor sin que se conviertan los finales de línea, obtendrá este error.

en perl si te olvidas

print "content-type: text/html\r\n\r\n";

obtendrás este error

Hay muchas razones para ello. así que primero verifique su registro de errores y luego proporcione más información.

El registro de errores predeterminado suele estar en /var/log/httpd/error_logo /var/log/apache2/error.log.

La razón por la que consulta los registros de errores predeterminados (como se indicó anteriormente) es porque los errores no siempre se publican en el registro de errores personalizado como se define en el host virtual.

Asume linux y no necesariamente perl

DesarrolladorChris
fuente
6
Revisé el ErrorLog del servidor y no se encuentra nada allí.
wcolbert
1
Tienes razón, resultó ser un problema con el script php. No se instaló la biblioteca PEAR. Lo instalé en mi VPS y todo está bien. ¡Gracias a todos!
wcolbert
260
¿Cómo puede ser la respuesta aceptada "por favor verifique los registros" a "por qué están vacíos mis registros"?
Álvaro González
4
Señalé al usuario los registros de errores predeterminados, no los registros de errores personalizados. A menudo, cuando un script falla por algún motivo, el error se envía a los registros de errores predeterminados
DeveloperChris
1
Con PHP, no tenía nada en los registros de errores de Apache configurados, pero encontré los errores con grep PHP /var/log/syslog. Probablemente porque tenía error_log = syslogdentro /etc/php5/apache2/php.ini.
mivk
145

¿Por qué los 500 errores internos del servidor no se registran en los registros de errores de Apache?

Los errores que causan el error 500 del servidor interno provienen de un módulo PHP. Por defecto, PHP NO registra estos errores. El motivo es que desea que las solicitudes web se realicen lo más rápido posible físicamente y es un peligro para la seguridad registrar errores en una pantalla donde los atacantes puedan observarlos.

Estas instrucciones para habilitar el registro de errores del servidor interno son para Ubuntu 12.10con PHP 5.3.10y Apache/2.2.22.

Asegúrese de que el registro de PHP esté activado:

  1. Busque su archivo php.ini:

    el@apollo:~$ locate php.ini
    /etc/php5/apache2/php.ini
    
  2. Edite ese archivo como root:

    sudo vi /etc/php5/apache2/php.ini
    
  3. Encuentre esta línea en php.ini:

    display_errors = Off
    
  4. Cambie la línea de arriba a esto:

    display_errors = On
    
  5. Más abajo en el archivo verá esto:

    ;display_startup_errors
    ;   Default Value: Off
    ;   Development Value: On
    ;   Production Value: Off
    
    ;error_reporting
    ;   Default Value: E_ALL & ~E_NOTICE
    ;   Development Value: E_ALL | E_STRICT
    ;   Production Value: E_ALL & ~E_DEPRECATED
    
  6. Los puntos y comas son comentarios, lo que significa que las líneas no tienen efecto. Cambie esas líneas para que se vean así:

    display_startup_errors = On
    ;   Default Value: Off
    ;   Development Value: On
    ;   Production Value: Off
    
    error_reporting = E_ALL
    ;   Default Value: E_ALL & ~E_NOTICE
    ;   Development Value: E_ALL | E_STRICT
    ;   Production Value: E_ALL & ~E_DEPRECATED
    

    Lo que esto le comunica a PHP es que queremos registrar todos estos errores. Advertencia, habrá un gran impacto en el rendimiento, por lo que no desea que esto esté habilitado en producción porque el registro requiere trabajo y el trabajo lleva tiempo, el tiempo cuesta dinero.

  7. Reiniciar PHP y Apache debería aplicar el cambio.

  8. Haga lo que hizo para causar el error 500 Internal Server nuevamente y verifique el registro:

    tail -f /var/log/apache2/error.log
    
  9. Debería ver el error 500 al final, algo como esto:

    [Wed Dec 11 01:00:40 2013] [error] [client 192.168.11.11] PHP Fatal error:  
    Call to undefined function Foobar\\byob\\penguin\\alert() in /yourproject/
    your_src/symfony/Controller/MessedUpController.php on line 249, referer: 
    https://nuclearreactor.com/abouttoblowup
    
Eric Leschinski
fuente
46
display_errorsimprime errores en la pantalla . log_errorsescribe errores en el archivo de registro .
daVe
11
Esta debería ser la respuesta canónica para esta pregunta.
David
9
@WanLiqun Es una información bastante buena, pero solo se aplica a PHP, que ni siquiera se menciona en la pregunta.
Álvaro González
1
"Los errores que causan el error 500 del servidor interno provienen de un módulo PHP. Por defecto, PHP NO registra estos errores". ¿Quién mencionó PHP? La desactivación de Server 500 Logging en PHP es una suposición y, con mayor frecuencia, una suposición incorrecta. Apache registrará errores del servidor 500 de un módulo con fallas (en este caso php) pero la mayoría de las veces irá a /var/log/apache2/error.log (asumiendo Debian o similar)
DeveloperChris
4
Esta respuesta comienza con un mal consejo para volcar errores en la pantalla.
luqo33
11

Verifique su registro de errores de php, que podría ser un archivo separado de su registro de errores de apache.

Encuéntrelo yendo a phpinfo()y verifique el atributo error_log. Si no está configurado. Configúrelo: https://stackoverflow.com/a/12835262/445131

Tal vez su post_max_size es demasiado pequeño para lo que está intentando publicar, o una de las otras configuraciones de memoria máxima es demasiado baja.

jsonH
fuente
1
La pregunta era: "¿Cómo puedo hacer que Apache registre los errores internos 500 en el registro de errores?" Probablemente debería ser un comentario.
jww
11

Me encontré con esto y se debió a una configuración incorrecta de mod_authnz_ldap en mi archivo .htaccess. No se registraba absolutamente nada, pero seguía recibiendo un error de 500.

Si se encuentra con este problema en particular, puede cambiar el nivel de registro de mod_authnz_ldap así:

LogLevel warn authnz_ldap_module:debug

Eso usará un nivel de registro de depuración para mod_authnz_ldap pero advertirá para todo lo demás ( https://httpd.apache.org/docs/2.4/en/mod/core.html#loglevel ).

bmaupin
fuente
1
La pregunta era: "¿Cómo puedo hacer que Apache registre los errores internos 500 en el registro de errores?" Probablemente debería ser un comentario.
jww
Buena observación. Agregué instrucciones para registrar esos errores.
bmaupin
7

Si la información de Error interno del servidor no aparece en los archivos de registro, probablemente deba reiniciar el servicio Apache .

Descubrí que Apache 2.4 (al menos en la plataforma Windows) tiende a negarse tercamente a vaciar los archivos de registro; en cambio, los datos registrados permanecen en la memoria durante bastante tiempo. Es una buena idea desde el punto de vista del rendimiento, pero puede resultar confuso durante el desarrollo.

Álvaro González
fuente
Esta fue la respuesta correcta para mí en Linux. Incluso después de eliminar el error.log original (que era un archivo de dispositivo de caracteres) y reemplazarlo con un error 777 táctil.log, Apache no escribiría en él hasta que se reiniciara.
Adelmar
2

Las respuestas de @ eric-leschinski son correctas.

Pero hay otro caso si la API de su servidor es FPM / FastCGI (predeterminado en Centos 8 o puede verificar usar la función phpinfo ())

En este caso:

  1. Ejecutar phpinfo()en un archivo php;
  2. Buscando Loaded Configuration Fileparam para ver dónde está el archivo de configuración para su PHP.
  3. Edite el archivo de configuración como la respuesta de @ eric-leschinski.
  4. Compruebe el Server APIparámetro. Si su servidor solo usa apache handle API -> reinicie apache. Si su servidor usa php-fpm, debe reiniciar el servicio php-fpm

    systemctl reiniciar php-fpm

    Verifique el archivo de registro en la carpeta de registro php-fpm. p.ej/var/log/php-fpm/www-error.log

Ngô Văn Thao
fuente
1

En mi caso fue la directiva ErrorLog en httpd.conf. Lo noté accidentalmente después de que me di por vencido. Decidió compartir el descubrimiento) Ahora sé dónde encontrar los 500 errores.

Eugene Lycenok
fuente
¿Puede poner más detalles en su respuesta
Yahya Hussein
Estoy usando Magento (CMS - Content Management System) para Apache. Hubo un error 500 en mi página usando las clases principales de Magento. No pude encontrar dónde podía ver el mensaje de error. De acuerdo con algunas respuestas aquí, intenté buscar en los registros de Apache / etc / httpd / logs / error_log. Pero no habia nada alli. Más tarde descubrí que hay una línea en mi httpd.conf para ese servidor web específico, que define la ruta del registro: <VirtualHost. ... ErrorLog / usr / www / log / error_log Así que necesitaba buscar un registro de host más específico, no el registro de apache común.
Eugene Lycenok
1

Agregue HttpProtocolOptions Unsafea su archivo de configuración de apache y reinicie el servidor apache. Muestra los detalles del error.

Sable
fuente
0

Verifique que la versión de php que está ejecutando coincida con su código base. Por ejemplo, su entorno local puede estar ejecutando php 5.4 (y las cosas van bien) y tal vez esté probando su código en una nueva máquina que tenga php 5.3 instalado. Si está utilizando una sintaxis 5.4 como [] para array (), obtendrá la situación que describió anteriormente.

John Erck
fuente
La pregunta era: "¿Cómo puedo hacer que Apache registre los errores internos 500 en el registro de errores?" Probablemente debería ser un comentario.
jww
0

Intente acceder a un archivo estático. Si esto tampoco funciona, vaya a todos los directorios desde la raíz "/" o "c: \" al directorio de su archivo y compruebe si contienen archivos ".htaccess".

Una vez dejé un archivo en "c: \" y tuvo los resultados más extraños.

Lothar
fuente
1
La pregunta era: "¿Cómo puedo hacer que Apache registre los errores internos 500 en el registro de errores?"
jww
0

Compruebe si está deshabilitado el informe de errores en alguna parte de su código.

Había un lugar en mi código donde lo deshabilité, así que agregué el código de depuración después:

require_once("inc/req.php");   <-- Error reporting is disabled here

// overwrite it
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Negro
fuente