文章目录

  • 前提
  • lighttpd交叉编译安装
    • 源码下载
    • 交叉编译
    • 简单测试
  • fastcgi编译配置
    • 源码下载
    • 交叉编译生成动态库
    • 修改lighttpd配置
    • 简单测试
      • c语言fcgi程序
      • c++ fcgi程序
  • gitee仓库链接
  • 参考

前提

环境我的是Ubuntu20.04.板子这里我用的是mx6ull,正点原子的alpha开发板,不过这是个纯软的东西,硬件平台不重要。然后交叉编译链我相信这些你都弄好了。
我初学这个,本文主要是我的个人记录,一些错误啥的难免,望各位大佬轻喷
网上找到的fastcgi基本是php相关的,发现用c/c++文章还挺少,所以写一篇记录下过程。

lighttpd交叉编译安装

源码下载

下载源码没啥好说的,直接官网走起。我这里下载的是lighttpd-1.4.55.tar.gz这个版本。
除了下载lighttpd的源码,还需要pcre这个东西(我也初学者,不知道原因,大概是依赖这个吧)。pcre同样官网下一个。顺带一提 pcre和pcre2是两个东西。我开始下的时候没注意,折腾了半天。这里我用的pcre-8.42.tar.bz2这个版本。

交叉编译

首先编译pcre这个东西,先解压:

tar -xjvf pcre-8.42.tar.bz2
cd pcre-8.42

然后配置一下,arm-linux-gnueabihf-gcc这个是我的交叉编译链,然后最后设置安装目录为当前文件夹下install文件夹。

./configure CC=arm-linux-gnueabihf-gcc --host=arm-linux-gnueabihf target=arm-linux --prefix=/ --enable-utf8 --enable-unicode-properties --prefix=$(pwd)/install

配置完成后编译然后安装,因为配置时候制定了安装目录,所以这里直接make install就好了。

make
make install

印象中我第一次编译时候中间有报错来着,但是现在重做没报错,可能该装的依赖上次都装好了(写文章不能拖着呀,不然有些细节都忘了)。
接下来就编译lighttpd,同样先解压

 tar -zxvf lighttpd-1.4.55.tar.gzcd lighttpd-1.4.55/

lighttpd的配置就有一些长了,这个地方第一次弄的时候卡了好久,CC,RANLIB这些你用其他lighttpd版本时候可能还需要CXX啥的,反正缺啥加啥,是在不想看就把这些都配。然后我遇到另个坑是一直找不到pcre,最后问了googl,要手动指明库路径。然后下面就是我试过的可用版本。

./configure -prefix=$(pwd)/install \
--host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc \
RANLIB=arm-linux-gnueabihf-ranlib STRIP=arm-linux-gnueabihf-strip\
--enable-shared --without-mysql --without-zlib --without-bzip2 \
--disable-ipv6 \
PCRECONFIG=/home/shi/linux/web/new/pcre-8.42/install/bin/pcre-config \
PCRE_LIB=/home/shi/linux/web/new/pcre-8.42/install/lib/libpcre.a \
CFLAGS="$CFLAGS -DHAVE_PCRE_H=1 -DHAVE_LIBPCRE=1 -I/home/shi/linux/web/new/pcre-8.42/install/include"

然后进行编译和安装

make
make install

一切顺利的话,在当前目录下生成了install文件,并且里面有如下文件。

然后在install目录下载新建一些文件夹。cache、cgi-bin、config、log、sockets、upload、vhosts、webpages。

mkdir cache cgi-bin config log sockets upload vhosts webpages

接下来把需要的配置文件拷贝过来,路径如下,全部拷贝到刚刚新建的config文件夹

doc/config/conf.d
doc/config/lighttpd.conf
doc/config/modules.conf

接下来简单修改一下配置。修改的思路是这样的,lighttpd的默认配置他的配置文件,日志,网页文件等都是按着linux标准方式来的,这里我把这一些文件都放在了一个目录下面,所以要修改一下配置,告诉程序这里对应文件分别放在哪。第二点就是在嵌入式上资源受限,减少一些资源开销。
我的lighttpd.conf配置文件修改部分如下,完成的文件有点大,直接丢码云了(直接上传csdn又要积分啥的,不友好),地址见文末

