lighttpd+fastcgi嵌入式web交叉编译到arm

2023-10-26

前提

环境我的是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.gz
 cd 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lighttpd+fastcgi嵌入式web交叉编译到arm 的相关文章

  • GCC ARM 汇编预处理器宏

    我正在尝试使用汇编 ARM 宏进行定点乘法 define MULT a b asm volatile SMULL r2 r3 0 1 n t ADD r2 r2 0x8000 n t ADC r3 r3 0 n t MOV 0 r2 ASR
  • 在嵌入式设备上使用new或malloc引起的段错误[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • Python 3 中的 FastCGI WSGI 库?

    对于 Python 3 是否存在可以将 WSGI 应用程序用作 FastCGI 服务器的库 这样 nginx 就可以将请求代理给它了 Python 3 文档 https docs python org 3 howto webservers
  • ARM 调用约定是否允许函数不将 LR 存储到堆栈中?

    正如标题所示 我在理解 ARM 架构的调用约定时遇到问题 特别是 我仍然很难知道当你调用子程序时 LR 寄存器会发生什么 我认为 当您进入子程序时 处理 LR 寄存器的最明显 最安全的方法是将其存储到堆栈中 但该行为没有出现在文档中 因此我
  • 使用 Android NDK 使用 -fsigned-char 进行构建安全吗?

    为了与其他平台保持一致 我需要使用signed char在我正在处理的一些本机代码中 但默认情况下在Android NDK上char类型是unsigned 我尝试明确使用signed char类型 但它生成太多警告differ in sig
  • 在 Intel 机器上构建 Apple Silicon 二进制文件

    如何在 macOS 11 Intel 上编译 C 项目以在 Silicon 上运行 我当前的构建脚本很简单 configure make sudo make install 我尝试过使用 host and target标志与aarch64
  • 如何在 phpfarm php 安装上安装 pthreads

    记录我为帮助他人所做的努力 并希望得到一些关于我如何做得更好的反馈 命令pecl install pthreads由于我的 php 安装失败ubuntu 13 04盒子没有配置 zts Options 1 ubuntu存储库没有启用zts的
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • 使用 NEON 优化 Cortex-A8 颜色转换

    我目前正在执行颜色转换例程 以便从 YUY2 转换为 NV12 我有一个相当快的函数 但没有我预期的那么快 主要是由于缓存未命中 void convert hd uint8 t orig uint8 t result uint32 t wi
  • 如何找出当前正在运行的 PHP 可执行文件?

    在 PHP 程序内部 我想知道执行它的二进制文件的位置 Perl 有 X以此目的 PHP 中有等效的吗 这样它就可以使用自身执行子 PHP 进程 而不是硬编码路径或假设 php 是正确的 UPDATE 我使用的是lighttpd FastC
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • ARM Chromebook 上的 Android 开发环境?

    我尝试了多次安装和使用安卓工作室 https developer android com studio index html on an ARM Chromebook C100P https archlinuxarm org platfor
  • Lighttpd 和 cgi python

    我正在尝试通过 lighttpd 执行一些 python 脚本 但是当我尝试运行它时 我只得到一个要求我下载的空白文件 lighttpd conf server modules mod access mod alias mod access
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • 设备树不匹配:.probe 从未被调用

    我无法理解设备树的工作原理 或者具体来说为什么该驱动程序无法初始化 这是在 android 版本 3 10 的 rockchip 供应商内核中 驱动程序 看门狗 rk29 wdt c 为了可读性而减少 static const struct
  • 如何 ping FastCGI 服务器?

    除了建立 TCP 连接之外 如何检查 FastCGI 服务器是否处于活动状态并正常运行 我有许多远程 独立的 FastCGI 服务器 我想监视 FastCGI 服务器本身以确保其活动 仅仅向 Web 服务器发出请求是不够的 因为它会自动绕过
  • 为什么前向引用 ADR 指令在 Thumb 代码中以偶数偏移进行汇编?

    To bx对于 Thumb 函数 需要设置地址的最低有效位 GNU 作为文档states https sourceware org binutils docs as ARM Opcodes html当地址是从一个生成时这是如何工作的adr伪
  • ARM 汇编:从 STDIN 获取字符串

    我目前正在学习 CS 课程 我们刚刚开始在 Raspberry Pi 上使用 ARM Assembly 事实证明这相当困难 想知道是否有人可以提供帮助 我当前的任务是从 stdin 获取一个字符串 使用 scanf 并计算其中的字符数 然后
  • LDR指令如何将常量加载到寄存器中?

    我刚刚读了一本ARM指令书 看到一条指令我无法解释 It says LDR将 32 位常量加载到r0登记 LDR r0 pc const number 8 pc const number DCD 0xff00ffff 我不明白什么 pc c
  • 当我尝试在 Armv8 程序集中分配数组时,执行冻结

    所以我正在用汇编语言进行编程 这只是一个简单的代码 这样我就可以学习如何分配数组 以便稍后在 NEON 编程中使用它们 ASM FUNC FPE data balign 8 array skip 80 array1 word 10 20 3

随机推荐

  • DPDK Rx flexible descriptor 在Intel E810 网卡中的使用

    什么是Rx flexible descriptor Intel E810系列网卡支持Rx flexible descriptor 这是一种可以通过软件定义格式并配置到网卡硬件中的Rx descriptor 接收描述符 Flexible de
  • 数据提取之lxml

    1 lxml的认识 在前面学习了xpath的语法 那么在代码中我们如何使用xpath呢 对应的我们需要lxml 安装方式 pip install lxml 2 lxml的使用 2 1 lxml模块的入门使用 1 导入lxml 的 etree
  • 4.HLSL Effect(效果框架)

    4 HLSL Effect 效果框架 进行到这里 读者可能会觉得使用着色器多少有些繁琐 Effect 效果框架 被提出以解决这些问题 作为一种方法 Effect简化了使用着色器的操作 作为一个框架 Effect把顶点着色器和像素着色器有机地
  • 11.网络爬虫—多线程详讲与实战

    11 网络爬虫 多线程详讲与实战 程序 进程 线程 线程常用方法 多线程的优点 join 案例 共享全局变量资源竞争 互斥锁 死锁 互斥锁 死锁 多线程实战 某果多线程实战 前言 个人简介 以山河作礼 Python领域新星创作者 CSDN实
  • mysql查询前5条记录_各个数据库中,查询前n条记录的方法

    SQL查询前10条的方法为 1 select top X from table name 查询前X条记录 可以改成需要的数字 比如前10条 2 select top X from table name order by colum name
  • 【Python技巧】(虚拟环境报错、pycharm)无法加载文件 ...\venv\Scripts\activate.ps1,因为在此系统上禁止运行脚本。

    一 问题出现 使用Pycharm设置虚拟环境后 打开终端出现如下报错 无法加载文件 venv Scripts activate ps1 因为在此系统上禁止运行脚本 二 解决方式 已管理员的身份打开powershell终端 然后查询get e
  • c++ main函数调用 类中的枚举_利用Doxygen给C程序生成注释文档

    利用Doxygen为C程序生成注释文档 一 Doxygen工具的安装 利用Doxygen工具生成API帮助文档需要下载安装以下三个软件 1 Doxygen 可以从一套归档源文件开始 生成HTML格式的在线类浏览器 或离线的 LATEX RT
  • 图像去雾算法学习

    现有的图像采集设备对外界环境的干扰非常敏感 在雾霾环境中 获取的户外图像往往退化严重 主要表现为场景特征信息模糊 对比度低 色彩失真 不利于计算机视觉系统对图像真实特征的提取 从而影响其后续的分析 理解 识别等一系列处理 很大程度上降低了视
  • vue3.0安装sass(scss)以及报错解决

    本篇文章主要记录了笔者安装sass的过程 1 安装ruby 首先在官网中下载 https rubyinstaller org downloads 下载之后进行安装 在安装过程中 要记得勾选添加环境变量的选项 其他的就是一直next就可以了
  • jq的核心函数

    jquery的核心函数 1 代表接受一个函数 也就是我们平常用的入口函数 2 接受一个字符串 2 1 接受一个字符串选择器 2 2 接受一个代码片段 3 接受一个dom对象 会被包装成jquery对象返回给我们
  • apk内部存储路径

    首先内部存储路径为 data data youPackageName 下面讲解的各路径都是基于你自己的应用的内部存储路径下 所有内部存储中保存的文件在用户卸载应用的时候会被删除 一 files Context getFilesDir 该方法
  • 数据结构之链栈

    栈介绍 首先 它是一个线性表 准确的说 应该是一个插入 删除受限制的线性表 它仅仅在表尾进行插入和删除操作的线性表 我们把这种受限制的线性表称为栈 如果栈的元素在使用时出现了元素变化不可预测的情况 有时很大 有时又很小 这种情况下 则建议使
  • linux查看jvm内存

    查看内存大小 free h free命令相关知识 判断Java程序对内存的消耗 top top命令相关知识 查看tomcat信息 ps ef grep tomcat 4 1分析内存实例 pid 21069 使用jmap来查看jvm的堆的快照
  • MySQL数据库基本操作

    一 数据库的操作 CURD 重点 1 创建数据库的语法 基本语法 create database 数据库名称 2 查看数据库 show databases 查看所有数据库 use 数据库名称 使用数据库 show create databa
  • Node.js 应用的御用品: Node.js 错误处理系统

    开发中 有些开发者会积极寻求处理错误 力求减少开发时间 但也有些人完全忽略了错误的存在 正确处理错误不仅意味着能够轻松发现和纠正错误 而且还意味着能够为大型应用程序开发出稳健的代码库 特别是对于 Node js 开发人员 他们有时会也发现自
  • 上班一个月,我的几点体会

    这篇博文其实在去年就已经在CSDN发过的 后来 某次误操作不小心删除了 今天找出来重新发一下 我是从3月1号开始上班的 今天3月31号 刚好一个月结束 在这一个月里 我收获不少 感受颇深 现谈谈自己的几点感受 与大家分享 1 由于在学校里做
  • JDBC与MySQL数据库的连接

    一 Jdbc连接池 概念 一个容器 存放数据库连接的容器 好处 节约资源 用户访问高效 规范 1 用连接池管理连接 可以重复利用 2 不是 自己创建连接 而是通过连接池获取连接 3 使用完之后调用连接的close 方法归还连接 不是关闭连接
  • Unity中可用Lua版本效率分析比较

    欢迎来到你的代码我的鱼 oooofish com 本篇文章主要介绍Unity中可用的lua版本对比及分析 目前常见的unity lua库有以下 luainterface ulua nlua unilua 简单介绍 luainterface
  • js一个简单的ajax示例,原生JS简单实现ajax的方法示例

    本文实例讲述了原生JS简单实现ajax的方法 分享给大家供大家参考 具体如下 HTML部分 这里有个input按钮 点击会触发click事件 click事件调用Ajax 方法 JS部分 通过这个函数来异步获取信息 function Ajax
  • lighttpd+fastcgi嵌入式web交叉编译到arm

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