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程序

前端页面

写一个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 中的端口一致

如果启动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程序缺少环境参数信息解析报文失败,进程程序崩溃
s

posted @   香蕉储蓄所  阅读(222)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示