apache — время ожидания шлюза 504 в AWS ec2 без выполнения длинного сценария php

Я несколько раз сталкивался с ошибкой тайм-аута шлюза http 504, когда пытался вызвать GET API, который был запрограммирован PHP.

Вот мой сервер и среда AWS.

  • Экземпляр ec2 с Amazon Linux, на котором выполняется код php (5.4.40) с сервером apache (2.4.12) для обслуживания вызовов API от клиента.
  • Эластичный балансировщик нагрузки AWS для балансировки трафика на одном из моих экземпляров. (на данный момент у меня есть только один экземпляр, просто установите ELB на будущее, если мне нужно больше экземпляров для обработки трафика.)
  • База данных AWS RDS (MySQL 5.6.21) для сохранения данных.

Из некоторых статей о времени ожидания шлюза 504 я уже пытался изменить эти настройки:

 # ELB
idle timeout => 300

# php.ini
max_execution_time => 301
max_input_time => 301

# httpd conf
MaxKeepAliveRequests => 100
KeepAliveTimeout => 30

Но все они мне не помогают, иногда время ожидания шлюза составляет 504.

Мой php-скрипт не длинный, он просто получает данные из базы данных mysql (AWS RDS) из 3 таблиц и возвращает данные клиенту, не загружая файл и не создавая большой файл, поэтому я думаю, что время выполнения не является проблемой.

Странно то, что ошибка тайм-аута 504 не всегда случается, большую часть времени это нормально, просто случается ИНОГДА, сейчас я до сих пор не понимаю, когда произойдет ошибка 504, это действительно странно, если кто-нибудь может дать мне немного предложения о том, как решить эту проблему, это действительно большая польза для меня.

=== Новое обновление ===

Я только что нашел проблему в своем PHP-коде, я думал, что это пространство имен с проблемой автозагрузки.

У меня есть 2 php-файла в одной папке, это означает, что 2 класса с тем же пространством имен

файлы:

My/Namespace
- Class1.php
- Class2.php

Класс и пространство имен:

Class1

// Class1
namespace My\Namespace;
class Class1 {
public static function getInstance() {
//return...
}
}

Class2

// Class2
namespace My\Namespace;
class Class2 {
public static function getInstance() {
//return...
}

public function getClass1Instance() {
$class1 = Class1::getInstance();
return $class1;
}
}

В Class2.php я пытаюсь вызвать статическую функцию Class1, но я не добавил «использовать пространство имен», поэтому добавляю следующую строку в Class2.php

use My\Namespace\Class1;

Проблема была решена! Но я все еще не совсем уверен, почему я должен добавить «использовать пространство имен» в Class2.php, Class1 и Class2 оба находятся в одном и том же пространстве имен. Должен ли я добавить «использовать пространство имен», даже если они находятся в одном и том же пространстве имен?

постскриптум Я обнаружил эту проблему с пространством имен, потому что, когда произошла ошибка 504 шлюза, я пытался вызвать API много раз за короткий промежуток времени, и появилось сообщение об ошибке php

«Class1 не найден в Class2.php»

но иногда сообщение об ошибке php показывают

«Невозможно вызвать перегруженную функцию в Class2.php, getClass1Instance ()»

Желаю, чтобы я предоставил достаточно сообщений по этому вопросу, и спасибо всем, кто оставил комментарий или ответил на мой вопрос, м (_ _) м

4

Решение

Я предлагаю вам взглянуть на проверку здоровья ELB.

Проверка работоспособности является источником, казалось бы, случайных ошибок 504, если она не настроена должным образом. Когда ELB считает, что ваш сервер не «исправен», ELB отвечает конечному пользователю 504, и эта ошибка 504 нигде не регистрируется в вашей среде PHP, поскольку она была сгенерирована в ELB.

Увидеть http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/ts-elb-healthcheck.html

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]