如何在 Nginx 上运行 CGI 脚本

Posted

技术标签:

【中文标题】如何在 Nginx 上运行 CGI 脚本【英文标题】:How to run CGI scripts on Nginx 【发布时间】:2012-07-24 22:23:22 【问题描述】:

我在设置要在 nginx 上运行的 CGI 脚本时遇到问题,到目前为止我已经找到了 http://wiki.nginx.org/SimpleCGI 这个东西,但问题是我不能让 perl 脚本作为服务运行,这样它就可以在后台运行,甚至如果重新启动,它将自动开始运行

你有什么想法吗?我正在运行 Centos 5

我找到了一些解决方案here,但我无法将那里给出的代码与this Perl script 集成 我在 Perl 上完全为零,请帮助我 谢谢

【问题讨论】:

既然你“在 Perl 上为零”,请考虑用 C 来编写你的 CGI。 Perl 有一些严重的缺点,例如每次使用时都需要对其进行编译,并且通常很难理解,除非您是 perl 迷。如果你的程序是编译的 C 标准输入来自浏览器,标准输出到浏览器,它也很小而且很高效。我将为我自己的一个程序插入一个插件,查看其中的 jbe.c,这就是编译成 CGI 程序 jbe 的内容。 sourceforge.net/projects/cgi-jukebox 【参考方案1】:

Nginx 没有原生 CGI 支持(它支持 fastCGI)。典型的解决方案是将 Perl 脚本作为 fastCGI 进程运行并编辑 nginx 配置文件以将请求重定向到 fastCGI 进程。如果您只想运行 CGI 脚本,这是一个相当复杂的解决方案。

这个解决方案必须使用 nginx 吗?如果您只想执行一些 Perl CGI 脚本,请考虑使用 Apache 或 Lighttpd,因为它们带有 CGI 模块,它们将本机处理您的 CGI 脚本并且不需要将脚本作为单独的进程运行。为此,您需要安装 Web 服务器并编辑 Web 服务器配置文件以加载 CGI 模块。对于 Lighttpd,您需要在配置文件中添加一行以启用 CGI 文件的处理。然后将 CGI 文件放入 cgi-bin 文件夹中。

【讨论】:

感谢您的评论,是的,我需要使用 Nginx,因为整个网站都在 Nginx 下运行,现在我有这个(forkosh.com/mimetex.html)CGI 脚本可以在网站下运行,web-站点是数学测试,所以我需要支持 Mimetex 表示法,但它仅作为 CGI 运行......到目前为止,我已经为 php 脚本配置了 FastCGI,但它不适用于简单的 CGI :( 请帮助...... 虽然 apache 和 lighttpd 自带了自己的 cgi 模块,但 cgi 脚本仍然在单独的进程中运行——作为 Web 服务器的子进程。他们的 cgi 模块只做解析 URL、填充环境变量等工作。 你有没有想过如何用 NGINX 运行 CGI 脚本?我已经正确设置了 FASTCGI,但是当我运行 CGI 脚本时,我看到的只是脚本的代码。 谢谢!这个答案可能对 OP 没有帮助,但它确实帮助了我。顺便说一句,你知道为什么 NGINX 根本不打算支持 CGI 吗? CGI 对我来说似乎是一个不错的后备方案。【参考方案2】:

Nginx 是一个网络服务器。您需要为您的任务使用应用程序服务器,例如uWSGI。它可以使用其原生的非常有效的二进制接口 uwsgi 与 nginx 通信。

【讨论】:

由于 OP 被标记为 perl,PSGI/Plack(Perl 的 WSGI + Rack)可能是需要的。 我会被诅咒的;刚刚了解到 uWSGI 包含 PSGI 支持,太好了! 你是说 Apache 和 Lighttpd 以及其他许多不是 Web 服务器,因为它们支持 CGI?使用“应用程序服务器”来运行 CGI 脚本是大材小用。 Apache 既可以是应用服务器,也可以是 Web 服务器。它在运行您的 Web 应用程序时充当应用程序服务器。 Lighttpd 本身不运行 CGI。它使用 FastCGI 协议与应用程序通信,就像 nginx 一样。【参考方案3】:

安装另一个在不同端口上运行的 Web 服务器(Apache、Lighttpd)。然后使用 nginx 将您的 CGI 请求代理到网络服务器。

在 8080 上安装 web 服务器后,只需将其添加到 nginx 配置中

location /cgi-bin 
    proxy_pass http://127.0.0.1:8080;

查看Nginx Location Directive Explained了解更多详情。

【讨论】:

我应该在不同的端口上创建另一个网络服务器实例吗?我的意思是我需要安装 Nginx 的新实例吗?还是应该是 Apache 的? 你应该在不同的端口上安装 apache 或 lighthttpd,然后通过 nginx 代理它的 cgi-bin 文件夹。 这样做有什么好处?为什么不自己运行 Apache? NGINX 作为中间层有什么好处? 您可能会在提供一些 cgi 脚本的同时提供静态文件或 fastcgi。由于 nginx 的事件设计,Nginx 提供静态文件和 fastcgi 相关内容的速度比 apache 更快。 Nginx 不按设计执行 cgi 脚本,因为它必须打开一个新线程或进程来处理 cgi 脚本。【参考方案4】:

我发现这个使用 FastCGI 的 hack 比运行另一个 Web 服务器要好一些。 http://nginxlibrary.com/perl-fastcgi/

【讨论】:

【参考方案5】:

我发现了这个:https://github.com/ruudud/cgi 它说:

===

On 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;
    

将 root 和 fastcgi_param 行更改为包含 CGI 脚本的目录,例如此存储库中的 cgi-bin/ 目录。

如果您是控制狂并手动运行 fcgiwrap,请务必相应地更改 fastcgi_pass。当使用开箱即用的 fcgiwrap 设置时,示例中列出的路径是 Ubuntu 中的默认路径。

===

我要试试。

【讨论】:

嗨,欢迎您,也许您应该在发布答案之前尝试确认解决方案? :) 我认为现在你可以使用include fastcgi.conf并删除fastcgi_param SCRIPT_FILENAME ...这一行

以上是关于如何在 Nginx 上运行 CGI 脚本的主要内容,如果未能解决你的问题,请参考以下文章

nginx uwsgi 和 cgi python 脚本

如何配置 Apache 2 以运行 Perl CGI 脚本?

php,cgi,nginx关系

如何使用 xampp 在 ubuntu 中运行 python cgi 脚本

如何在ubuntu下编译安装zabbix系统

如何在 localhost 中运行 perl 脚本?