## 我最终移植到板子上的时候把install文件夹名字改成了lighttpd,文件夹放
## 在根目录"/"下,所以下面几个目录对应如下
var.log_root    = "/lighttpd/log"
var.server_root = "/lighttpd"
var.state_dir   = "/lighttpd"
var.home_dir    = "/lighttpd"
var.conf_dir    = "/lighttpd/config"
## 这里server_root和"/vhost",两个字符串加起来正好"/lighttpd/vhost",正
## 好对应刚刚新建的vhosts
var.vhosts_dir  = server_root + "/vhosts"
## 同vhosts
var.cache_dir   = server_root + "/cache"
## 禁用ipv6,我们编译的时候禁用ipv6了。可以翻回去看编译配置
server.use-ipv6 = "disable"
## 看翻译这里是用一个不同的身份启动运行服务器,我这里注释了,直接root干就好
## server.username  = "lighttpd"
## server.groupname = "lighttpd"
## 同vhosts,这个文件夹存放html文件
server.document-root = server_root + "/webpages"
## 同vhosts
server.pid-file = state_dir + "/lighttpd.pid"
## 访问日志调试时候先开着,最终部署时候看需求开关(据说生成的日志文件比
## 较大,如果部署开启这个考虑要定时删除)
include "conf.d/access_log.conf"
## 这里只是一个简单的服务器,用不着2048,我这里用256,
server.max-fds = 256
## 这个和max-fds 这个数值有关系,注意上面官方英语注释
server.max-connections = 128
## 上传文件夹路径
server.upload-dirs = ( "/lighttpd/upload" )

到现在为止,应该可以运行然后访问静态html文件了。
在webpages下面随便新建一个index.html文件,内容随便,名字先不随便,名字随便的话就要在地址栏指定名字了。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body><h1>我的第一个标题</h1><p>我的第一个段落。</p>
</body>
</html>

简单测试

接来下吧install整个文件夹复制到开发板的/目录下面,然后重命名为lighttpd。
然后启动lighttpd试试看先。

cd /lighttpd/sbin
./lighttpd -f ../config/lighttpd.conf -m ../lib

如果你板子的80端口没有被占用,现在服务器应该是起来了
在电脑浏览器输入板子ip访问试试.显示如下,到此已经成功了一半。

fastcgi编译配置

源码下载

fastcgi的源码在github上面,下载速度可能有点感人,gitee好像有个什么搬运计划还是啥 ,反正大概就是把github上面一些项目搬运过来提速下载,我懒得去看这个在不在计划之列,我把我用的这个版本一并放在gitee,需要的话自取。地址在文末。
我这里用的是fcgi2-2.4.2.tar.gz版本。

交叉编译生成动态库

先解压,

tar -xzvf fcgi2-2.4.2.tar.gz
cd fcgi2-2.4.2

然后配置,这个配置我没找到完整参考,我猜是这样的

./autogen.sh
./configure CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ --host=arm-linux-gnueabihf --prefix=$(pwd)/install

然后编译安装

make
make install

执行完成后再install文件夹会生成三个文件夹,分别是bin,include,lib,暂且放一边,等会再用他们。

修改lighttpd配置

接下来修改一下lighttpd的配置,开启lighttpd对factcgi的支持。
首先在modules.conf找到如下行,并把include前面的#删除。

##
## FastCGI (mod_fastcgi)
##
include "conf.d/fastcgi.conf"

上面这行配置意思很简单,就是包含conf.d文件夹下的fastcgi.conf配置文件,所以接下来修改fastcgi.conf这个文件
在这个文件中添加如下行:

fastcgi.debug = 1
fastcgi.server = ("/test" =>("test.fastcgi.handler" =>("socket" => socket_dir + "/test/test.fastcgi.socket","check-local" => "disable","bin-path" => home_dir + "/cgi-bin/test.fcgi","max-procs" => 3,))
)

