Error HTTP 500: causas y solución (nginx, Apache, WordPress)

Punto clave

El error HTTP 500 (Internal Server Error) significa que el servidor encontró una condición inesperada que le impidió completar la petición (RFC 9110): algo se rompió en el servidor y no dijo qué. Como visitante, recarga una vez pasado un minuto y comprueba si el sitio está caído para todos; la solución es del propietario. Como propietario, lee primero el log de errores. En nginx el 500 suele venir de la aplicación que hay detrás (PHP, Node, Python); en Apache, revisa el .htaccess, los límites de PHP y los plugins.

Compruébelo ahora

Guía para solucionar el error HTTP 500 internal server error mostrando la pantalla de error del servidor y soluciones de depuración paso a paso
Guía para solucionar el error HTTP 500 internal server error mostrando la pantalla de error del servidor y soluciones de depuración paso a paso
Empiece a leer
  1. ¿Qué es el error HTTP 500?
  2. Cómo se ve un error 500
  3. Error 500 Internal Server Error en nginx
  4. Causas comunes del error HTTP 500
  5. Cómo solucionar un error 500 (como visitante)
  6. Solución 1: revisa los logs de error del servidor
  7. Solución 2: verificar y reparar el .htaccess
  8. Solución 3: corregir los permisos de archivos
  9. Solución 4: aumentar la memoria y los límites de ejecución de PHP
  10. Solución 5: desactivar plugins y tema (CMS)
  11. Solución 6: verificar la conexión y reparar la base de datos
  12. Solución 7: verificar la compatibilidad de la versión de PHP
  13. Solución 8: verificar el espacio en disco
  14. 500 vs 502 vs 503 vs 504: ¿cuál es la diferencia?
  15. Cómo afectan los errores 500 al SEO
  16. Cómo prevenir los errores 500
  17. Preguntas frecuentes

¿Qué es el error HTTP 500?

El error HTTP 500 (Internal Server Error) significa que algo se rompió en el servidor web mientras procesaba tu petición, y el servidor no dijo qué. Es el error de servidor más genérico.

El estándar HTTP lo define en una frase: «The 500 (Internal Server Error) status code indicates that the server encountered an unexpected condition that prevented it from fulfilling the request» (RFC 9110 §15.6.1), es decir: el servidor encontró una condición inesperada que le impidió completar la petición. A diferencia de un 503, no dice nada sobre si el problema es temporal.

Casi siempre es un fallo, una mala configuración o una caída del código del servidor, no algo que haya hecho el visitante. La solución tiene que venir del propietario o del administrador del sitio.

Consulta el código de estado que devuelve una página

Cómo se ve un error 500

