Назад | Перейти на главную страницу

Apache2 - внутренняя ошибка сервера 500

Я использую VPS с Linux CentOs 6 с 4 ГБ ОЗУ, 10 ГБ жесткого диска и 2 виртуальных процессора Intel (R) Xeon (R) CPU L5640 @ 2,27 ГГц. Как говорит мой хост, каждый виртуальный процессор должен быть не менее 0,5 физического процессора.

В определенное время дня те, у кого больше трафика, пытаясь получить доступ к моему php-скрипту, я периодически получаю сообщение «500 Internal server error».

Я активирую ведение журнала для уровня отладки из apache, а также ведение журнала PHP с помощью E_ALL, но я не могу найти ссылку на ошибку 500 ни в одном журнале (я проверил правильные журналы!).

У меня нет файла .htaccess в сценарии пути. Странно то, что ошибка начинается с первой строки php в скрипте (предыдущий html отображается правильно, но в первой строке php скрипт отправляет ошибку 500).

Загрузка процессора всегда хорошая (макс. 0,15 0,08 0,01), а ОЗУ близка к 95%, но она приходила на свопинг всего 2 раза в месяц с 2-5 МБ.

Apache работает с prefork со следующими значениями:

<IfModule prefork.c>
  StartServers       8
  MinSpareServers    5
  MaxSpareServers   20
  ServerLimit      280
  MaxClients       280
  MaxRequestsPerChild  4000
</IfModule>

Все работает правильно, и я не получаю никаких ошибок в спокойное время, но я начинаю получать ошибки при увеличении трафика (6-9000 посещений в час).

Могу ли я решить задачу увеличения ресурсов? (я могу увеличить оперативную память до 16 ГБ).

Это может зависеть от достижения MaxClients (но apache должен записывать это в журнал, верно?)?

Если я увеличу объем оперативной памяти до 6 или 8 ГБ, мне нужно будет рассчитать значение MaxClients с этим?

MaxClients = Total RAM dedicated to the web server / Max child process size

Максимальный размер дочернего процесса составляет около 20 МБ.

А как еще может быть проблема?

заранее спасибо

Вот раздел php.ini о регистрации ошибок

error_reporting = E_ALL | E_STRICT
display_errors = Off
display_startup_errors = Off
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = Off
html_errors = Off
error_log = /var/log/php_errors.log

Все, что не упомянуто, комментируется.

Первый порт вызова при обнаружении 500 ошибок в PHP - это проверка журнала ошибок PHP; Если apache не сообщает об ошибке 500, то это вызвано PHP.

Чтобы проверить, достигли ли вы ограничений на ресурсы, включите и посмотрите apache Статус сервера.

Это причина проблемы:

Max Requests Per Child: 4000

+ Изменить MaxRequestsPerChild на меньшее значение, попробуйте начать с 70, и все прерывистые внутренние ошибки сервера 500 исчезнут.