nginx+fastcgi+spawn-fcgi写一个简单的后端echo程序
工作原理
nginx作为反向代理服务器可以接收http请求并转发到后端处理程序进行业务处理,nginx首先把报文转发给spawn-fcgi,然后由spawn-fcgi解析报文并启动一个fastcgi进程处理报文(fastcgi也可以使用多线程处理报文,需要接收请求后自己创建线程或者使用线程池),fastcgi通过环境变量获取http header等信息,处理业务流程后通过printf(stdout被重定向了)输出给nginx,然后返回给浏览器
安装spawn-fcgi、fastcgi
spawn-fcgi下载:http://redmine.lighttpd.net/projects/spawn-fcgi/wiki
安装
./configure
make
make install
ldconfig
打包spawn到别的环境使用可以用以下代码,会把bin和share需要的东西放到指定路径,然后把文件夹拷贝到别的环境用即可
DESTDIR=/tmp/spawn-fcgi-package make install
fastcgi下载:https://github.com/FastCGI-Archives/fcgi2
./autogen.sh
./configure
make
make install
写一个fastcgi程序
- 遇到了链接问题
error adding symbols: DSO missing from command line
原因:工程中有个 静态库 libxxx.a (xxx为你的库名称),这个静态库中没有找到对应的函数实现。但是在 /usr/lib64之类的路径中找到的libxxx.so.**中找到了函数实现。
解决方法: 删除掉静态库。
参考链接:
gcc - libpthread.so.0: error adding symbols: DSO missing from command line - Stack Overflow
前端页面
写一个html静态页面,加一个js请求脚本,放到nginx静态文件路径下
(可以不写前端,直接访问后端程序对应的url即可)
nginx配置
配置nginx的fastcgi接口路由,刷新配置
在server块中配置路由,注意必须要把include fastcgi.conf
这句加进去,否则会在fastcgi程序导致FCGI_Accept()中某句strlen()段错误而崩溃
location /Myupload #/Myupload这里需要和客户端提交的处理指令一致
{
fastcgi_pass 127.0.0.1:10000; #指定转发的服务器IP以及端口
include fastcgi.conf #表示添加的启动配置文件
}
启动spawn-fcgi
前提条件: 程序猿的fastCGI程序已经编写完毕 -> 可执行文件 login
- spawn-fcgi -a IP地址 -p 端口 -f ./fastcgi可执行程序login
- IP地址: 应该和nginx的 fastcgi_pass 配置项对应
- nginx: localhost -> IP: 127.0.0.1
- nginx: 127.0.0.1 -> IP: 127.0.0.1
- nginx: 192.168.109.101 -> IP: 192.168.109.101
- 端口:应该和nginx的 fastcgi_pass 中的端口一致
- IP地址: 应该和nginx的 fastcgi_pass 配置项对应
如果启动fcgi程序遇到127报错,一般是因为libfcgi库没有拷贝到程序可读路径下,写以下脚本可将库拷贝到/usr/lib和/usr/lib64
#!/bin/bash
# fcgi和fcgi++都需要建立软连接, 正常情况下只要在/usr/lib目录下建立链接就可以了,如果不行的话在/usr/lib64目录下也建立链接
ln -s -f /usr/local/lib/libfcgi.so.0 /usr/lib/libfcgi.so.0
ln -s -f /usr/local/lib/libfcgi.so.0 /usr/lib64/libfcgi.so.0
ln -s -f /usr/local/lib/libfcgi++.so.0 /usr/lib/libfcgi++.so.0
ln -s -f /usr/local/lib/libfcgi++.so.0 /usr/lib64/libfcgi++.so.0
测试
在浏览器访问网址,观察输出效果
http://localhost:8081/fastcgi
,本地请求后出现了错误页,经排查是因为nginx配置location块时没有添加include fastcgi.conf
,导致fastcgi程序缺少环境参数信息解析报文失败,进程程序崩溃
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)