如何在 NGINX 服务器上 运行 c++ CGI 脚本
How to run c++ CGI script on NGINX server
我在 /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 文件显示文本 "site comming soon"。
我的 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服务器上。我在 Whosebug 上搜索并尝试了不同的方法 运行 这个脚本,但仍然遗漏了一些东西。
我还运行下面的命令将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;
}
}
更新
看看这个blog post。它非常详尽地解释了如何设置 C++/FCGI/nginx。
原始答案
您的 C++ 代码应该是一个侦听器(当它是 运行 时,它应该侦听一个端口并 return 响应传入的请求)。
这部分与 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 系统运行。
我在 /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 文件显示文本 "site comming soon"。
我的 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服务器上。我在 Whosebug 上搜索并尝试了不同的方法 运行 这个脚本,但仍然遗漏了一些东西。
我还运行下面的命令将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;
}
}
更新
看看这个blog post。它非常详尽地解释了如何设置 C++/FCGI/nginx。
原始答案
您的 C++ 代码应该是一个侦听器(当它是 运行 时,它应该侦听一个端口并 return 响应传入的请求)。 这部分与 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 系统运行。