lighttpd+fastcgi嵌入式web交叉编译到arm
文章目录
- 前提
- 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相关推荐
- arm嵌入式web服务器 性能,arm嵌入式web服务器
arm嵌入式web服务器 内容精选 换一换 在待分析的服务器上安装节点.Web服务器(即安装鲲鹏性能分析工具的服务器)默认安装了节点,如果待分析的服务器与安装工具的服务器是同一个,请跳过该章节.已成功 ...
- 嵌入式web服务器lighttpd的交叉编译及配置
一.前言 最近项目用到嵌入式web服务器lighttpd,在网上找了相关材料并不是很齐全,在这里整理总结一下: 二.编译环境 centos 7.0 lighttpd-1.4.39 pcre-8.42 ...
- 三种嵌入式web服务器(Boa / lighttpd / shttpd)的 linux移植笔记
一:移植Boa(web服务器)到嵌入式Linux系统 一.Boa程序的移植 1.下载Boa源码 下载地址: http://www.boa.org/ 目前最新发行版本: 0.94.13 ...
- goaheadlinux移植_goahead(嵌入式Web服务器)之交叉编译、移植篇
GoAhead简介: GoAhead是一个开源(商业许可).简单.轻巧.功能强大.可以在多个平台运行的嵌入式Web Server. GoAhead主要特性: 1 很小的内存消耗 2 支持认证功能Dig ...
- goahead(嵌入式Web服务器)之交叉编译、移植篇
GoAhead简介: GoAhead是一个开源(商业许可).简单.轻巧.功能强大.可以在多个平台运行的嵌入式Web Server. GoAhead主要特性: 1 很小的内存消耗 2 支持认证功能Dig ...
- arm linux goahead,goAhead 2.5嵌入式web服务器移植到arm9 2440 + linux中
本文内容概要:详细描述了移植goAhead 2.5到S3C2440的linux系统的过程.步骤.遇到的问题及其解决方法. 开发环境: 宿 主 机:window XP: 虚 拟 机: ...
- 嵌入式web服务器预研报告(转)
现在在嵌入式设备中所使用的web服务器主要有:boa.thttpd.mini_httpd.shttpd.lighttpd.goaheand.appweb和apache等. Boa 1.介绍 Boa诞生 ...
- 常见嵌入式Web服务器比较
在在嵌入式设备中所使用的web服务器主要有:boa.thttpd.mini_httpd.shttpd.lighttpd.goaheand.appweb和apache等. Boa 1.介绍 Boa诞生于 ...
- [转]嵌入式Web服务器
现在在嵌入式设备中所使用的web服务器主要有:boa.thttpd.mini_httpd.shttpd.lighttpd.goaheand.appweb和apache等. Boa 1.介绍 Boa诞生 ...
最新文章
- 线性代数-矩阵-【5】矩阵化简 C和C++实现
- java 风袖,仓库 - 高谷深陵 (gaogushenling) - Gitee.com
- Web 开发中很实用的10个效果【附源码下载】
- VCenter (虚拟架构环境的集中管理) 、数据库虚拟机迁移的影响
- 常见的原生javascript DOM操作
- 存储过程学习三(创建存储过程实例)
- Prometheus部署监控容器
- 第2年,倒数第3天,1.5万票,感动!
- 数据操作string
- 消费者服务消费延时分析
- 在xcode6.1和ios10.10.1环境下实现app发布
- c语言 数组 迷宫,迷宫问题(C语言实现)
- sublime JS Format js格式化工具
- 算术关系和逻辑关系---皮尔斯逻辑之二
- 申请计算机助理的英语作文,各位帮我找一篇英文申请信大学英语作文,申请助理..._口译笔译考试_帮考网...
- 误差平方和用python_用Python学分析 - 单因素方差分析
- 后台管理系统模板,简易模板
- u盘复制一直正在计算机,解决U盘复制文件时电脑总是重启的方法
- 求伯君:从未停止写程序的程序员
- Android TextView中的文字通过SpannableString,设置不同的颜色,字体,不同文字段的点击事件
热门文章
- 服务器包装检查项目,设备到货验收监理工作细则.doc
- ASM_ASMCMD用法
- 如何在vs中导入libjpeg_Qt简介以及如何配置Qt使用VS2010进行开发(转)
- python调用按键精灵插件_按键精灵——如何实现办公自由(四)
- VS2019编译器修改背景壁纸(写代码背景不再单薄,试试换一张清晰的美女照片)
- 如何有效渡过充满迷茫的大学生活
- 与计算机科学与技术相似的专业,【选专业】名称相似但实际千差万别的专业 谨防掉坑!...
- 【发表案例】物联网/智能/通信类SCI,仅28天录用
- 雅虎笔试题整理+自己写的答案
- 鉴源论坛 · 观模丨AUTOSAR调度表可调度性的形式化分析