Linux
套接字文件描述符 (1063) 大於 FD_SETSIZE (1024),您可能需要使用更大的 FD_SETSIZE 重建 Apache
我的 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() 作為多路復用選項。選擇對於這些東西來說非常糟糕,手冊頁指定了選擇;
fd_set 是一個固定大小的緩衝區。使用 fd 為負數或等於或大於 FD_SETSIZE 的值執行 FD_CLR() 或 FD_SET() 將導致未定義的行為。此外,POSIX 要求 fd 是有效的文件描述符。
FD_SETSIZE 通常為 1024,因此一般不支持超過 1024 的文件描述符。您可以像您所做的那樣擺弄 FD_SETSIZE 包含大小,但是進行這樣的更改也可能會影響其他旨在符合 POSIX 的程序。在我看來,如果應用程序編寫者建議更改系統原始碼以使其工作,那麼應用程序從根本上就被破壞了。
我建議離開 mod_fastcgi 並使用另一個實現。取決於您如何盯著 FastCGI 守護程序,這取決於您如何執行此操作。
mod_fcgid
是一種選擇,或者可以使用更新的 apachemod_proxy_fcgi
。