3

我目前正在开发高负载项目,我需要使用 C/FastCGI/nginx 组合。

问题是,我需要我的 FastCGI 应用程序在线程/进程中运行。

我知道有两种方法可以做到这一点:

1) 编译程序,然后使用spawn-fcgi来分叉进程。(我不能用这个)

2) 运行FCGX_Init(),而不是 pre-fork 到 10 个进程 BEFOREwhile (FCGX_Accept_r(&request) >= 0)

3) 之后运行 pthreadswhile (FCGX_Accept_r(&request) >= 0)

所以,我的问题是:whis 是运行 fastcgi 应用程序的最快方法。我可以在此之后预分叉 fastcgi 应用程序吗:

int sock = FCGX_OpenSocket(":9000", 10);
FCGX_InitRequest(&request, sock, 0);

10 个进程可以监听单个套接字吗?如果我有N个进程正在运行,我是否必须使用线程?这样就够了吗?

4

1 回答 1

4

我不知道您具体使用的 FastCGI API,但通常您不能将文件描述符(即套接字)移交给另一个进程,除非它在您分叉之前已打开。进程具有独立的文件描述符表。线程都将共享同一个文件描述符表,因为它们在同一个进程中。

据我所知,一次只能让一个进程监听一个端口。通常要做的是让一个线程唯一的工作是监听连接。当它得到一个时,连接被接受并交给池中的下一个工作线程,通过让线程接管接受的套接字(而不是侦听套接字)直到套接字关闭。侦听器线程立即返回侦听连接。

这应该给你最小的开销。

于 2011-06-23T21:29:27.473 回答