Comment puis-je déboguer nginx plus loin que le journal des erreurs?

34

Je reçois actuellement une inondation HTTP assez importante, et mon proxy inverse nginx génère une passerelle 502 Bad.

J'ai un serveur frontal exécutant nginx en tant que proxy sur mon serveur principal, mais il ne fait que recevoir un tas d' connect() failed (110: Connection timed out) while connecting to upstreamerreurs. Des tonnes d'entre eux. Si je contourne le serveur proxy pour me connecter au backend, je peux très bien utiliser le site. Je sais donc qu'il se trouve quelque part dans le proxy inverse. Cependant, je ne sais pas comment déterminer pourquoi le délai est écoulé.

De l'aide?

exécuter nginx 1.2.3 sur CentOS 6.2

Rob
la source
Vous pouvez commencer par mettre à jour Nginx vers la dernière version. Bien que je ne sois pas au courant d'un tel bug dans 1.2.3
Ben Lessani - Sonassi
2
.... et ensuite jetez un oeil à ce qui est REFUSING THE CONNECIONS DE
NGINX
Quel est votre serveur principal? J'ai déjà été dérouté par des erreurs lorsque l'erreur que Nginx servait provenait du serveur. Cela ne semble pas être le cas ici, mais vous devez mettre à jour votre question avec plus de détails.
Jeffatrackaid
De plus, vous connectez-vous via un réseau privé / public au serveur? Les adresses IP du proxy sont-elles inscrites à la liste blanche dans un pare-feu, un DDOS ou un autre outil de type ip / limitant? À quoi ressemble un netstat sur le serveur principal? Combien de connexions sont ouvertes? Qu'est-ce que MaxClients sur le backend? Est-ce que vous les épuisez?
jeffatrackaid

Réponses:

19

Je suppose que vous avez déjà augmenté votre niveau de consignation des erreurs Nginx au débogage. Sinon, commencez par là.

Votre meilleur pari utilisera probablement stracepour voir les appels système passés par Nginx. En particulier, vous voudrez faire attention aux connect()appels et garder un œil sur les codes de retour de ceux-ci ( man 2 connectpeut être votre ami ici).

Une fois que vous avez ces informations, vous pouvez mieux deviner si le problème est limité à votre proxy frontal ou s'il a quelque chose à voir avec les interactions entre le proxy et le serveur d'applications principal.

jgoldschrafe
la source
37

Cela ne devient pas beaucoup plus pédant que cela sauf si vous souhaitez mettre en place des sondes dtrace:

  1. Définissez le niveau du journal de débogage: /etc/nginx/nginx.conf:

    ...
    http {
            ...
            error_log /var/log/nginx/error.log debug; # todo testing remove me not for production use
            ...
    }
    
  2. Configurez tcpdump dans une autre fenêtre:

    tcpdump not port 22 -vvv -s0 -q -XXX
    
  3. Surveillez les fichiers journaux dans une autre fenêtre:

    tail -f /var/log/nginx/*
    
  4. Démarrage nginx interactif avec strace:

    # top of /etc/nginx/nginx.conf:
    
    daemon off; # todo testing remove me not for production use
    

    Et alors

     $ strace nginx 
    

Un débogage supplémentaire peut être effectué avec un nginx compilé avec --with-debug. Vérifiez-le en exécutant:

    nginx -V 2>&1 | grep -- '--with-debug' # no output if not debug

Un autre bon module non compilé par défaut est: HttpStubStatusModule . Selon toute vraisemblance, toute installation décente nécessitera un nginx compilé sur mesure (emballage hautement recommandé à l'aide des outils d'emballage de distro).

La plupart d'entre elles ne conviennent pas à une utilisation en production. Compilez nginx avec gperf si vous avez besoin de plus de statistiques.

Jacob
la source
à l'étape 2, cela fonctionne pour moi: tcpdump -i aucun port 22 -vvv -s0 -q -XXX
ccppjava
5

On dirait que vous déboguez un site à fort trafic.

Utilisation debugavec la debug_connectiondirective si l' erreur nginx journal affiche les journaux de débogage de votre IP uniquement.

Une fois que vous commencez à voir des journaux d’erreur utiles plutôt que d’activer l’option de débogage pour toute la configuration de nginx, ajoutez une error_log /path/to/some/file/ debug;directive distincte dans le location {..}bloc responsable de la connexion reverse_proxy.

De cette façon, vous pourrez uniquement isoler le journal des erreurs de débogage de votre adresse IP.

Essayez de le relier avec la demande que vous faites (à partir de votre navigateur).

Par exemple, s'il vous plaît vérifier: https://easyengine.io/tutorials/nginx/debugging/

Un niveau d'avance, vous pouvez utiliser HttpEchoModule de Nginx

rahul286
la source
2

Je n'ai jamais trouvé que Nginx soit un goulot d'étranglement, dans la plupart des cas, il est plus que capable que ses extrémités. Mais si vous avez testé sans Nginx et n’avez trouvé aucune erreur, alors ce sera soit (ou les deux):

  1. Problème de configuration Nginx
    1. Valeur du délai d'attente en amont incorrecte
    2. Mauvaise URL de sonde en amont
    3. Trop peu de travailleurs
    4. Etc.
  2. Goulot d'étranglement TCP / IP du système d'exploitation
    1. Il se peut que le proxy lui-même provoque une duplication des ports et des états ouverts. Que ce soit des descripteurs de fichiers, des ports, des connexions TCP

Sans voir vos configurations Nginx, personne ne peut commenter les précédentes. Et sans sorties appropriées du système d'exploitation, personne ne peut commenter ce dernier.

Ben Lessani - Sonassi
la source