如何在NGINX服务器上运行c ++ CGI脚本

问题描述 投票:0回答:2

我在/etc/nginx/conf.d中创建的配置文件中写了以下几行,命名为“helloworld.local.conf”。

server{
     listen 80 default_server;
     server_name hello_world;
     location / {
          root /var/www/helloworld;
          fastcgi_pass 127.0.0.1:9000;
     } 
}

/ var / www / helloworld中有一个index.html文件,显示文本“即将推出的网站”。

我的c ++代码如下所示:

#include <iostream>
#include "fcgio.h"

using namespace std;

int main(void) {
    cout<<"Content-type:text/html\r\n\r\n";
    cout<<"<html>\n";
    cout<<"<head>\n";
    cout<<"<title>Hello World- First CGI Program</title>\n";
    cout<<"</head>\n";
    cout<<"<body>\n";
    cout<<"<h2> hello world</h2>\n";
    cout<<"</body>\n";
    cout<<"</html>\n";
    return 0;
}

我使用以下命令生成c ++二进制代码文件

g++ abc.cpp -lfcgi++ -lfcgi -o hello_world

这需要部署在NGINX服务器上。我搜索并尝试了不同的方法在stackoverflow上运行此脚本但仍然遗漏了一些东西。

我还运行了以下命令将c ++二进制代码文件连接到服务器

cgi-fcgi -start -connect 127.0.0.1:9000 ./hello_world

现在,当我在浏览器中访问地址127.0.0.1:9000时,没有得到c ++代码中的“hello world”文本。

输出:我想从c ++二进制代码获取响应为“hello world”,并在html页面上显示。

我错过了什么,请帮忙。

更新:这是我的配置文件。

server{
    server_name hello;
    location / {
        fastcgi_index index.cgi;
        root /var/www/helloworld;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_name;
        include fastcgi_params;
    }
}
c++ nginx cgi fastcgi nginx-location
2个回答
0
投票

UPDATE

看看这个blog post。它解释了如何彻底地设置C ++ / FCGI / nginx。


原始答案

您的C ++代码应该是一个监听器(当它运行时,它应该监听一个端口并在传入请求时返回响应)。这部分与nginx没有任何关系。所以首先要确保你的代码正常工作;运行您的代码并尝试访问指定的端口,看看您是否得到了预期的响应。

然后你需要在你的nginx配置中设置一个proxy,它基本上将你想要的所有流量重定向到你的C ++端口(例如9000)。例如,你可以设置它,以便https://your_domain.com/api/*形式的任何url重定向到你的C ++。

这在nginx中非常简单:

location /api/ {
    proxy_pass  http://127.0.0.1:9000/;
}

但首先要单独测试你的C ++,并确保它正常工作

此外,您最好使用runitsystemd或类似工具来保持C ++侦听器运行(如果崩溃则重新启动它)。


0
投票

除非你通过一个表单调用你的CGI脚本(或者在这种情况下是可执行的),否则我认为只要将你的索引作为索引而不失一般性就会更简单。你现在拥有它,你没有看到任何东西的事实并不令人惊讶。请记住,CGI模块没有向第一个html文件追加任何内容。您必须在第一行声明内容类型,因为它是将显示的html文件。

我会将编译更改为:

g++ abc.cpp -lfcgi++ -lfcgi -o index.cgi

现在,在配置文件中,确保您具有以下内容。我通常使用Apache,但如果我没有弄错,你的文件夹配置应该是这样的,你应该好好去。

location / {
    root          /var/www/helloworld;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.cgi
    fastcgi_param SCRIPT_FILENAME $fastcgi_script_name
    include       fastcgi_params
}

从文档中,fastcgi_param参数通常如下所示:

fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name

因为我预先假定您的可执行文件将被称为index.cgi并且将在当前目录中,所以我从示例中省略了脚本文件夹,但请记住这个示例是非常人为的,并且实际上仅用于获得最小的CGI系统去。

© www.soinside.com 2019 - 2024. All rights reserved.