Erreur interne 500 Apache, mais rien dans les journaux?

122

J'obtiens 500 erreurs de serveur interne lorsque j'essaye de créer un HTTP POST à ​​une adresse spécifique dans mon application. J'ai examiné les journaux du serveur dans le répertoire de journaux personnalisé spécifié dans le fichier d'hôtes virtuels, mais l'erreur ne s'affiche pas là-haut, donc le débogage a été une douleur dans le cul.

Comment puis-je amener Apache à consigner les erreurs internes 500 dans le journal des erreurs?

wcolbert
la source
1
J'ai eu le même problème en utilisant PHP avec des hôtes virtuels .... aucune erreur (Apache2, Ubuntu). Il a fini par manquer de modules PHP (mysql, json, etc.)
1
Sur le nôtre, il les envoyait au journal d'accès (probablement parce que du point de vue d'Apache, il fonctionnait correctement et ne faisait que les transmettre, à partir d'une couche plus profonde - dans notre cas, Passenger / Rails). Il suffit de mettre cette note ici au cas où quelqu'un se gratte la tête.
Tom Hundt

Réponses:

-4

Notez s'il vous plaît: l'affiche originale ne posait pas spécifiquement des questions sur PHP. Toutes les réponses centrées sur php font de grandes hypothèses non pertinentes pour la question réelle.

Le journal d'erreurs par défaut, contrairement aux journaux d'erreurs des scripts, contient généralement l'erreur (plus) spécifique. souvent, il s'agira d'autorisations refusées ou même d'un interprète introuvable.

Cela signifie que la faute réside presque toujours dans votre script. par exemple, vous avez téléchargé un script perl mais ne lui avez pas donné les autorisations d'exécution? ou peut-être qu'il a été corrompu dans un environnement linux si vous écrivez le script dans Windows puis le téléchargez sur le serveur sans que les fins de ligne soient converties, vous obtiendrez cette erreur.

en perl si vous oubliez

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

vous obtiendrez cette erreur

Il y a plusieurs raisons à cela. Veuillez donc d'abord vérifier votre journal des erreurs, puis fournir plus d'informations.

Le journal des erreurs par défaut est souvent dans /var/log/httpd/error_logou/var/log/apache2/error.log .

La raison pour laquelle vous consultez les journaux d'erreurs par défaut (comme indiqué ci-dessus) est que les erreurs ne sont pas toujours publiées dans le journal d'erreurs personnalisé tel que défini dans l'hôte virtuel.

Suppose linux et pas nécessairement perl

DéveloppeurChris
la source
6
J'ai vérifié le ErrorLog du serveur, et il n'y a rien à trouver.
wcolbert
2
Vous avez raison, cela s'est avéré être un problème avec le script php. La bibliothèque PEAR n'a pas été installée. Je l'ai installé sur mon VPS et tout va bien. Merci a tous!
wcolbert
262
Comment "Veuillez vérifier les journaux" peut-il être la réponse acceptée à "Pourquoi mes journaux sont-ils vides"?
Álvaro González
5
J'ai indiqué à l'utilisateur les journaux d'erreurs par défaut et non les journaux d'erreurs personnalisés. Souvent, lorsqu'un script échoue pour une raison quelconque, l'erreur est acheminée vers les journaux d'erreurs par défaut
DeveloperChris
2
Avec PHP, je n'avais rien dans les journaux d'erreurs apache configurés, mais j'ai trouvé les erreurs avec grep PHP /var/log/syslog. Probablement parce que j'avais error_log = syslogen /etc/php5/apache2/php.ini.
mivk
145

Pourquoi les 500 erreurs internes du serveur ne sont-elles pas enregistrées dans vos journaux d'erreurs Apache?

Les erreurs qui causent votre erreur de serveur interne 500 proviennent d'un module PHP. Par défaut, PHP n'enregistre PAS ces erreurs. La raison en est que vous voulez que les requêtes Web soient aussi rapides que possible physiquement et c'est un risque pour la sécurité de consigner les erreurs à l'écran où les attaquants peuvent les observer.

