Home > linux > Переходим с prefork на mpm-worker на Apache с mod_php (CentOS)

Переходим с prefork на mpm-worker на Apache с mod_php (CentOS)

October 11th, 2010

Итак, допустим вы решили перейти на worker MPM в Apache чтобы повысить производительность. Имеем CentOS с Apache и PHP установленные из репозитория Remi.
Сначала устанавливаем новый тредобезопасный модуль PHP:

yum --enablerepo=remi install php-zts

Возможно придется обновить PHP до последней версии.

Затем в /etc/sysconfig/httpd раскомментируем строчку:

HTTPD=/usr/sbin/httpd.worker

Убедимся, что в конфиге апача присутствуют примерно такие настройки:

<IfModule worker.c>
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), заменив на тредобезопасные варианты.

Рестартуем апач:

/etc/init.d/httpd restart

И получаем результат:

ps auxww |grep http
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

linux ,

  1. F_S
    January 28th, 2011 at 11:07 | #1

    Сделал всё как описано, эффект отличный! Потребление памяти снизилось на треть.

    Но проблема возникла более существенная
    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.

  2. admin
    January 28th, 2011 at 11:28 | #2

    А php -i |grep mbstring что говорит?

  3. F_S
    January 28th, 2011 at 11:30 | #3

    @

    F_S

    Эту проблему нашёл как решить – нужно в php.ini сменить путь к модулям
    с
    extension_dir = “/usr/lib64/php/modules”
    на
    extension_dir = “/usr/lib64/php/modules-zts”

    (После этого конечно и рестартовать апач)
    Эта проблема решена.

    И обнаружилась следующая!
    Could not connect to database.

    Что-то не так и с MySQL …

  4. F_S
    January 28th, 2011 at 11:38 | #4

    @

    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 => …..

  5. F_S
    January 28th, 2011 at 11:52 | #5

    @

    admin

    Админ админыч, помогай… сам наверно не справлюсь
    чего-нить ещё наделаю не так )

  6. F_S
    January 28th, 2011 at 12:44 | #6

    @

    admin

    Ещё комментарий –
    PHP сам по себе сейчас работает.
    MySQL (заходил из консоли) тоже работает.

    Очевидно как-то накрылась связующее звено php-mysql.. пытаюсь починить, но пока безуспешно.

  7. F_S
    January 28th, 2011 at 13:12 | #7

    @

    F_S

    yum –enablerepo=remi reinstall php-mysql
    не помогает.

  8. F_S
    January 28th, 2011 at 14:30 | #8

    @

    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: Надеюсь, мои комментарии к статье помогли ещё многим решить проблемы с настройкой новой конфигурации 🙂

  9. F_S
    January 28th, 2011 at 14:34 | #9

    PPS:
    И да, убедитесь, что в /etc/my.conf
    в блоке

    [mysqld]

    установлено отключение старой схемы паролей

    old-passwords=0

  10. admin
    January 28th, 2011 at 14:48 | #10

    То есть вы, видимо, еще mysql проапдейтили и это создало проблему. Желательно в таких случаях рассказывать обо всех действиях совершенных до появления проблемы.

  11. F_S
    January 28th, 2011 at 16:25 | #11

    @

    admin

    нет, mysql-server (mysqld) остался прежним, 5.1.что-то-там

  12. F_S
    January 28th, 2011 at 16:26 | #12

    @

    F_S

    * PHP последний на данный момент, – 5.3.5

  13. madoff
    April 24th, 2011 at 23:28 | #13

    F_S :
    @
    admin

    нет, mysql-server (mysqld) остался прежним, 5.1.что-то-там

    пишите в icq 241606 вам надо пересобрать php иначе не увидит он. стоимость работы 15 wmz, соберём worker + php modules

  14. observer
    May 13th, 2011 at 10:54 | #14

    пишите в icq 241606 вам надо пересобрать php иначе не увидит он. стоимость работы 15 wmz, соберём worker + php modules

    сразу стервятники накинулись, особо не разбираясь что к чему 🙂

  15. F_S
    October 4th, 2011 at 11:22 | #15

    observer, забавно, но сообщений 5-7 выше я написал, что всё сделано, заработало )
    Кто-то (madoff-like) видимо, совсем не читая тред, комменты оставляет =)

  1. No trackbacks yet.