Мой Apache выдает ошибки Internal Server Error 500 и ведет такие журналы:
> [Sun Apr 07 23:35:24 2013] [error] [client 124.162.30.45] (2)No such
> file or directory: FastCGI: failed to connect to server
> "/home/magda_00aa/sportxxx.pl/sportxxx.pl.0fake": socket file
> descriptor (1063) is larger than FD_SETSIZE (1024), you probably need
> to rebuild Apache with a larger FD_SETSIZE, referer:
> http://www.surf4web.com/surfing.php?id=haoduodeng2012
Я увеличил пределы FD внутри:
cat /usr/include/bits/typesizes.h | grep FD
#define __FD_SETSIZE 65536
и
cat /usr/include/linux/posix_types.h | grep FD_SETSIZE
#undef __FD_SETSIZE
#define __FD_SETSIZE 65536
#define __FDSET_LONGS (__FD_SETSIZE/__NFDBITS)
а также
/sbin/sysctl fs.file-max
fs.file-max = 512000
ulimit -n
1000000
но это не помогло. Мой Apache по-прежнему дает сбой, если виртуальных хостов больше 350: /
Я использую 64-разрядную версию CentOS 5.9 - ядро 3.0.65-1.el5.elrepo
Это потому, что mod_fastcgi использует select () в качестве опции мультиплексирования. Select очень плох для этого, на странице руководства указано для select;
Fd_set - это буфер фиксированного размера. Выполнение FD_CLR () или FD_SET () со значением fd, которое отрицательно, равно или больше FD_SETSIZE, приведет к неопределенному поведению. Более того, POSIX требует, чтобы fd был допустимым дескриптором файла.
FD_SETSIZE обычно равен 1024, поэтому файловые дескрипторы более 1024 в целом не поддерживаются. Вы можете возиться с FD_SETSIZE include sizes, как и вы, но внесение подобных изменений может повлиять и на другие программы, которые стремятся быть совместимыми с POSIX. На мой взгляд, если автор приложения предлагает изменить исходный код системы, чтобы заставить эту работу работать, тогда приложение в корне не работает.
Я предлагаю отказаться от mod_fastcgi и использовать другую реализацию. В зависимости от того, как вы смотрите, ваши демоны FastCGI могут зависеть от того, как вы это делаете.
mod_fcgid
это один из вариантов, или более новые апачи могут использовать mod_proxy_fcgi
вместо.