Я использую 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 исчезнут.