web-dev-qa-db-ja.com

ソケットファイル記述子(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を使用しています

3
Spacedust

これは、mod_fastcgiがselect()を多重化オプションとして使用するためです。選択は、このことについてはかなり悪いです、manページは選択のために指定します。

Fd_setは固定サイズのバッファーです。負の値、またはFD_SETSIZE以上のfdの値を使用してFD_CLR()またはFD_SET()を実行すると、未定義の動作が発生します。さらに、POSIXではfdが有効なファイル記述子である必要があります。

FD_SETSIZEは通常1024であるため、一般に1024を超えるファイル記述子はサポートされていません。 FD_SETSIZEインクルードサイズをいじることができますが、このような変更を行うと、POSIX準拠を目指す他のプログラムにも影響を与える可能性があります。私の意見では、アプリケーション作成者がシステムのソースコードを変更してこれを機能させることを提案している場合、アプリケーションは根本的に壊れています。

私はmod_fastcgiから離れて別の実装を使用することをお勧めします。 FastCGIデーモンの開始方法に応じて、これをどのように行うかに依存します。

mod_fcgidは1つのオプションであるか、新しいパッチでは代わりにmod_proxy_fcgiを使用できます。

3
Matthew Ife