У меня есть конфигурация 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, то процессы, выполняющиеся в этой среде, смогут создавать и присоединять более одиннадцати сегментов разделяемой памяти.