Linux

套接字文件描述符 (1063) 大於 FD_SETSIZE (1024),您可能需要使用更大的 FD_SETSIZE 重建 Apache

  • April 8, 2013

我的 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是一種選擇,或者可以使用更新的 apache mod_proxy_fcgi

引用自:https://serverfault.com/questions/497086