在NGINX上运行CGI脚本

时间:2016-06-28 23:50:23

标签: php perl nginx cgi fastcgi

我知道这个问题已经被提出过了,但是这个问题(How to run CGI scripts on Nginx)没有明确的答案可以帮助我。在我的例子中,我已经使用源代码安装了NGINX,并修复了我的.config文件,以便我可以成功地使用FASTCGI读取.php文件。但是,在运行CGI脚本时,我遇到了一些问题。我知道我安装了FAST CGI,所以我应该将这些.cgi文件命名为.fcgi吗?或者我应该为.cgi文件包含一些知道它与FAST CGI一起工作?我尝试使用nginf.conf文件来包含.fcgi,它现在看起来像这样:

worker_processes  2;

pid        logs/nginx.pid;
error_log syslog:server=unix:/dev/log,facility=local7,tag=nginx,severity=error;

events {
worker_connections  1024;
}


http {
include       mime.types;
default_type  application/octet-stream;

access_log syslog:server=unix:/dev/log,facility=local7,tag=nginx,severity=info combined;

sendfile        on;
keepalive_timeout  65;


server {
    listen       80;
    server_name  localhost;
        root   /home/parallels/Downloads/user_name/nginx/html;
    location / {

 index index.html index.htm new.html;
        autoindex on;
    }

location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000;
 #fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  HTTPS              off;
include fastcgi_params;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
}
location ~ \.pl|fcgi$ {
  try_files $uri =404;
  gzip off;
  fastcgi_pass  127.0.0.1:9000;
  fastcgi_index index.pl;
  #fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  include fastcgi_params;
  } 

    #error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}
}

但是,每当我运行.fcgi脚本(例如

)时
#!/usr/bin/perl

print "Content-type: text/html\n\n";
print "<html><body>Hello, world.</body></html>";

我看到的屏幕看起来像这样:

enter image description here

我很确定这不正常;我应该在屏幕上看到Hello, world.,而不是所有的代码。如果我的想法确实是错误的,那么请告诉我,这应该是正确的输出。

此外,在旁注中,如果我将此作为我的files.fcgi文件:

#!/usr/bin/perl
my $output = `ls`;
print $output

运行类似这样的内容会返回.fcgi文件所在目录中所有文件的列表。无论如何,我可以在Web浏览器上显示它吗?看一下在线的例子,似乎人们已经能够在他们的浏览器上运行file.fcgi并看到shell命令的输出(这让我相信我做错了什么,因为我跑的时候它在命令行上列出了所有文件,但在浏览器上,它只打印出我的代码)。假设我做错了什么,有谁知道我可能做错了什么。如果您需要更多信息,请告诉我们!

谢谢你,祝你有个美好的一天!

2 个答案:

答案 0 :(得分:2)

nginx不支持CGI脚本,无法自行启动FastCGI脚本 - 它只能连接到已经运行的FastCGI进程。

如果要运行CGI脚本,请使用支持它们的Web服务器,例如Apache。虽然有一些解决方法,但在这个阶段它们会让你感到困惑。

答案 1 :(得分:1)

搜索"fastcgi wrapper"以找到旨在弥合“现代”网络服务器之间差距的各种程序,这些网络服务器不喜欢处理请求的产生过程和传统的CGI程序。

[nginx       ]    one socket     [wrapper     ]  ,-- forks a single subprocess
[runs        ] == connection ==> [also runs   ] ---- running your CGI program
[continuously]    per request    [continuously]  `-- for each request

虽然标准CGI API是“针对每个请求,但服务器使用env vars调用您的程序来描述请求以及stdin上的正文(如果有的话),并且您的程序应该在stdout上发出响应并退出” ,fcgi API希望你的程序能够不断运行并处理在套接字上传递给它的请求 - 这样,它就更像是一个服务器。见http://en.wikipedia.org/wiki/FastCGI