套接字文件描述符(1063)大于FD_SETSIZE(1024),则可能需要使用更大的FD_SETSIZE

我的Apache抛出内部服务器错误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 

但没有帮助。 如果超过350个虚拟主机,我的Apache仍然崩溃:/

我在CentOS 5.9 64位 – 内核3.0.65-1.el5.elrepo

这是因为mod_fastcgi使用select()作为复用选项。 select是非常糟糕的这个东西,手册页指定select;

一个fd_set是一个固定大小的缓冲区。 执行FD_CLR()或FD_SET()的值为负值或等于或大于FD_SETSIZE的值将导致未定义的行为。 而且,POSIX要求fd是一个有效的文件描述符。

FD_SETSIZE通常是1024,所以通常不支持1024以上的文件描述符。 您可以按照您所做的操作FD_SETSIZE包含大小,但是像这样做的更改也可能会影响到其他程序,其目标是符合POSIX。 在我看来,如果应用程序编写人员build议更改系统源代码以使其工作,那么应用程序将从根本上被打破。

我build议脱离mod_fastcgi并使用另一个实现。 取决于你如何盯着你的FastCGI守护进程可以取决于你如何做到这一点。

mod_fcgid是一个选项,或者更新的apaches可以使用mod_proxy_fcgi代替。