Nginx没有原生的CGI支持(它支持fastCGI)。这种情况的典型解决方案是将Perl脚本作为fastCGI进程运行,并编辑nginx配置文件以重定向请求到fastCGI进程。如果您只想运行CGI脚本,那么这个解决方案相当复杂。
您一定要使用nginx来解决这个问题吗?如果您只想执行一些Perl CGI脚本,请考虑使用Apache或Lighttpd,因为它们带有CGI模块,可以原生地处理您的CGI脚本,而不需要将脚本作为单独的进程运行。为此,您需要安装Web服务器并编辑Web服务器配置文件以加载CGI模块。对于Lighttpd,您需要在配置文件中添加一行以启用CGI文件的处理,然后将CGI文件放入cgi-bin文件夹中。
安装另一个运行在不同端口上的Web服务器(Apache, Lighttpd),然后使用nginx代理你的CGI请求到该Web服务器。
只需要在安装了一个运行在8080端口的Web服务器之后,将以下内容添加到nginx配置中即可。
location /cgi-bin {
proxy_pass http://127.0.0.1:8080;
}
请查看Nginx位置指令详解以获取更多细节信息。
Nginx是一种Web服务器。您需要使用一个应用服务器来完成您的任务,例如uWSGI。它可以使用其本地非常有效的二进制接口uwsgi与nginx通信。
(Nginx是一种Web服务器,需要使用应用服务器(如uWSGI)来完成任务,并通过其本地二进制接口uwsgi与Nginx通信。)perl
,所以可能需要使用PSGI/Plack(Perl的WSGI + Rack)。 - AshleyOn Ubuntu: apt-get install nginx fcgiwrap
On Arch: pacman -S nginx fcgiwrap
Example Nginx config (Ubuntu: /etc/nginx/sites-enabled/default):
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/access.log;
location / {
root /srv/static;
autoindex on;
index index.html index.htm;
}
location ~ ^/cgi {
root /srv/my_cgi_app;
rewrite ^/cgi/(.*) /$1 break;
include fastcgi_params;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
fastcgi_param SCRIPT_FILENAME /srv/my_cgi_app$fastcgi_script_name;
}
}
include fastcgi.conf
并删除 fastcgi_param SCRIPT_FILENAME ...
这一行。 - gelonidalocation ~ ^/cgi-bin/awstats\.pl {
root /usr/lib/cgi-bin;
rewrite ^/cgi-bin/(.*) /$1 break;
include fastcgi.conf;
fastcgi_pass unix:/run/fcgiwrap.socket;
}
fcgiwrap
软件包。sudo apt-get install fcgiwrap
location /cgi-bin {
gzip off;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
include /etc/nginx/fastcgi_params;
}
然后例如
/var/www/html/cgi-bin/hello.sh
#!/bin/bash
echo -e "Content-type:text/html\n"
echo "<pre>"
env # Show available environment vars, including QUERY_STRING etc