关于嵌入式web服务器的移植

目标:静态编译
版本:apache-1.3.39 + php-5.5.5
PC环境:ubuntu16
交叉编译工具链:arm-linux-gcc
首先可以参考:https://www.cnblogs.com/eoiioe/archive/2008/12/23/1360476.html,按照这样的思路进行。

一 . 编译apache

首先参考:
http://blog.sina.com.cn/s/blog_7f0a98c40100rxdz.html
https://www.veryarm.com/42263.html
http://www.linuxdown.net/command/2017/1219/16733.html
编译apache,需要分别用到本机编译和交叉编译,这里解压apache-1.3.39.tar.gz到两个文件夹,这两个文件夹分别为arm和pc。

解压目录

1.本机编译。
进入到 pc/src目录下执行 ./Configure 命令,生成Makefile文件。
返回到 pc目录下,执行 ./configure命令,然后 make,这里不需要make install.
因为在交叉编译的时候,只需要用到主机编译的在 pc/src/main 目录下生成的两个可执行文件,分别为gen_test_char 和 gen_uri_delims。
2.交叉编译
配置自己的交叉编译工具链环境,在添加到/etc/profile后source一下,终端测试arm-linux-gcc -v,返回该交叉编译链的具体信息,再export CC=arm-linux-gcc即可(该shell命令可直接写在/etc/profile中,不用在终端输出了),然后步骤依然同上:
进入到 arm/src目录下执行 ./Configure 命令,生成Makefile文件。
返回到 arm目录下,执行 ./configure命令, 其配置选项如下:

#!/bin/sh
./configure \
--prefix=/mnt/nand1-2/apache \
--enable-module=most \
--enable-module=rewrite

这里可参考
https://blog.csdn.net/yinzhipeng123/article/details/53044998
https://my.oschina.net/xiangpang/blog/535565?p={{currentPage+1}}
这里可能会报错,有

TIM截图20190830194333.png

或者

/home/f/下载/Apache/arm/src/helpers/testfunc: 1: Syntax error: word unexpected (expecting ")")
/home/f/下载/Apache/arm/src/helpers/testfunc: 1: Syntax error: word unexpected (expecting ")")
/home/f/下载/Apache/arm/src/helpers/testfunc: 1: Syntax error: word unexpected (expecting ")")
/home/f/下载/Apache/arm/src/helpers/testfunc: 1: Syntax error: word unexpected (expecting ")")
/home/f/下载/Apache/arm/src/helpers/testfunc: 1: Syntax error: word unexpected (expecting ")")

这里将 pc/src/main/下的上面所说的两个可执行文件复制(也说覆盖)到arm/src/main/下,然后再进行make即可,若再次出现同样的错误,可再次进行同样的复制操作,再make。(注,make规则中如果依赖文件中任一个 文件的时间戳比目标文件新,则使用规则所定义的命令重建目标文件。)
在make过程中,可能有


TIM截图20190830200515.png

这里找到对应文件,注释掉相应选项再次make即可。


TIM截图20190830200742.png

TIM截图20190830200800.png

无需make install,进行第二步。

二 .交叉编译php

  1. 为实现静态编译,这里需要提前安装php所需要的静态库,这里我安装了5种静态库文件,分别使用了libxml2-2.9.2, openssl-1.0.2q, zlib-1.2.8, libiconv-1.14, pcre-7.8, 安装的路径可自定义,但尽量安装到一个主文件路径下,如默认的 /usr/local/ 。另外,由于php5以上版本默认支持sqlite选项,因此这里就不在配置了。
    关于./configure配置选项我写在go.sh文件里面了,该文件内容如下,执行时给文件 chmod+x 即可。
#! /bin/sh
./configure  \
--host=arm-linux \
--prefix=/mnt/nand1-2/php \
--enable-shared=no  \
--disable-shared \
--with-apache=/home/f/下载/Apache/arm  \
--enable-static=yes \
--enable-sockets  \
--disable-all \
--enable-pdo \
--enable-json \
--disable-ipv6 \
--enable-sqlite-utf8 \
--with-libxml-dir=/usr/local/libxml2 \
--with-openssl-dir=/usr/local/openssl/include/openssl \
--with-zlib-dir=//home/f/downloads/NewPHP/zlib \
--with-iconv-dir=/home/f/downloads/NewPHP/libiconv \
--with-pcre-dir=/home/f/downloads/NewPHP/pcre
#--with-sqlite3=/usr/local/sqlite3\lib\libsqlite3.a \
#--with-pdo-sqlite \
#--enable-sqlite3 \
  1. 这里必须配置--with-apache,生成apache 所load的静态库文件,后面跟的路径就是上面apache解压编译所在的路径(arm文件夹路径)。
  2. 上述配置只是编译静态库文件 .a ,我们还需要生成静态可执行文件 statically linked
    参考:http://ju.outofmemory.cn/entry/119804
    这里在makefile中,更改:
