2013-08-06 47 views

回答

2

爲了向nginx提供已編譯的二進制文件,您需要運行另一個名爲FCGI的服務器,告訴它您希望服務的每個二進制文件的路徑,然後將nginx配置爲代理連接到該服務器。

示例配置:

http 
{ 
    server 
    { 
    listen 80; 
    server_name localhost; 

    location/
    { 
     fastcgi_pass 127.0.0.1:8000; 

     fastcgi_param GATEWAY_INTERFACE CGI/1.1; 
     fastcgi_param SERVER_SOFTWARE nginx; 
     fastcgi_param QUERY_STRING  $query_string; 
     fastcgi_param REQUEST_METHOD  $request_method; 
     fastcgi_param CONTENT_TYPE  $content_type; 
     fastcgi_param CONTENT_LENGTH  $content_length; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_param SCRIPT_NAME  $fastcgi_script_name; 
     fastcgi_param REQUEST_URI  $request_uri; 
     fastcgi_param DOCUMENT_URI  $document_uri; 
     fastcgi_param DOCUMENT_ROOT  $document_root; 
     fastcgi_param SERVER_PROTOCOL $server_protocol; 
     fastcgi_param REMOTE_ADDR  $remote_addr; 
     fastcgi_param REMOTE_PORT  $remote_port; 
     fastcgi_param SERVER_ADDR  $server_addr; 
     fastcgi_param SERVER_PORT  $server_port; 
     fastcgi_param SERVER_NAME  $server_name; 
    } 
    } 
} 

你告訴FCGI其二進制文件,希望成爲像這樣:

spawnfcgi -a 127.0.0.1 -p 8000 -f /path/to/binary 

一旦請求被成功重定向到二進制文件,一個簡單的Hello World,可以這樣寫所以:

#include <stdio.h> 

int main (int argc, char **argv) 
{ 
    printf ("Content-type: text/html\r\n\r\n"); 
    printf ("<h1>Hello, world!</h1>"); 
    return 0; 
} 

要分別處理GET和POST數據,您必須pa將它們分別從環境變量QUERY_STRING和標準輸入中剔除。 POST數據的長度由CONTENT_LENGTH環境變量給出。例如:

printf ("My GET data is: %s<br>", getenv ("QUERY_STRING")); 

int len = atoi (getenv (CONTENT_LENGTH)); 
char *buf = malloc (len + 1); 
read (0, buf, len); 
buf[len] = 0; 

printf ("My POST data is: %s<br>", buf); 

在我看來,nginx並不是服務CGI的最佳選擇。看看lighttpd

+0

非常感謝!你的評論是非常有用的! – Hernan