我的 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
但它没有帮助。如果超过 350 个虚拟主机,我的 Apache 仍然会崩溃:/
我在 CentOS 5.9 64 位 - 内核 3.0.65-1.el5.elrepo
这是因为 mod_fastcgi 使用 select() 作为多路复用选项。Select 对于这些东西来说非常糟糕,手册页指定了 select;
FD_SETSIZE 通常为 1024,所以一般不支持超过 1024 的文件描述符。您可以像您所做的那样调整 FD_SETSIZE 包含大小,但进行这样的更改也可能会影响旨在与 POSIX 兼容的其他程序。在我看来,如果应用程序编写者建议更改系统源代码以使其正常工作,那么该应用程序就从根本上被破坏了。
我建议离开 mod_fastcgi 并使用另一个实现。取决于您如何看待您的 FastCGI 守护程序可能取决于您如何执行此操作。
mod_fcgid
是一种选择,或者可以使用更新的 apachesmod_proxy_fcgi
。