Рейтинг:0

Why is a post/upload of a 100k JSON file to an AWS CloudFront endpoint resulting in 504 error?

флаг cn

On a wordpress site, we have requests coming in to CloudFront, which sends the request to origin (if necessary) which goes through an ELB, and to two or three instances that will service the request.

Most requests work, but when we upload a JSON file to admin-ajax.php, it results in a 504 error that we captured from the CloudFront logs:

2022-01-31  21:32:24    MIA3-C2 1462    67.190.247.197  POST    d2q8ixmwt0jy43.cloudfront.net   /wp-admin/admin-ajax.php    504 https://xxxxxxx.com/wp-admin/edit.php?post_type=elementor_library&tabs_group=library    Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/97.0.4692.99%20Safari/537.36%20Edg/97.0.1072.76 -   -   Error   Ae0gLzThCiZR2N5D8gLO6s-o8IwwlmYrxWvUbUgr1A64_nMpzN0qRg==    evolvetelemed.com   https   167737  30.107  -   TLSv1.3 TLS_AES_128_GCM_SHA256  Error   HTTP/2.0    -   -   64798   30.107  OriginCommError text/html   1033    -   -

The error appears to be an OriginCommError, but I cannot see why it is getting that error. Tailing the logs on our web servers on the instances shows that the request is not even reaching there.

I am not exactly sure why some requests would work and some wouldn't. To add further conclusion, when binary files in the media library are uploaded to async-upload.php, it works.

We use nginx as a webserver on the front end using php-fpm for processing php.

Рейтинг:3
флаг gp
Tim

Это не полный ответ, но он слишком длинный для комментария и может дать вам некоторые идеи. Я удалю его, как только мы получим реальный ответ.

Некоторые мысли:

  • Поле «30.107» «затрачено на время» (для обработки запроса) в соответствии с эта страница. 30 с — это стандартная длина тайм-аута http, что интересно.
  • Ответ состояния 504 означает «тайм-аут шлюза». Более подробная информация: «Сервер, выступая в качестве шлюза или прокси-сервера, не получил своевременного ответа от вышестоящего сервера, к которому ему необходимо было получить доступ для выполнения запроса».
  • OriginCommError не определен в журналах ошибок CloudFront. Однако «ClientCommError — ответ средству просмотра был прерван из-за проблемы со связью между сервером и средством просмотра». предположить, что соединение с сервером было прервано, а не установлено.
  • Поле «sc-content-len» определяется как «Значение заголовка HTTP Content-Length ответа». со значением «1033». Это говорит о том, что балансировщику нагрузки возвращается какой-то ответ.

Все это говорит мне о том, что CloudFront отправил запрос на ALB, но в какой-то момент что-то истекло. Я бы посоветовал вам найти журналы ALB и посмотреть, прольют ли они какой-либо свет на это. Я хотел бы увидеть, на какой сервер он пытался отправить запрос, и дважды проверить, прибыл ли он.

Barry Chapman avatar
флаг cn
Я смог сузить проблему на основе вашего отзыва. Однако запрос действительно поступал в nginx — PHP FPM задыхался от запроса и по какой-то странной причине не регистрировал фатальную ошибку. Nginx сообщил CloudFront об ошибке восходящего потока. Спасибо за вашу помощь
Tim avatar
флаг gp
Tim
Добро пожаловать :) Мне было интересно, был ли это PHP, но, как вы сказали, он не достиг Nginx, вам нужно было сначала проследить его.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.