交叉编译Nginx

Nginx是个高性能的http和反向代理服务器,应用非常广泛,使用C语言编写,故可以将其交叉编译,然后放到arm平台上使用,这样Nginx就可以在嵌入式linux里大放光彩。下面就讲述如何交叉编译Nginx。


一 准备

交叉编译平台:ubuntu16.04 64位
目标平台:arm 32位 (对于64位操作方法也是类似)

下载以下文件用于交叉编译:

  • gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi.tar.xz
  • nginx-1.16.1.tar.gz
  • openssl-1.1.1d.tar.gz
  • pcre-8.43.zip
  • zlib-1.2.11.tar.gz

对于交叉编译器,去linaro网站上去下载,版本不一定要求4.9.4,不要太旧就可以(尽量和交叉编译linux内核镜像的编译器一致)。如果目标板是64位,就选aarch64-linux-gnu去下载。
在这里插入图片描述
PS:上述文件也可以点击这里下载,本人下载好后已经上传 ?。

以上文件下载好后传到虚拟机里,然后分别解压,
在这里插入图片描述


二 设置交叉编译器

把交叉编译器解压到一个不需要root权限的地方,这样以后操作会方便很多,可以像上面那样,和nginx它们放在同一个地方。尽量保证不使用root权限去编译。

使用以下命令去修改/etc/bash.bashrc,
sudo vim /etc/bash.bashrc
打开后在最后一行添加以下内容,

export PATH=/home/work/work/nginx_related/gcc-linaro-4.9.4/bin:$PATH
export CC=arm-linux-gnueabi-gcc
export CXX=arm-linux-gnueabi-g++
export LD=arm-linux-gnueabi-ld
export AR=arm-linux-gnueabi-ar
export RANLIB=arm-linux-gnueabi-ranlib
export STRIP=arm-linux-gnueabi-strip

注意,第一个export要根据自己的交叉编译器的实际位置去添加,还有不要添加CROSS_COMPILE和ARCH,否则后面还要去修改设置。

添加ok后保存关闭,然后输入以下命令进行更新,
source /etc/bash.bashrc

接着在终端下输入命令arm-linux-gnueabi-gcc -v验证设置交叉编译器是否成功,如果成功会打印版本信息,如下
在这里插入图片描述


三 配置nginx

nginx本身是不支持交叉编译的,所以需要对其进行一定的修改。主要按照如下步骤进行修改,

  1. 进入nginx-1.16.1目录
  2. 打开configure文件,注释掉已下三行语句,
    在这里插入图片描述
  3. 打开auto/cc/conf,把82行的gcc修改为arm-linux-gnueabi-gcc
    在这里插入图片描述
  4. 打开auto/types/sizeof,把ngx_size设置为4 (32位目标平台是4,64位的话是8),
    在这里插入图片描述
    并把编译器的自检注释掉,使用#号进行注释
    在这里插入图片描述
  5. 打开auto/feature,注释掉ngx自检,如下标红的行
    在这里插入图片描述
  6. 打开src/os/unix/ngx_time.h,添加time.h头文件
    在这里插入图片描述
  7. 打开src/os/unix/ngx_errno.h,添加NGX_SYS_NERR的宏定义,
    在这里插入图片描述
  8. 打开src/event/ngx_event_accept.c,打开_GNU_SOURCE,使能accept4()
    在这里插入图片描述
  9. 打开src/event/ngx_event_udp.c,把判断NGX_HAVE_INET6的地方都注释掉,下面是其中一处,我们用不到ipv6
    在这里插入图片描述
  10. 打开src/os/unix/ngx_udp_sendmsg_chain.c,把判断NGX_HAVE_INET6的地方都注释掉,和第9步一样

以上修改好后,在nginx-1.16.1目录下执行下面的命令进行配置,

./configure --prefix=/home/work/work/nginx_related/myNginx --with-pcre=../pcre-8.43 --with-openssl=../openssl-1.1.1d --with-zlib=../zlib-1.2.11

–prefix是用来指定Nginx的安装路径,注意要根据自己的实际情况来指定位置,尽量不要放到需要root权限的目录下。


四 修改Nginx的Makefile

configure成功后,会产生objs/Makefile,打开这个文件进行修改,刚打开如下
在这里插入图片描述
修改后如下,

CC =	arm-linux-gnueabi-gcc
CFLAGS = -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g 
CPP =	arm-linux-gnueabi-gcc -E
LINK =	$(CC)

CFLAGS的值是正常编译nginx时给出的,即目标平台是pc机,交叉编译因为配置了nginx,就导致CFLAGS为空,所以这里把正常编译时的flag加过来。

配置pcre

在Makefile里搜索pcre,如下,在后面加上–host=arm-linux-gnueabi,表示要进行交叉编译
在这里插入图片描述


五 编译和安装

回到nginx-1.16.1目录下,然后执行make & make install进行整体编译和安装,ok后,可以在myNginx目录下看到如下内容,
在这里插入图片描述
在sbin下有nginx的elf文件,使用file命令查看其运行平台,
在这里插入图片描述
可以看出是ARM平台,此时,就可以把myNginx整个目录拷贝到目标板上去运行了。


六 总结

本文主要讲述如何交叉编译Nginx,参考了网上零零散散的教程,并加上多次实践,最终写出本教程,希望对大家有帮助。

如果有写的不对的地方,希望能留言指正,谢谢阅读。

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Nginx是一个开源的高性能Web服务器和反向代理服务器,常用于构建动态网站、负载均衡以及缓存等应用场景。交叉编译是指在一台主机上编译生成能够在另一种平台上运行的可执行文件。下面是关于Nginx交叉编译的一些详细信息。 交叉编译Nginx有以下几个步骤: 1. 准备交叉编译工具链:由于编译目标平台与主机平台不一致,需要准备交叉编译工具链。工具链是由交叉编译器、库文件以及其他工具组成的集合,用于在主机上编译生成目标平台的可执行文件。根据目标平台的不同,可以使用不同的交叉编译工具链。 2. 配置Nginx的编译选项:在进行交叉编译之前,需要根据目标平台的需求来配置Nginx的编译选项。这些选项包括目标平台的体系结构、操作系统、编译器等信息。 3. 执行交叉编译命令:在完成工具链的准备和Nginx的配置后,可以执行交叉编译命令来生成目标平台上运行的Nginx可执行文件。交叉编译命令一般会使用到之前准备的交叉编译工具链。 4. 测试和部署:在成功编译生成Nginx可执行文件后,可以在目标平台上进行测试和部署。测试可以验证编译生成的Nginx是否能够在目标平台上正常运行,部署则是将编译生成的Nginx安装到目标平台的指定位置,以便进行实际的应用。 总之,通过交叉编译可以在一台主机上为不同的目标平台生成可执行文件,这为Nginx在不同平台上的部署和使用提供了便利。交叉编译Nginx需要准备交叉编译工具链、配置编译选项,然后执行交叉编译命令来生成目标平台上可运行的Nginx文件。最后,可以在目标平台上进行测试和部署。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值