如何在 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 脚本的主要内容,如果未能解决你的问题,请参考以下文章
如何配置 Apache 2 以运行 Perl CGI 脚本?