El texto depende del servidor y de la aplicación:

  • 500 Internal Server Error — la línea de estado estándar
  • 500 Internal Server Error con «nginx» debajo — la página de error propia de nginx
  • The server encountered an internal error or misconfiguration and was unable to complete your request. — la página por defecto de Apache
  • Ha habido un error crítico en esta web. — la página de error fatal de WordPress, tal como aparece en español (en inglés: «There has been a critical error on this website.»)
  • HTTP Error 500.19 - Internal Server Error — IIS, donde el número tras el punto indica el motivo (500.19: datos de configuración no válidos)
  • Esta página no funciona · La página example.com no puede procesar esta solicitud ahora. · HTTP ERROR 500 — Chrome, cuando la respuesta 500 no trae una página propia
  • Request failed with status code 500 — Axios y otro código JavaScript que llama a una API
  • 500. Se trata de un error. — la propia página de error de Google, tal como aparece en español (en inglés: «500. That's an error.»)

Error 500 Internal Server Error en nginx

La mayoría de las veces nginx solo transmite un 500 que devolvió la aplicación que hay detrás (PHP-FPM, Node.js, Python); con PHP-FPM, el mensaje de error de PHP acaba en el log de nginx. nginx también genera un 500 propio en unos pocos casos. Las líneas del log de errores que debes buscar:

Línea del log de errores de nginxQué significa
FastCGI sent in stderr: "PHP message: PHP Fatal error: …"PHP se ha caído; el mensaje indica el archivo y la línea (los errores de PHP-FPM acaban en el log de nginx)
rewrite or internal redirection cycle while internally redirecting to …Las reglas try_files o rewrite se vuelven sobre sí mismas dentro de nginx, a menudo por un recurso alternativo como /index.html que no existe (un bucle que sigue el navegador muestra en su lugar ERR_TOO_MANY_REDIRECTS)
open() "/etc/nginx/.htpasswd" failed (13: Permission denied)nginx no puede leer el archivo de contraseñas de auth_basic (si falta el archivo, da 403)
pwritev() "/var/lib/nginx/body/…" failed (28: No space left on device)nginx no pudo almacenar en disco una subida o un POST grande: disco lleno o una carpeta temporal en la que no puede escribir
(nada para esa petición)Una aplicación Node.js o Python devolvió el 500 y nginx lo transmitió: lee el log de esa aplicación
bash
# What did nginx log?
sudo tail -n 50 /var/log/nginx/error.log

# Look for loops in the loaded config
sudo nginx -T | grep -nE 'try_files|rewrite'

(Fuente: el código de nginx; un backend caído o sobrecargado da un 502 o un 504, no un 500.)

Causas comunes del error HTTP 500

Un 500 puede venir de decenas de problemas del lado del servidor. Los más comunes:

  • Un archivo .htaccess roto — una directiva no válida o una RewriteRule incorrecta hace que Apache responda 500 en ese directorio y en todo lo que cuelga de él.
  • Errores fatales de PHP — errores de sintaxis, excepciones sin capturar o llamadas a funciones no definidas detienen el script.
  • Límites de memoria o de tiempo de PHP — un script que supera memory_limit (128M por defecto) o max_execution_time (30 segundos) se detiene.
  • Líneas php_value en un servidor PHP-FPM — solo funcionan con el mod_php de Apache; con PHP-FPM, Apache las rechaza con un 500.
  • Permisos de archivo incorrectos — PHP no puede leer un archivo que incluye, o un host con suPHP/suEXEC rechaza los archivos que cualquiera puede modificar (777). (Un archivo que el propio servidor web no puede leer da 403.)
  • Un plugin o un tema — una extensión nueva o actualizada de WordPress, Joomla o Drupal que hace caer todo el sitio.
  • Fallos de conexión con la base de datos — credenciales incorrectas, un servidor de base de datos detenido o demasiadas conexiones.
  • Archivos del núcleo corruptos — tras una actualización fallida o una subida interrumpida.
  • Un disco lleno — el servidor no puede escribir logs, sesiones ni archivos temporales.
  • Los desencadenantes propios de nginx — un bucle de reescritura, un archivo de contraseñas ilegible o una escritura de archivo temporal que falla (a menudo un disco lleno); mira la sección de nginx más arriba.

Cómo solucionar un error 500 (como visitante)

Si ves un error 500 en el sitio web de otra persona, el problema está en el servidor, no en tu dispositivo. Sin embargo, hay algunas cosas que puedes intentar antes de rendirte.

  • Recarga una vez pasado un minuto (F5, o Cmd+R en Mac). Muchos 500 duran solo lo que dura un despliegue o un reinicio.
  • Comprueba si está caído para todos — el Verificador de páginas caídas abre la página desde 11 lugares, y el Verificador de encabezados HTTP muestra el código de estado exacto que recibe nuestro servidor.
  • Borra las cookies del sitio, o prueba con una ventana privada. Una cookie de sesión dañada puede hacer que algunas aplicaciones fallen en todas las páginas solo para ti.
  • Inténtalo más tarde — la solución está en el servidor, así que dale tiempo al propietario.
  • Avisa al propietario del sitio si dura horas, con la dirección de la página y la hora en que ocurrió.

Solución 1: revisa los logs de error del servidor

Los logs de error son la herramienta de depuración más importante para errores 500. Te dicen exactamente qué salió mal, incluyendo la ruta del archivo, el número de línea y el mensaje de error. Siempre revisa los logs primero antes de intentar cualquier otra cosa.

bash
# Apache (PHP errors appear here too, as "AH01071: Got error 'PHP message: …'")
sudo tail -n 100 /var/log/apache2/error.log      # Debian/Ubuntu
sudo tail -n 100 /var/log/httpd/error_log        # RHEL/Alma/Rocky

# nginx (PHP errors appear here as "FastCGI sent in stderr")
sudo tail -n 100 /var/log/nginx/error.log

# PHP errors on RHEL-family PHP-FPM
sudo tail -n 100 /var/log/php-fpm/www-error.log

# PHP-FPM process log (pool restarts, pm.max_children)
sudo tail -n 100 /var/log/php8.3-fpm.log         # Debian/Ubuntu

# WordPress debug log (with WP_DEBUG_LOG on)
tail -n 100 /path/to/wordpress/wp-content/debug.log

Solución 2: verificar y reparar el .htaccess

Un archivo .htaccess roto es una causa clásica de errores 500 en Apache: una errata, una directiva que el servidor no admite o una RewriteRule incorrecta dejan fuera de servicio el directorio. El log de errores de Apache nombra el archivo .htaccess y la directiva incorrecta, por ejemplo Invalid command 'php_value', perhaps misspelled or defined by a module not included in the server configuration.

La prueba más rápida es renombrar el archivo temporalmente. Si el sitio carga tras renombrarlo, el problema era el .htaccess.

bash
# Rename to disable .htaccess
mv .htaccess .htaccess_backup

# If site loads, regenerate a clean .htaccess
# For WordPress, go to Settings > Permalinks and click Save

Solución 3: corregir los permisos de archivos

Los permisos causan un 500 cuando PHP no puede leer un archivo que incluye, o en hosts con suPHP/suEXEC que rechazan los archivos que cualquiera puede modificar. Lo habitual es 644 para archivos y 755 para carpetas. No uses nunca 777: es un riesgo de seguridad y, en hosts con suEXEC/suPHP, provoca un 500 por sí solo.

bash
# Set correct directory permissions
find /path/to/webroot -type d -exec chmod 755 {} \;

# Set correct file permissions
find /path/to/webroot -type f -exec chmod 644 {} \;

# WordPress wp-config.php (extra security; 440 only if the PHP user owns the file or is in its group)
chmod 440 wp-config.php

Solución 4: aumentar la memoria y los límites de ejecución de PHP

PHP detiene los scripts que superan el límite de memoria o el tiempo máximo de ejecución, y el visitante recibe un 500. Los valores por defecto, 128M de memoria y 30 segundos, suelen quedarse cortos para páginas pesadas.

Súbelos donde tu servidor los lee. Con PHP-FPM, edita el php.ini de FPM (por ejemplo /etc/php/8.3/fpm/php.ini) y recarga php-fpm; los cambios en .user.ini pueden tardar hasta 5 minutos en aplicarse.

bash
# Option 1: php.ini (best)
memory_limit = 256M
max_execution_time = 300

# Option 2: .htaccess (Apache with mod_php only; under PHP-FPM these lines cause a 500)
php_value memory_limit 256M
php_value max_execution_time 300

# Option 3: .user.ini (PHP-FPM and other FastCGI setups)
memory_limit = 256M

# Option 4: wp-config.php (WordPress)
define( 'WP_MEMORY_LIMIT', '256M' );

Solución 5: desactivar plugins y tema (CMS)

Si usas WordPress, Joomla u otro CMS, un plugin o tema defectuoso es una de las causas más comunes de errores 500. La forma más rápida de comprobarlo es desactivar todos los plugins a la vez y luego reactivarlos uno por uno.

bash
# Disable all WordPress plugins (via the file system)
cd /path/to/wordpress/wp-content
mv plugins plugins_disabled

# Or with WP-CLI, without loading the plugin that crashes the site
wp plugin deactivate --all --skip-plugins --skip-themes

# Switch to a default theme (installs it if it was deleted)
wp theme install twentytwentyfive --activate --skip-plugins --skip-themes

# Check WordPress's own files, and reinstall them without touching wp-content
wp core verify-checksums
wp core download --skip-content --force

Solución 6: verificar la conexión y reparar la base de datos

Un error 500 puede ocurrir cuando la aplicación no puede conectarse a su base de datos. Esto sucede cuando las credenciales son incorrectas, el servidor de base de datos está caído o las tablas están corruptas.

Primero verifica las credenciales de tu base de datos en el archivo de configuración (wp-config.php para WordPress, .env para Laravel). Luego prueba la conexión y repara las tablas corruptas si es necesario.

bash
# Test the MySQL connection
mysql -u username -p -h localhost database_name -e "SELECT 1;"

# Check tables (REPAIR only fixes MyISAM/Aria tables; for InnoDB, restore from a backup)
mysqlcheck -u username -p --check --auto-repair database_name

# WordPress: add to wp-config.php, then visit /wp-admin/maint/repair.php
# Remove this line when you're done: the repair page needs no login.
define( 'WP_ALLOW_REPAIR', true );

Solución 7: verificar la compatibilidad de la versión de PHP

El código escrito para una versión antigua de PHP puede dar errores fatales en una más nueva (o al revés). Tras actualizar PHP, lo habitual son las funciones eliminadas y los comportamientos que cambiaron; las funciones obsoletas solo generan avisos.

Comprueba qué versión de PHP usa realmente tu sitio. php -v en la línea de comandos puede mostrar un PHP distinto del que usa tu sitio, así que mira también en el panel de tu hosting o en una página phpinfo() temporal:

bash
# Command-line PHP (may differ from the site's PHP-FPM)
php -v

# PHP-FPM versions installed (Debian/Ubuntu)
ls /etc/php/

# Modules loaded in the command-line PHP
php -m

Solución 8: verificar el espacio en disco

Cuando a un servidor se le acaba el espacio en disco (o los inodos), no puede escribir logs, archivos temporales ni datos de sesión, y las peticiones empiezan a fallar con 500.

bash
# Check disk space, and inodes (they can run out too)
df -h
df -i

# What's using the space?
sudo du -sh /var/log /tmp

# Free space without deleting the log you're reading
sudo find /var/log -name "*.gz" -mtime +14 -delete
sudo journalctl --vacuum-size=200M

500 vs 502 vs 503 vs 504: ¿cuál es la diferencia?

La clave: 500 = el servidor falló internamente. 502 = el proxy recibió basura del backend. 503 = el servidor está vivo pero ocupado. 504 = el proxy se cansó de esperar. Puedes comprobar el código de estado exacto que devuelve tu servidor con el Verificador de encabezados HTTP de DNS Robot.

Si el error es un 502, la aplicación puede estar bien y el problema estar entre el proxy y la aplicación. Nuestra guía del 502 Bad Gateway cubre ese caso.

CódigoNombreSignificadoCausa común
500Internal Server ErrorEl servidor o la aplicación encontró un error inesperado, como una excepción no controlada o una mala configuraciónError fatal de PHP, .htaccess corrupto, agotamiento de memoria
502Bad GatewayUn proxy recibió una respuesta inválida del backendPHP-FPM se bloqueó, backend no ejecutándose, socket cerrado
503Service UnavailableEl servidor está temporalmente sobrecargado o en mantenimientoPico de tráfico, mantenimiento programado, límites de recursos
504Gateway TimeoutUn proxy agotó el tiempo de espera por la respuesta del backendConsulta lenta a la base de datos, script de larga duración, upstream sin respuesta

Cómo afectan los errores 500 al SEO

La propia documentación de Google describe lo que ocurre (documentación de Google sobre sus rastreadores):

  • El rastreo se ralentiza. Ante errores 5xx, Google reduce el ritmo de rastreo del sitio, en proporción al número de URL que devuelven errores.
  • Las páginas indexadas se mantienen al principio. Las URL ya indexadas se conservan un tiempo, pero las que devuelven un error de servidor de forma persistente se eliminan.
  • La recuperación es gradual. Cuando el servidor vuelve a responder con 2xx, Google va aumentando el rastreo poco a poco.
  • Usa 503 para una parada planificada de un día o dos, con una cabecera Retry-After (Google), para que la parada se lea como temporal (guía del 503).

Cómo prevenir los errores 500

La prevención siempre es mejor que la depuración. Sigue estas mejores prácticas para minimizar el riesgo de errores 500 en tu sitio web.

  • Configura monitorización de uptime — Usa herramientas como UptimeRobot o Pingdom para verificar tu sitio cada 1-5 minutos. Recibe alertas instantáneas cuando ocurra un error 500.
  • Siempre prueba los cambios en staging — Nunca despliegues directamente a producción. Prueba las actualizaciones de plugins, las actualizaciones de PHP y los cambios de configuración en un entorno de staging primero.
  • Usa control de versiones (Git) — Haz commit de cada cambio para poder revertir instantáneamente un despliegue malo con un solo comando.
  • Implementa manejo de errores adecuado — Envuelve las consultas a la base de datos y las llamadas a APIs en bloques try-catch. Registra las trazas de pila completas del lado del servidor para cada error.
  • Monitoriza el espacio en disco y los recursos del servidor — Configura alertas para uso de disco por encima del 80%, CPU alta y presión de memoria.
  • Mantén el software actualizado — Las versiones desactualizadas del CMS, plugins y software del servidor contienen errores conocidos que causan bloqueos.
  • Mantén copias de seguridad automatizadas — Prueba tu procedimiento de restauración regularmente. Una copia de seguridad que nunca has probado no es una copia de seguridad.
  • Configura los límites de PHP apropiadamente — Configura memory_limit y max_execution_time basándote en tu carga de trabajo real, no en los valores predeterminados.
  • Usa pipelines CI/CD — Automatiza las pruebas antes del despliegue. Si las pruebas fallan, el despliegue no debe proceder.

Consulta el código de estado que devuelve una página

El Verificador de encabezados HTTP gratuito de DNS Robot solicita cualquier URL desde nuestro servidor y muestra el código de estado exacto y los encabezados de respuesta, para que confirmes un 500 y veas qué servidor lo envió.

Fuentes

  1. RFC 9110 §15.6.1: 500 Internal Server Error, IETF
  2. HTTP status codes and Google's crawlers, Google
  3. ngx_http_core_module.c (rewrite or internal redirection cycle), nginx
  4. Pause or disable a website, Google
  5. ngx_http_auth_basic_module.c (403 vs 500), nginx

Preguntas frecuentes

¿Qué significa el error HTTP 500?

El servidor encontró un problema inesperado al procesar tu petición y no pudo completarla. Es un cajón de sastre genérico: algo se rompió en el servidor y el 500 no dice qué. El log de errores del sitio tiene los detalles.

¿Cómo define la RFC 9110 el 500 Internal Server Error?

La sección 15.6.1 dice: «The 500 (Internal Server Error) status code indicates that the server encountered an unexpected condition that prevented it from fulfilling the request.» Dicho de otro modo: el servidor encontró una condición inesperada que le impidió completar la petición. La RFC 9110 (junio de 2022) es el estándar actual de la semántica de HTTP.

¿Cómo solucionar un error 500 internal server error?

Lee primero el log de errores del servidor (Apache, nginx, PHP-FPM o tu aplicación). Después revisa a los sospechosos habituales: el archivo .htaccess, los límites de memoria y de tiempo de PHP, un plugin o tema actualizado hace poco, los permisos de archivos, la conexión con la base de datos y el espacio libre en disco.

¿Es culpa mía como visitante el error 500?

Casi nunca. Es un error del lado del servidor. Recarga una vez pasado un minuto y, si persiste, comprueba si el sitio está caído para todos. Borrar las cookies del sitio puede ayudar en el raro caso de que lo provoque una cookie de sesión dañada.

¿Qué significa 500 Internal Server Error en nginx?

Normalmente que la aplicación que hay detrás de nginx (PHP, Node.js, Python) devolvió el 500 y nginx lo transmitió; con PHP-FPM, el motivo aparece en el log de errores de nginx como «FastCGI sent in stderr». nginx genera un 500 propio, por ejemplo, ante un bucle de reescritura, un archivo auth_basic ilegible o una escritura de archivo temporal que falla (a menudo un disco lleno).

¿Cuál es la diferencia entre un error 500 y un error 503?

Un 500 significa que algo se rompió de forma inesperada. Un 503 significa que el servidor no está disponible a propósito por ahora, por sobrecarga o mantenimiento, y puede indicar cuándo reintentar con una cabecera Retry-After. Para un mantenimiento planificado, envía un 503.

¿Puede un error 500 afectar mis rankings en Google?

Los cortos importan poco. Google reduce el rastreo cuando ve errores 5xx y conserva las páginas indexadas durante un tiempo, pero las URL que siguen devolviendo errores de servidor acaban eliminándose del índice. Arregla rápido los 500 que se prolongan.

¿Qué causa un error 500 en WordPress?

Normalmente un plugin o tema que hace caer PHP, un archivo .htaccess roto, el límite de memoria de PHP, una actualización fallida que dejó incompletos los archivos del núcleo, o la conexión con la base de datos. WordPress suele mostrar «Ha habido un error crítico en esta web.» y envía un correo al administrador.

¿Qué significa «Request failed with status code 500»?

Es el mensaje de error de Axios, una biblioteca HTTP de JavaScript: la API a la que llamó tu código respondió 500. El problema está en ese servidor. Lee error.response.data para ver el mensaje propio de la API y revisa los logs de la API si es tuya.

¿Por qué me sale un error 500 solo en algunas páginas?

Cuando solo fallan algunas páginas, la causa está en el código o los datos que hay detrás: una fila dañada de la base de datos, un archivo include que falta o un plugin que solo se ejecuta en ciertas plantillas. El log de errores indica el archivo y la línea.

Sobre el autor

Shaik Vahid

Fundador de DNS Robot. Vahid pasó años en el soporte de alojamiento web resolviendo dominios, registros DNS, certificados SSL y la entrega de correo para clientes. Desarrolla las herramientas de DNS Robot y escribe estas guías a partir de los errores que la gente encuentra de verdad.

Verificador de encabezados HTTP

Analiza cabeceras de respuesta HTTP y clasificación de cabeceras de seguridad