-o 前面加上-all-static
  1. make,该过程可能会出现下面错误


    TIM截图20190830181533.png

    这里只需要定位到文件,然后将这个预编译选项注释掉即可。make成功后,可以看到在文件夹下,php解压编译文件夹下libs文生成了libphp5.a文件和libphp5.la文件,而且在对应的apache解压编译文件夹arm下的src/modules/php5页生成了相应的文件,我们第三步的activate路径就是从这取。

  2. make install ,可以看到安装目录/mnt/nand1-2/php下面有bin文件夹有php、php-cgi文件,有


    TIM截图20190830191713.png

    成功编译静态库和静态可执行文件。当然这两个静态可执行文件内存有点大,用arm-linux-strip一下即可。
    6.复制编译目录下的php.oni-development到安装目录/mnt/nand1-2/php/lib下,并改名php.ini。

三 .再次编译apache,跟第一步动作类似。

但是:

  1. 当再次在arm文件夹下进行./configure配置,有
#!/bin/sh
./configure \
--prefix=/mnt/nand1-2/apache \
--activate-module=src/modules/php5/libmodphp5.a 
--enable-module=most \
--enable-module=rewrite

2.上面一步是添加php配置选项,以及表示静态编译的方式,链接现有的静态库文件,以后不加载任何动态模块,而这一步需要进行生成apache静态可执行文件的设置。
在arm/src文件夹下的Makefile中,下面图中在 -o 符号之前添加 -static 选项


TIM截图20190830201924.png

在arm/src/support文件夹下的Makefile中,下面图中在 -o 符号之前添加 -static 选项


TIM截图20190830201635.png

3.如果跟第一步报同样的错,按第一步的规则处理,在arm文件夹下执行make,然后make install安装。

四 .此时在/mnt/nand1-2/文件夹下已经有两个最终安装后的apache和php文件夹。在将两者复制到开发板同样的位置,并使用,还得配置http.conf文件。

# 首先是基本的配置
Listen 0.0.0.0:80
Port 80
User nobody
Group nogroup
ServerName localhost

#然后
#205行
# Note: The order in which modules are loaded is important.  Don't change
# the order below without expert advice.
# Example:
# LoadModule foo_module libexec/mod_foo.so
####这里不需要动态加载php动态库文件,因为我们需要静态编译
####即无需LoadModule     php5_module    modules/libphp5.so
# ExtendedStatus controls whether Apache will generate "full" status

#364行
<IfModule mod_dir.c>
    DirectoryIndex  index.html
    DirectoryIndex  index.php
    DirectoryIndex  index.php3
    DirectoryIndex  index.phtml
</IfModule>


#763行
#
    AddType application/x-tar .tgz

    AddType application/x-httpd-php .php
    AddType application/x-httpd-php .php3
    AddType application/x-httpd-php .php5
    AddType application/x-httpd-php .phtml
    #
    # AddEncoding allows you to have certain browsers uncompress
    # information on the fly. Note: Not all browsers support this.
    # Despite the name similarity, the following Add* directives have nothing
    # to do with the FancyIndexing customization directives above.
    #
    AddEncoding x-compress .Z
    AddEncoding x-gzip .gz .tgz
    Action application/x-httpd-php "/php5/php-cgi"

由于apache拒绝使用root用户运行,所以需要增加一个用户和用户组,这里使用默认的用户名和用户组名,nobody和nogroup。

建立文件passwd代替开发板上的/etc/passwd

root::0:0:root:/:/bin/sh
nobody::65534:65533:nobody:/:/bin/sh

建立文件group代替开发板上的/etc/group

nobody::65533:
nogroup::65534:nobody
root:x:0:root
users::100:

五. 启动开发板,在终端有

mnt/nand1-2/apache/bin/apachectl start

则开发板上的apache服务已启动,下面即可以在主机通过ip访问嵌入式web了。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容