把fastcgi编译生成的install文件夹拷贝到板子里,然后修改你的.bashrc文件PATH路径加入install/bin,LD_LIBRARY_PATH路径加入install/lib,或者直接把install/bin目录下文件复制到板子/bin,把install/lib目录下文件全部复制到板子/etc。

简单测试

c语言fcgi程序

这块没啥好说的 直接上代码

#include <fcgi_stdio.h>
int main (void) {while (FCGI_Accept() >= 0) {printf("Status: 200 OK\r\n\r\nHello World!\n");}return 0;
}

编译的时候就需要用到刚刚生成的那个install文件夹下东西了。注意这个不能直接复制,**{your path}**要换成你自己的路径

arm-linux-gnueabihf-gcc -o test.fcgi test.c -L{your path}/install/lib \
-lfcgi -I{your path}/install/include

把刚刚生成的test.fcgi复制到板子/lighttpd/cgi-bin目录下。然后重启服务器,在浏览器输入ip/test,可以看到返回了hello world。

c++ fcgi程序

老规矩,先上代码

#include <string>
#include <iostream>
#include <string.h>
#include <fcgi_stdio.h>
#include <fcgiapp.h>using namespace std;int main(int argc, char **argv)
{FCGX_Stream *in, *out, *err;FCGX_ParamArray evnp;while(FCGX_Accept(&in, &out, &err, &evnp) >= 0){string query;do{char *pRequestMoethod = FCGX_GetParam("REQUEST_METHOD", evnp);if(pRequestMoethod == NULL){cout << "ERROR: getevn REQUEST_METHOD is failed." << endl;break;}//判断请求方法if(strcmp(pRequestMoethod, "POST") == 0){//获取请求中URL携带的参数,POST也会在URL中携带参数query = FCGX_GetParam("QUERY_STRING", evnp);//获取POST请求携带的参数长度char *pLenstr = FCGX_GetParam("CONTENT_LENGTH", evnp);if(pLenstr != NULL){long len = atoi(pLenstr);string postData;//获取POST携带的数据for(int i = 0; i < (int)len; i++){int ch = FCGX_GetChar(in);if(ch < 0){break;}postData += (char)ch;}//处理请求,具体逻辑忽略// processRequest(query, postData); }else{cout << "getenv failed." << endl;}}else if(strcmp(pRequestMoethod, "GET") == 0){//获取请求中URL携带的参数query = FCGX_GetParam("QUERY_STRING", evnp);//处理GET请求,代码隐藏// processRequest(query); break;}else{cout << "This is unknown quest." << endl;}}while(false);string reply = "hello world";// reply = getReply(); //获取返回数据//向客户端返回用到数据FCGX_FPrintF(out, "Content-type: text/html;\r\n""Content-Length: %d\r\n""\r\n""%s",reply.length(), reply.c_str());}return 0;
}

编译类似,

arm-linux-gnueabihf-g++ -o test.fcgi test.cpp -L{your path}/install/lib \
-lfcgi -I{your path}/install/include

gitee仓库链接

https://gitee.com/sutichunxiao/lighttpd

参考

[1] https://blog.flowlore.com/passages/cc-fastcgi-http/
[2] https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModFastCGI
[3] https://www.huaweicloud.com/articles/2640eb7232b1794193263975ee0c65bc.html

lighttpd+fastcgi嵌入式web交叉编译到arm相关推荐

  1. arm嵌入式web服务器 性能,arm嵌入式web服务器

    arm嵌入式web服务器 内容精选 换一换 在待分析的服务器上安装节点.Web服务器(即安装鲲鹏性能分析工具的服务器)默认安装了节点,如果待分析的服务器与安装工具的服务器是同一个,请跳过该章节.已成功 ...

  2. 嵌入式web服务器lighttpd的交叉编译及配置

    一.前言 最近项目用到嵌入式web服务器lighttpd,在网上找了相关材料并不是很齐全,在这里整理总结一下: 二.编译环境 centos 7.0 lighttpd-1.4.39 pcre-8.42 ...

  3. 三种嵌入式web服务器(Boa / lighttpd / shttpd)的 linux移植笔记

    一:移植Boa(web服务器)到嵌入式Linux系统 一.Boa程序的移植 1.下载Boa源码     下载地址: http://www.boa.org/     目前最新发行版本: 0.94.13  ...

  4. goaheadlinux移植_goahead(嵌入式Web服务器)之交叉编译、移植篇

    GoAhead简介: GoAhead是一个开源(商业许可).简单.轻巧.功能强大.可以在多个平台运行的嵌入式Web Server. GoAhead主要特性: 1 很小的内存消耗 2 支持认证功能Dig ...

  5. goahead(嵌入式Web服务器)之交叉编译、移植篇

    GoAhead简介: GoAhead是一个开源(商业许可).简单.轻巧.功能强大.可以在多个平台运行的嵌入式Web Server. GoAhead主要特性: 1 很小的内存消耗 2 支持认证功能Dig ...

  6. arm linux goahead,goAhead 2.5嵌入式web服务器移植到arm9 2440 + linux中

    本文内容概要:详细描述了移植goAhead 2.5到S3C2440的linux系统的过程.步骤.遇到的问题及其解决方法. 开发环境: 宿    主   机:window XP: 虚    拟   机: ...

  7. 嵌入式web服务器预研报告(转)

    现在在嵌入式设备中所使用的web服务器主要有:boa.thttpd.mini_httpd.shttpd.lighttpd.goaheand.appweb和apache等. Boa 1.介绍 Boa诞生 ...

  8. 常见嵌入式Web服务器比较

    在在嵌入式设备中所使用的web服务器主要有:boa.thttpd.mini_httpd.shttpd.lighttpd.goaheand.appweb和apache等. Boa 1.介绍 Boa诞生于 ...

  9. [转]嵌入式Web服务器

    现在在嵌入式设备中所使用的web服务器主要有:boa.thttpd.mini_httpd.shttpd.lighttpd.goaheand.appweb和apache等. Boa 1.介绍 Boa诞生 ...

最新文章

  1. 线性代数-矩阵-【5】矩阵化简 C和C++实现
  2. java 风袖,仓库 - 高谷深陵 (gaogushenling) - Gitee.com
  3. Web 开发中很实用的10个效果【附源码下载】
  4. VCenter (虚拟架构环境的集中管理) 、数据库虚拟机迁移的影响
  5. 常见的原生javascript DOM操作
  6. 存储过程学习三(创建存储过程实例)
  7. Prometheus部署监控容器
  8. 第2年,倒数第3天,1.5万票,感动!
  9. 数据操作string
  10. 消费者服务消费延时分析
  11. 在xcode6.1和ios10.10.1环境下实现app发布
  12. c语言 数组 迷宫,迷宫问题(C语言实现)
  13. sublime JS Format js格式化工具
  14. 算术关系和逻辑关系---皮尔斯逻辑之二
  15. 申请计算机助理的英语作文,各位帮我找一篇英文申请信大学英语作文,申请助理..._口译笔译考试_帮考网...
  16. 误差平方和用python_用Python学分析 - 单因素方差分析
  17. 后台管理系统模板,简易模板
  18. u盘复制一直正在计算机,解决U盘复制文件时电脑总是重启的方法
  19. 求伯君:从未停止写程序的程序员
  20. Android TextView中的文字通过SpannableString,设置不同的颜色,字体,不同文字段的点击事件

热门文章

  1. 服务器包装检查项目,设备到货验收监理工作细则.doc
  2. ASM_ASMCMD用法
  3. 如何在vs中导入libjpeg_Qt简介以及如何配置Qt使用VS2010进行开发(转)
  4. python调用按键精灵插件_按键精灵——如何实现办公自由(四)
  5. VS2019编译器修改背景壁纸(写代码背景不再单薄,试试换一张清晰的美女照片)
  6. 如何有效渡过充满迷茫的大学生活
  7. 与计算机科学与技术相似的专业,【选专业】名称相似但实际千差万别的专业 谨防掉坑!...
  8. 【发表案例】物联网/智能/通信类SCI,仅28天录用
  9. 雅虎笔试题整理+自己写的答案
  10. 鉴源论坛 · 观模丨AUTOSAR调度表可调度性的形式化分析