用c++写一个 “hello,world” 的 FastCGI程序
原文:http://chriswu.me/blog/writing-hello-world-in-fcgi-with-c-plus-plus/
上面的连接地址给出的是作者的原文地址。
另外一个作者稍微整理了一下,github 地址:https://github.com/homer6/fastcgi
下面给出我测试的截图:
这个用 C++ 写的cgi 程序哦, c++ 也可以写网站了,是不是很兴奋!!!
stackoverflow 的问题:http://stackoverflow.com/questions/2149709/c-language-fastcgi-with-nginx
俗话说:“好记性不如烂笔头”, 所以这里记录下原文地址,和稍微写一写自己的心得和一路的过程。
google 到这篇用 c++ (c)语言写的 fastCGi 程序,并能成功运行,中间实属不易。。
做 web (网站) 开发也有两三年了, 用 php 语言写的。 web server 用过 apache , nginx . 对于apache ,它会启动一个 php 的模块,来处理php脚本。 对于nginx,
则 fast-pass: 127.0.0.1:9000 , webserver (nginx)将 请求 ----cgi 协议--- 转发到 facscgi (php-fpm) 处理(当然 会传递 标准输入和一个 环境变量过去),php 解释器执行完
php 脚本后, 将标准输出 给webserver , webserver 然后将输出 通过 http response 传给 browser (client), 一个 http 的请求和响应就结束了。
cgi 程序可以用php, java, C#写,当然可以用 C, C++ 来写。
我一直也在研究一个 fastCGI 这个处理过程到底是怎么样的。 webserver 和 fastCGI 之间的交互过程是怎么样的。所以自己想写一个 C++ 的fastCGI 脚本来完成一个http 请求,于是我也找了很多资料,所以就有了这篇文章的产生。
关于 CGI 应用程序和 web server 之间的交互的过程,这里有几张图片,图片来源:(原作者:吴秦Tyler) //images0.cnblogs.com/blog/92071/201412/191104473136735.png
prerequistites:
need some familiarity with C++;
Why fastCGI?
FCGI (FastCGI) is a protocol in which web applications can talk to a web server to serve web requests.
Installation:
We will need to install the libfcgi++ library, a web server (nignx in our case) and spawn-fcgi to run the fcgi app. We’ll also install curl to help test later on.
1 2 3 4 | sudo apt-get install libfcgi-dev sudo apt-get install spawn-fcgi sudo apt-get install nginx sudo apt-get install curl |
The code:
a c++ source file(echo.cpp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include <iostream> #include "fcgio.h" using namespace std; int main( void ) { // Backup the stdio streambufs streambuf * cin_streambuf = cin.rdbuf(); streambuf * cout_streambuf = cout.rdbuf(); streambuf * cerr_streambuf = cerr.rdbuf(); FCGX_Request request; FCGX_Init(); FCGX_InitRequest(&request, 0, 0); while (FCGX_Accept_r(&request) == 0) { fcgi_streambuf cin_fcgi_streambuf(request.in); fcgi_streambuf cout_fcgi_streambuf(request.out); fcgi_streambuf cerr_fcgi_streambuf(request.err); cin.rdbuf(&cin_fcgi_streambuf); cout.rdbuf(&cout_fcgi_streambuf); cerr.rdbuf(&cerr_fcgi_streambuf); cout << "Content-type: text/html\r\n" << "\r\n" << "<html>\n" << " <head>\n" << " <title>Hello, World!</title>\n" << " </head>\n" << " <body>\n" << " <h1>Hello, World!</h1>\n" << " </body>\n" << "</html>\n" ; // Note: the fcgi_streambuf destructor will auto flush } // restore stdio streambufs cin.rdbuf(cin_streambuf); cout.rdbuf(cout_streambuf); cerr.rdbuf(cerr_streambuf); return 0; } |
Nginx config:
Next up we’ll setup nginx to listen on port 80 for http requests and forward those along the the fcgi process which will listen on port 8000.
The key directive is fastcgi_pass 127.0.0.1:8000
indicates that nginx should forward the fcgi request to port 8000 at localhost. You can replace the address with an upstream directive if you want to want to load balance across many processes. The rest of the fastcgi_param
directives are optional and just set appropriate environment variables which get forwarded to the fcgi application.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | events { worker_connections 1024; } http { server { listen 80; server_name localhost; location / { fastcgi_pass 127.0.0.1:8000; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; } } } |
Running the code:
The system now comprises of three parts. One will be the executable fcgi c++ app. In order to run this we need spawn-fcgi and to listen to a port. Nginx will then forward web requests to this port, translating the http proctocol into the fast cgi protocol.
1 2 3 4 5 6 7 8 9 | # run nginx using the provided configuration # 下面这一行其实我没用到。 sudo nginx -c <path to nginx.conf> # compile hello_world g++ main_v1.cpp -lfcgi++ -lfcgi -o hello_world # spawn the fcgi app on port 8000 with no fork spawn-fcgi -p 8000 -n hello_world |
Then just head to the browser and enter http://localhost/ into the location bar and voilà! Hello, World! See the next part in this tutorial to see how to incorporate the request uri and the request content into this simple app
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现