我在/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;
}
}
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 ++,并确保它正常工作
此外,您最好使用runit
,systemd
或类似工具来保持C ++侦听器运行(如果崩溃则重新启动它)。
除非你通过一个表单调用你的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系统去。