【问题标题】:How to run CGI scripts on Nginx如何在 Nginx 上运行 CGI 脚本
【发布时间】: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

标签: perl nginx cgi centos


【解决方案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 被标记为 perlPSGI/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 ...这一行
    猜你喜欢
    • 2016-10-31
    • 2019-08-06
    • 2011-12-17
    • 2016-12-08
    • 1970-01-01
    • 2018-01-30
    • 2015-05-27
    相关资源
    最近更新 更多