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本身是不支持交叉编译的,所以需要对其进行一定的修改。主要按照如下步骤进行修改,
- 进入nginx-1.16.1目录
- 打开configure文件,注释掉已下三行语句,
- 打开auto/cc/conf,把82行的gcc修改为arm-linux-gnueabi-gcc
- 打开auto/types/sizeof,把ngx_size设置为4 (32位目标平台是4,64位的话是8),
并把编译器的自检注释掉,使用#号进行注释
- 打开auto/feature,注释掉ngx自检,如下标红的行
- 打开src/os/unix/ngx_time.h,添加time.h头文件
- 打开src/os/unix/ngx_errno.h,添加NGX_SYS_NERR的宏定义,
- 打开src/event/ngx_event_accept.c,打开_GNU_SOURCE,使能accept4()
- 打开src/event/ngx_event_udp.c,把判断NGX_HAVE_INET6的地方都注释掉,下面是其中一处,我们用不到ipv6
- 打开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,参考了网上零零散散的教程,并加上多次实践,最终写出本教程,希望对大家有帮助。
如果有写的不对的地方,希望能留言指正,谢谢阅读。