У меня есть сервер со слишком большим количеством виртуальных хостов, около 500 виртуальных хостов, половина из которых с SSL.
Все эти хосты обслуживаются с помощью mod_wsgi для приложений Django.
Я замечаю, что после определенного количества виртуальных хостов весь мой сервер перестает работать и все сайты выходят из строя, я могу справиться с этим, уменьшив количество потоков для каждого виртуального хоста с помощью этой строки:
WSGIDaemonProcess my.domain python-home=/var/www/env python-path=/var/www/my_app threads=1
Apache выдает сбой при достижении около 1300 потоков (когда я проверяю htop). Журнал ошибок apache показывает, что модуль Django не найден, но это не настоящая ошибка, потому что все в порядке, просто происходит, когда количество vhosts слишком велико. Поэтому я думаю, что достигаю какого-то предела с процессами или потоками в Linux. Я использую Ubuntu 18.04, Apache 2.4, и у меня достаточно ОЗУ и ЦП, на сервере 4 ГБ ОЗУ и используется всего 2 ГБ, средний ЦП составляет от 10 до 20%.
Я еще проверяю максимальное количество потоков с помощью:
cat /proc/sys/kernel/threads-max
30893
Что я могу сделать, чтобы увеличить емкость виртуальных хостов в моем apache без создания другого сервера.
1. Возможно, у вас открыто больше файлов, чем вы думаете. Способ сказать (приблизительно):
lsof -u www-data | wc -l
2. попробуйте увеличить размер стека. Посмотрите, сколько тока с
ulimit -s
и установите новое значение с помощью
ulimit -s значение
пс. попробуйте эти настройки для возможности 100k потоков:
ulimit -s 256
ulimit -i 120000
эхо 120000> / proc / sys / kernel / thread-max
эхо 600000> / proc / sys / vm / max_map_count
эхо 200000> / proc / sys / kernel / pid_max
/etc/systemd/logind.conf: UserTasksMax = 100000
На вашем месте, учитывая такое количество виртуальных хостов, я бы разделил эту нагрузку между как минимум парой серверов, используя балансировщик нагрузки и обратный прокси.