2012-03-25 36 views
2

我用C使用fastcgi.com的API製作了FCGI程序。我已經打電話FCGI_Accept像文檔說。當我運行得到的可執行文件時,它就像CGI程序一樣運行,然後退出。用於產生FCGI服務器的C API?

我需要在UNIX域套接字上監聽的Web服務器的API。我正在使用nginx,它自己並沒有產生FCGI程序和fastcgi.com的API庫。我不想用其他服務器或庫來產生我的FCGI程序。

+0

fastcgi程序從任何其他程序開始(即,通過'main')。您需要配置您的HTTP服務器以將其作爲FastCGI應用程序啓動。 – 2012-03-25 20:18:43

+0

@BasileStarynkevitch nginx不生成FastCGI應用程序。 – unixman83 2012-03-25 20:33:54

+0

這意味着'ngnix'可能不支持FastCGI,否則需要FastCGI應用程序從外部啓動(例如,通過您的系統啓動腳本,例如在/ etc/init.d /中)。那麼啓動FastCGI應用程序仍然是一個系統管理員問題,這個問題不屬於這裏(因爲它與編碼無關)。 – 2012-03-25 22:01:08

回答

1

我遇到了同樣的問題,試圖啓動使用nginx使用fcgi_stdio庫編寫的FastCGI應用程序。如果我通常啓動應用程序,它就像正常的CGI一樣,並立即退出。我不確定通常使用什麼祕密醬來讓應用程序像http守護程序(而不是CGI)一樣採用FastCGI而不是CGI,但是spawn-fcgi這樣做。它可以在EPEL存儲庫中用於RHEL/CentOS/Amazon Linux /等。我不知道這是否有助於你的情況,但這是我最終使用的結果。

2

Unixman,nginx不會自己產生FCGI服務。您的程序需要啓動並且有一個主循環,它將接受FastCGI請求。 Nginx會將這些請求轉發給您的軟件。

如果你想要一個簡單的方法來做到這一點(雖然代碼是C++而不是C!),你可以使用(F)CGI kitWt FCGI kit。這兩個都可以/將會爲你處理主循環,然後你只需要在處理函數中調用你的C代碼。

+0

我沒有使用框架。我正在使用fastcgi.com上的FCGI API。它所要做的就是調用'FCGI_Accept',但這不起作用。它只是像一個正常的CGI運行,然後退出。 – unixman83 2012-03-26 20:39:31

2

只需創建一個unix域套接字偵聽器並將套接字描述符複製到STDIN_FILENO即可。

dup2(socket, STDIN_FILENO); 
while(FCGI_Accept() >= 0) { 
    /* ... */ 
} 
+0

@ unixman83您的應用程序是服務器,Web服務器是客戶端,只需確定您希望unix域套接字的位置並指示您的Web服務器(客戶端)連接到指定的套接字路徑即可。不需要更多的套接字,所有的消息都通過我說的套接字傳遞。 – chansen 2012-04-11 21:17:00

+0

您未顯示STDOUT。我如何處理'STDOUT'和'STDERR'? – unixman83 2012-04-11 21:50:33

3

只需按照以下步驟 -

  1. 打開使用FCGX_OpenSocket()插座
  2. 初始化使用FCGX_InitRequest()
  3. 循環使用FCGX_Accept_r()而不是FCGI_Accept將()

這裏是完整的工作示例 -

#include <fcgi_stdio.h> 

#define PATH_SOCKET "/tmp/hello.sock" 

int main() { 
    int sock = FCGX_OpenSocket(PATH_SOCKET, 10); 
    FCGX_Request request; 

    FCGX_Init(); 
    FCGX_InitRequest(&request, sock, 0); 

    while (FCGX_Accept_r(&request) == 0) { 
     FCGX_FPrintF(request.out, "Content-Type: text/plain\r\n\r\n" 
       "Hello World!\r\n"); 
     FCGX_Finish_r(&request); 
    } 

    return 0; 
}