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:上述文件也可以点击这里下载,nginx_related_免费高速下载|百度网盘-分享无限制
以上文件下载好后传到虚拟机里,然后分别解压
把交叉编译器解压到一个不需要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验证设置交叉编译器是否成功,如果成功会打印版本信息,如下
以上内容可以不用配置,如果用第三方交叉编译工具,直接解压指定文件夹解压即可,
然后下面使用的时候在临时中断,导出环境变量,或者执行环境配置脚本,自动将当前
$CC设置成交叉编译的gcc
正式开始!
三 配置nginx
nginx本身是不支持交叉编译的,所以需要对其进行一定的修改。主要按照如下步骤进行修改,
进入nginx-1.16.1目录
1 打开configure文件,注释掉已下三行语句,
2 打开auto/cc/conf,把82行的gcc修改为arm-linux-gnueabi-gcc
3 打开auto/types/sizeof,把ngx_size设置为4 (32位目标平台是4,64位的话是8),
4 并把编译器的自检注释掉,使用#号进行注释
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
打开src/os/unix/ngx_udp_sendmsg_chain.c,把判断NGX_HAVE_INET6的地方都注释掉,和第9步一样
以上修改好后,在nginx-1.16.1目录下执行下面的命令进行配置,
./configure --prefix=/home/vmuser/install --with-pcre=../pcre-8.43 --with-openssl=../openssl-1.1.1d --with-zlib=../zlib-1.2.11
–prefix是用来指定Nginx的安装路径,注意要根据自己的实际情况来指定位置,尽量不要放到需要root权限的目录下。
四 实际测试不需要修改Nginx的Makefile,默认生成即可。
五 编译和安装
回到nginx-1.16.1目录下,然后执行make & make install进行整体编译和安装,ok后,可以在myNginx目录下看到如下内容,