Переходим с prefork на mpm-worker на Apache с mod_php (CentOS)
Итак, допустим вы решили перейти на worker MPM в Apache чтобы повысить производительность. Имеем CentOS с Apache и PHP установленные из репозитория .
Сначала устанавливаем новый тредобезопасный модуль PHP:
Возможно придется обновить PHP до последней версии.
Затем в /etc/sysconfig/httpd раскомментируем строчку:
Убедимся, что в конфиге апача присутствуют примерно такие настройки:
StartServers 1
MaxClients 50
MinSpareThreads 15
MaxSpareThreads 35
ThreadsPerChild 25
MaxRequestsPerChild 2000
</IfModule>
Где:
StartServers – сколько процессов стартует при запуске
MinSpareThreads/MaxSpareThreads – сервер будет держать количество свободных потоков (про запас) в этих рамках. Свободные потоки – это сумма потоков во всех процессах
MaxClients – максимально количество одновременных клиентов. Т.е. максимальное количество потоков во всех процессах.
ThreadsPerChild – сколько потоков может создавать каждый процесс. Т.о. если мы разделим MaxClients на ThreadsPerChild, то получим сколько максимум процессов будет создано при максимальной загрузке.
ServerLimit – сколько макс. процессов может быть. Естественно, это число должно быть не меньше MaxClients/ThreadsPerChild – числа процессов при максимальной нагрузке.
MaxRequestsPerChild – через сколько запросов уничтожается процесс.
Если используется Zend или IonCube надо поправить пути к ним (обычно в php.ini), заменив на тредобезопасные варианты.
Рестартуем апач:
И получаем результат:
root 19552 0.0 0.5 31020 11300 ? Ss 20:50 0:00 /usr/sbin/httpd.worker
apache 19555 150 39.2 1125872 813092 ? Sl 20:50 17:17 /usr/sbin/httpd.worker

Сделал всё как описано, эффект отличный! Потребление памяти снизилось на треть.
Но проблема возникла более существенная
Fatal error: Call to undefined function mb_internal_encoding()
В папке /etc/php-zts.d файлик mbstring.ini на месте, следующего содержания:
—
; Enable mbstring extension module
extension=mbstring.so
—
Сам модуль /usr/lib64/php/modules-zts/mbstring.so – также на месте.
В /etc/php.ini никаких изменений не делал.
- Нужна помощь в решении вопроса с mbstring.
А php -i |grep mbstring что говорит?
@
F_S
Эту проблему нашёл как решить – нужно в php.ini сменить путь к модулям
с
extension_dir = “/usr/lib64/php/modules”
на
extension_dir = “/usr/lib64/php/modules-zts”
(После этого конечно и рестартовать апач)
Эта проблема решена.
…
И обнаружилась следующая!
Could not connect to database.
Что-то не так и с MySQL …
@
admin
php -i |grep mbstring говорит странное -
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib64/php/modules-zts/curl.so’ – /usr/lib64/php/modules-zts/curl.so: undefined symbol: file_globals_id in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib64/php/modules-zts/fileinfo.so’ – /usr/lib64/php/modules-zts/fileinfo.so: undefined symbol: file_globals_id in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib64/php/modules-zts/json.so’ – /usr/lib64/php/modules-zts/json.so: undefined symbol: core_globals_id in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib64/php/modules-zts/mbstring.so’ – /usr/lib64/php/modules-zts/mbstring.so: undefined symbol: core_globals_id in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib64/php/modules-zts/mysql.so’ – /usr/lib64/php/modules-zts/mysql.so: undefined symbol: core_globals_id in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib64/php/modules-zts/mysqli.so’ – /usr/lib64/php/modules-zts/mysqli.so: undefined symbol: core_globals_id in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib64/php/modules-zts/pdo.so’ – /usr/lib64/php/modules-zts/pdo.so: undefined symbol: executor_globals_id in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib64/php/modules-zts/pdo_mysql.so’ – /usr/lib64/php/modules-zts/pdo_mysql.so: undefined symbol: mysqlnd_allocator in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib64/php/modules-zts/pdo_sqlite.so’ – /usr/lib64/php/modules-zts/pdo_sqlite.so: undefined symbol: core_globals_id in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib64/php/modules-zts/phar.so’ – /usr/lib64/php/modules-zts/phar.so: undefined symbol: file_globals_id in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib64/php/modules-zts/zip.so’ – /usr/lib64/php/modules-zts/zip.so: undefined symbol: core_globals_id in Unknown on line 0
Configure Command => …..
@
admin
Админ админыч, помогай… сам наверно не справлюсь
чего-нить ещё наделаю не так )
@
admin
Ещё комментарий -
PHP сам по себе сейчас работает.
MySQL (заходил из консоли) тоже работает.
Очевидно как-то накрылась связующее звено php-mysql.. пытаюсь починить, но пока безуспешно.
@
F_S
yum –enablerepo=remi reinstall php-mysql
не помогает.
@
F_S
Проблема решена!
В исходных кодах убрал собаку (@) перед mysql_connect, полная выдача получилась следующей:
Warning: mysql_connect(): Premature end of data (mysqlnd_wireprotocol.c:554) in …..
Warning: mysql_connect(): OK packet 1 bytes shorter than expected in …..
Warning: mysql_connect(): mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication. Please use an administration tool to reset your password with the command SET PASSWORD = PASSWORD(‘your_existing_password’). This will store a new, and more secure, hash value in mysql.user. If this user is used in other scripts executed by PHP 5.2 or earlier you might need to remove the old-passwords flag from your my.cnf file in …..
Итак, что надо сделать:
зайти в MySQL в консоли на сервере и собственно выполнить команду
SET PASSWORD = PASSWORD(‘your_existing_password’);
(пароль конечно же тут ваш собственный)
И всё снова заработало!
Но уже легче и быстрее
PS: Надеюсь, мои комментарии к статье помогли ещё многим решить проблемы с настройкой новой конфигурации
PPS:
И да, убедитесь, что в /etc/my.conf
в блоке
[mysqld]
установлено отключение старой схемы паролей
old-passwords=0
То есть вы, видимо, еще mysql проапдейтили и это создало проблему. Желательно в таких случаях рассказывать обо всех действиях совершенных до появления проблемы.
@
admin
нет, mysql-server (mysqld) остался прежним, 5.1.что-то-там
@
F_S
* PHP последний на данный момент, – 5.3.5
пишите в icq 241606 вам надо пересобрать php иначе не увидит он. стоимость работы 15 wmz, соберём worker + php modules
сразу стервятники накинулись, особо не разбираясь что к чему
observer, забавно, но сообщений 5-7 выше я написал, что всё сделано, заработало )
Кто-то (madoff-like) видимо, совсем не читая тред, комменты оставляет =)