Quelles sont les causes de la fermeture de la connexion sous-jacente sur nginx?

Nous avons une intégration de passerelle de paiement qui publie des données sur une URL tierce. L’utilisateur termine ensuite son processus de paiement et à la fin de la transaction, la passerelle renvoie une URL sur notre serveur.

Cette publication échoue et la passerelle signale l’erreur suivante:

ERREUR 13326: Impossible de parler à ServerResultURL [ https://foo.com/bar] .

Détails d’erreur complets: la connexion sous-jacente a été fermée: une erreur inattendue s’est produite lors d’un envoi.

L’object de réponse est null

Lorsque je publie directement sur https://foo.com/bar je reçois une réponse 200, comme je l’attends, donc je ne suis pas sûr de savoir où cela tombe.

Ceci est sur une boîte Ubuntu exécutant nginx.

Qu’est-ce qui pourrait causer ce problème et comment puis-je trouver plus de détails à ce sujet et comment le résoudre?

MODIFIER:

Pour des raisons de concision, l’exemple ci-dessus est sur une URL de /bar mais la réalité est que j’ai une réécriture en place (voir ci-dessous). L’URL qui est réellement publiée est /themes/third_party/cartthrob/lib/extload.php/cardsave_server/result donc je ne sais pas si la réécriture ci-dessous est ce qui cause un problème.

Je suppose que non, car je reçois une réponse 200 lors de la publication via POSTMAN.

 # http://expressionengine.stackexchange.com/questions/19296/404-when-sagepay-attempts-to-contact-cartthrob-notification-url-in-nginx location /themes/third_party/cartthrob/lib/extload.php { rewrite ^(.*) /themes/third_party/cartthrob/lib/extload.php?$1 last; } 

Causes typiques de ce type d’erreur

Je parie que votre serveur répond au POST à ​​/ bar avec quelque chose que la passerelle (PaymentSense, non?) Ne s’attend pas à. Cela pourrait être parce que:

  1. La passerelle ne peut pas atteindre votre boîte Ubuntu sur le réseau, car un pare-feu ou un matériel réseau entre les deux le bloque.
  2. Votre certificate https est incorrect / expiré / auto-signé et la passerelle refuse la connexion.
  3. Une mauvaise configuration de NGINX ou de votre logiciel d’application Web (PHP, j’imagine? Ou tout ce que nginx est en train de fournir) fait que / bar répondra avec une réponse étrange, comme une page d’erreur 30x ou 50x, ou avec une réponse incorrecte. , comme une page HTML.
  4. Quelque chose d’autre ne va pas avec la réponse au POST.
  5. Le script / contrôleur en cours d’exécution sur / bar peut recevoir des entrées inattendues dans la requête POST. Vous pouvez donc examiner la requête en cours.
  6. Vous avez un problème de connectivité réseau.

Je vais laisser les deux premiers éléments pour vous dépanner, car je ne pense pas que ce soit ce que vous demandez dans cette question.

Dépannage des réponses NGINX

Je vous recommande de le configurer pour qu’il vide sa réponse dans une variable nginx à l’aide de body_filter_by_lua afin que vous puissiez voir quelle réponse sortira. Un bon exemple de la façon de configurer cela est disponible ici . Je pense que cela vous mènera à comprendre pourquoi / bar ne se comporte pas.

Dépannage des requêtes NGINX

Si cela ne révèle pas la cause, essayez de consigner les données de la demande. Vous pouvez le faire avec quelque chose comme:

 location = /bar { log_format postdata $request_body; access_log /var/log/nginx/postdata.log postdata; fastcgi_pass php_cgi; } 

Examinez les en-têtes et le corps de la requête de ce POST, et si l’erreur n’est pas immédiatement apparente, essayez de relire exactement la même demande (en utilisant un client HTTP qui vous donne un contrôle complet, par exemple curl ) et déboguez ce qui se passe avec / bar . Est-ce que nginx exécute le script / contrôleur que vous pensez qu’il devrait fonctionner lorsque vous créez un POST identique à / bar? Ajoutez la journalisation au script / au processus de contrôleur / bar.

Utilisez le débogage interactif si nécessaire. (Cela peut nécessiter Xdebug à distance si vous travaillez avec PHP, mais peu importe ce que vous utilisez sur votre serveur, la plupart des outils d’application Web proposent une forme de débogage interactif.)

Dépannage réseau

Si rien ne fonctionne, il est possible que la passerelle ne puisse tout simplement pas atteindre l’hôte et le port sur lesquels vous l’exécutez, ou que vous renconsortingez d’autres problèmes de connectivité réseau. Je voudrais lancer tcpdump sur votre box Ubuntu pour capturer le trafic réseau. Si vous pouvez recréer ceci sur un système silencieux (réseau), ce sera à votre avantage. Cependant, il s’agit de TLS (https), donc ne vous attendez pas à voir autre chose que l’ouverture de la connexion et l’arrivée des paquets. Si vous trouvez que vous devez voir à l’intérieur du trafic TLS pour résoudre le problème, vous pouvez utiliser mitmproxy pour le faire.