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

Apache 2.4 на AIX 6.1, несколько виртуальных хостов с Proxy / BalancerMember -> проблемы с файлами slotmem с общей памятью (shm)

У меня есть конфигурация Apache 2.4.23 с включенным mod_proxy / mod_proxy_balancer / mod_slotmem_shm / mod_lbmethod_byrequests.

Кроме того, у меня есть несколько VirtualHost, прослушивающих разные порты с такой настройкой (ПОРТ и КОМПОНЕНТ уникальны):

Listen PORT

<VirtualHost *:PORT>
    Include "eib/conf/default-proxy-params"

    ErrorLog "logs/PORT-COMPONENT-error.log"
    CustomLog "logs/PORT-COMPONENT-access.log" common

    <Proxy balancer://COMPONENT/>
            BalancerMember https://HOST1:PORT
            BalancerMember https://HOST2:PORT
            ProxySet lbmethod=byrequests
    </Proxy>

    ProxyPass / balancer://COMPONENT/ lbmethod=byrequests nofailover=Off maxattempts=3
    ProxyPassReverse / balancer://COMPONENT/
</VirtualHost>

Когда в моей конфигурации есть только одна запись VirtualHost, все работает нормально. Как только я добавляю еще один VirtualHost, Apache вылетает с ошибкой конфигурации:

[Wed Oct 12 21:59:38.211829 2016] [slotmem_shm:error] [pid 4129010:tid 1] (24)Too many open files: AH02611: create: apr_shm_create(/apache/logs/slotmem-shm-pf3f0916c.shm) failed
[Wed Oct 12 21:59:38.211927 2016] [:emerg] [pid 4129010:tid 1] AH00020: Configuration Failed, exiting

Я проверил, что для ulimit установлено неограниченное количество файлов, так что это не может быть проблемой. Похоже, что существует конфликт между файлами slotmem, созданными для BalancerMemebers.

Когда я начинаю только с одним VirtualHost, все будет работать, как ожидалось, и я получаю следующие файлы slotmem:

slotmem-shm-p99964586.shm
slotmem-shm-p99964586_COMPONENT.shm

Один кажется уникальным (_COMPONENT) для виртуального хоста, но второй выглядит так, как будто он может вызвать конфликты имен.

Есть у кого-нибудь идеи, как решить эту проблему?

У меня была аналогичная ошибка в MacOS с Apache, скомпилированным из исходного кода, и оказалось, что ошибка на самом деле довольно описательна, если вы знаете, что она означает. Очевидно, есть некоторые инструменты для управления общей памятью (как в Linux, так и в OS X).

В моем случае работает:

ipcs -m

дал мне какой-то вывод вроде:

IPC status from <running system> as of Fri Feb  1 15:43:45 CET 2019
T     ID     KEY        MODE       OWNER    GROUP
Shared Memory:
m  65536 0x52043973 --rw-------     root    wheel
m 393217 0xe3046b9b --rw-------  myuser1    staff

... затем скажем еще 20. Я попытался освободить это, выполнив:

ipcrm -m 393217

после этого ошибка не возникла и apache запустился. Надеюсь, это кому-нибудь поможет, оно должно работать как на Linux, так и на MacOS и, вероятно, на * nix.

хвала и честь завету! С помощью

truss -f apachectl -X 

Мне удалось отследить ошибку до вызова shmat

6226262:    45089225: shmat(39845990, 0x00000000, 0)    Err#24 EMFILE

man shmat на AIX раскрывает секрет:

Доступна расширенная возможность shmat. Если определена переменная среды EXTSHM = ON, то процессы, выполняющиеся в этой среде, смогут создавать и присоединять более одиннадцати сегментов разделяемой памяти.