Ces instructions pour activer la journalisation des erreurs du serveur interne concernent Ubuntu 12.10avec PHP 5.3.10et Apache/2.2.22.

Assurez-vous que la journalisation PHP est activée:

  1. Localisez votre fichier php.ini:

    el@apollo:~$ locate php.ini
    /etc/php5/apache2/php.ini
    
  2. Modifiez ce fichier en tant que root:

    sudo vi /etc/php5/apache2/php.ini
    
  3. Trouvez cette ligne dans php.ini:

    display_errors = Off
    
  4. Changez la ligne ci-dessus en ceci:

    display_errors = On
    
  5. Plus bas dans le fichier, vous verrez ceci:

    ;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. Les points-virgules sont des commentaires, ce qui signifie que les lignes ne prennent pas effet. Modifiez ces lignes pour qu'elles ressemblent à ceci:

    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
    

    Ce que cela communique à PHP, c'est que nous voulons enregistrer toutes ces erreurs. Attention, il y aura un gros impact sur les performances, vous ne voulez donc pas que cela soit activé en production car la journalisation prend du travail et le travail prend du temps, le temps coûte de l'argent.

  7. Le redémarrage de PHP et Apache doit appliquer le changement.

  8. Faites ce que vous avez fait pour provoquer à nouveau l'erreur 500 Internal Server et vérifiez le journal:

    tail -f /var/log/apache2/error.log
    
  9. Vous devriez voir l'erreur 500 à la fin, quelque chose comme ceci:

    [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
la source
46
display_errorsimprime les erreurs sur l' écran . log_errorsécrit des erreurs dans le fichier journal .
daVe
11
Cela devrait être la réponse canonique à cette question.
David
9
@WanLiqun C'est une très bonne information mais cela ne s'applique qu'à PHP, qui n'est même pas mentionné dans la question.
Álvaro González
1
"Les erreurs qui causent votre erreur de serveur interne 500 proviennent d'un module PHP. Par défaut, PHP n'enregistre PAS ces erreurs." Qui a mentionné PHP? La désactivation de la journalisation du serveur 500 en PHP est une hypothèse et le plus souvent une mauvaise hypothèse. Apache enregistrera 500 erreurs de serveur à partir d'un module défaillant (dans ce cas php) mais le plus souvent, il ira dans /var/log/apache2/error.log (en supposant que debian ou similaire)
DeveloperChris
4
Cette réponse commence par un mauvais conseil pour vider les erreurs à l'écran.
luqo33
11

Vérifiez votre journal d'erreurs php qui peut être un fichier séparé de votre journal d'erreurs apache.

Trouvez-le en accédant à phpinfo()et vérifiez l'attribut error_log. S'il n'est pas défini. Réglez-le: https://stackoverflow.com/a/12835262/445131

Peut-être que votre post_max_size est trop petit pour ce que vous essayez de publier, ou l'un des autres paramètres de mémoire maximale est trop faible.

jsonH
la source
1
La question était: "Comment puis-je amener Apache à consigner les erreurs internes 500 dans le journal des erreurs?" Cela devrait probablement être un commentaire.
jww
11

Je viens de rencontrer ceci et c'était dû à une mauvaise configuration de mod_authnz_ldap dans mon fichier .htaccess. Absolument rien n'était enregistré, mais j'obtenais toujours une erreur 500.

Si vous rencontrez ce problème particulier, vous pouvez modifier le niveau de journalisation de mod_authnz_ldap comme suit:

LogLevel warn authnz_ldap_module:debug

Cela utilisera un niveau de journal de débogage pour mod_authnz_ldap mais avertira pour tout le reste ( https://httpd.apache.org/docs/2.4/en/mod/core.html#loglevel ).

bmaupin
la source
1
La question était: "Comment puis-je amener Apache à consigner les erreurs internes 500 dans le journal des erreurs?" Cela devrait probablement être un commentaire.
jww
Bonne observation. J'ai ajouté des instructions pour enregistrer ces erreurs.
bmaupin
7

Si les informations d' erreur interne du serveur n'apparaissent pas dans les fichiers journaux, vous devez probablement redémarrer le service Apache .

J'ai constaté qu'Apache 2.4 (au moins sur la plate-forme Windows) a tendance à refuser obstinément de vider les fichiers journaux - au lieu de cela, les données enregistrées restent en mémoire pendant un certain temps. C'est une bonne idée du point de vue des performances, mais cela peut être déroutant lors du développement.

Álvaro González
la source
C'était la bonne réponse pour moi sous Linux. Même après avoir supprimé le fichier error.log d'origine (qui était un fichier de périphérique de caractères) et l'avoir remplacé par un error.log tactile 777, Apache n'écrirait pas dessus avant d'être redémarré.
Adelmar
2

Les réponses de @ eric-leschinski sont correctes.

Mais il y a un autre cas si votre API serveur est FPM / FastCGI (par défaut sur Centos 8 ou vous pouvez vérifier utiliser la fonction phpinfo ())

Dans ce cas:

  1. Exécutez phpinfo()dans un fichier php;
  2. Vous recherchez un Loaded Configuration Fileparamètre pour voir où se trouve le fichier de configuration de votre PHP.
  3. Editez le fichier de configuration comme la réponse de @ eric-leschinski.
  4. Vérifiez le Server APIparamètre. Si votre serveur n'utilise que l'apache handle API -> redémarrez apache. Si votre serveur utilise php-fpm, vous devez redémarrer le service php-fpm

    systemctl redémarrer php-fpm

    Vérifiez le fichier journal dans le dossier journal php-fpm. par exemple/var/log/php-fpm/www-error.log

Ngô Văn Thao
la source
1

Dans mon cas, c'était la directive ErrorLog dans httpd.conf. Je l'ai juste remarqué accidentellement après avoir abandonné. Décidé de partager la découverte) Maintenant, je sais où trouver les 500 erreurs.

Eugène Lycenok
la source
Pouvez-vous s'il vous plaît mettre plus de détails dans votre réponse
Yahya Hussein
J'utilise Magento (CMS - Content Management System) pour Apache. Il y avait une erreur 500 sur ma page en utilisant les classes principales de Magento. Je n'ai pas pu trouver où je pouvais voir le message d'erreur. Selon certaines réponses ici, j'ai essayé de rechercher dans les journaux apache / etc / httpd / logs / error_log. Mais il n'y avait rien là-bas. Plus tard, j'ai découvert qu'il y avait une ligne dans mon httpd.conf pour cet hôte Web spécifique, définissant le chemin du journal: <VirtualHost. ... ErrorLog / usr / www / log / error_log J'avais donc besoin de chercher un journal d'hôte plus spécifique et non le journal Apache commun.
Eugene Lycenok
1

Ajoutez HttpProtocolOptions Unsafeà votre fichier de configuration apache et redémarrez le serveur apache. Il montre les détails de l'erreur.

Sabre
la source
0

Vérifiez que la version de php que vous utilisez correspond à votre base de code. Par exemple, votre environnement local peut exécuter php 5.4 (et les choses fonctionnent bien) et peut-être que vous testez votre code sur une nouvelle machine sur laquelle php 5.3 est installé. Si vous utilisez une syntaxe 5.4 telle que [] pour array (), vous obtiendrez la situation que vous avez décrite ci-dessus.

John Erck
la source
La question était: "Comment puis-je amener Apache à consigner les erreurs internes 500 dans le journal des erreurs?" Cela devrait probablement être un commentaire.
jww
0

Essayez d'accéder à un fichier statique. Si cela ne fonctionne pas non plus, allez dans tous les répertoires de la racine "/" ou "c: \" au répertoire de votre fichier et vérifiez s'ils contiennent des fichiers ".htaccess".

Une fois, j'ai laissé un fichier dans "c: \" et il a eu les résultats les plus étranges.

Lothar
la source
1
La question était: "Comment puis-je amener Apache à consigner les erreurs internes 500 dans le journal des erreurs?"
jww
0

Veuillez vérifier si vous désactivez le rapport d'erreur quelque part dans votre code.

Il y avait un endroit dans mon code où je l'ai désactivé, alors j'ai ajouté le code de débogage aprè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);
Noir
la source