1、准备工作
1.1交叉编译zlib
//第一步、构建
./configure --prefix=/home/liu/lib --static
//第二步、修改makefile文件(由于在configure中不支持指定编译链,故需要手动修改makefile文件)
CC=arm-linux-gnueabihf-gcc
AR=arm-linux-gnueabihf-ar
RANLIB=arm-linux-gnueabihf-ranlib
//第三步、编译
make
//第四步、安装
make install
1.2交叉编译pcre
//构建
./configure --host=arm-linux-gnueabihf --prefix=/mnt/nginx/ --enable-static --disable-shared CC=arm-linux-gnueabihf-gcc
//编译
make
//安装
make install
2、nginx交叉编译
2.1下载地址
2.2修改nginx配置文件
由于nginx本身并不支持交叉编译,所以在进行交叉编译之前要对其文件进行修改,下面以nginx 1.19.1为例(进入nginx-1.19.1文件夹)。
2.2.1 打开configure文件,注释掉下面三行语句,如下图:
2.2.2 打开auto/cc/conf,把第82行的gcc修改为对应的编译链arm-linux-gnueabi-gcc,如下图:
2.2.3 打开auto/types/sizeof,把ngx_size设置为4(说明:32位目标平台是4,64位目标平台是8),如下图:
并把编译器的自检注释掉,使用#号进行注释,如下图:
2.2.4 打开auto/feature,注释掉ngx自检,如下图中标红的行:
2.2.5 打开src/os/unix/ngx_time.h,添加time.h头文件,如下图:
2.2.6 打开src/os/unix/ngx_errno.h,添加NGX_SYS_NERR的宏定义,如下图:
2.2.7 打开src/event/ngx_event_accept.c,打开_GNU_SOURCE,使能accept4(),如下图:
2.2.8 打开src/event/ngx_event_udp.c,把判断NGX_HAVE_INET6的地方都注释掉,如下图:
下面是其中一处,我们用不到ipv6
2.2.9 打开src/os/unix/ngx_udp_sendmsg_chain.c,把判断NGX_HAVE_INET6的地方都注释掉,和2.2.8操作一样。
3、构建并编译nginx
3.1 执行configure指令
以上文件都修改完成后,在nginx-1.19.1目录下执行下面的命令
//配置交叉编译环境
export CC=arm-linux-gnueabihf-gcc
export CXX=arm-linux-gnueabihf-g++
export LD=arm-linux-gnueabihf-ld
export AR=arm-linux-gnueabihf-ar
export RANLIB=arm-linux-gnueabihf-ranlib
export STRIP=arm-linux-gnueabihf-strip
//执行构建指令
./configure --prefix=/home/cbliu/nginx/1.19.1 --with-pcre=/home/cbliu/nginx/pcre-8.39 --with-openssl=/home/cbliu/nginx/openssl-1.0.2p --with-zlib=/home/cbliu/nginx/zlib-1.2.11
./configure --prefix=/mnt/nginx/1.19.1 --with-pcre=/mnt/nginx/pcre-8.39 --with-openssl=/mnt/nginx/openssl-1.0.2p --with-zlib=/mnt/nginx/zlib-1.2.11
说明:
–prefix是用来指定nginx的安装路径,注意要根据自己的实际情况来指定位置,尽量不要放到需要root权限的目录下。–with-pcre是用来指定pcre第三方库的路径。–with-openssl是用来指定openssl第三方库的路径。–with-zlib是用来指定zlib库的安装路径。
3.2 修改objs/makefile文件
configure成功后,会产生objs/Makefile文件,打开这个文件进行编辑修改,刚打开如下图:
调整后如下:
CC = arm-linux-gnueabihf-gcc
CFLAGS = -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g
CPP = arm-linux-gnueabihf-gcc -E
LINK = $(CC)
说明:
CFLAGS的值是正常编译nginx时生成的,即目标平台是x86,因为nginx我们配置了交叉编译,就导致CFLAGS的值为空,所以这里把正常编译生成的cflags加过来就可以了。
3.3 在Makefile中配置pcre[可选项]
在Makefile里搜索pcre,如下,在后面加上–host=arm-linux-gnueabihf,表示要进行交叉编译,如下图:
4、问题
4.1 启动nginx时提示没有或无法打开错误日志文件
问题:
解决办法:
进入到对应的目录发现没有nginx这个文件夹,以前启动的时候没有问题,这次关闭nginx后再启动/var/log/nginx这个文件夹都不见了,需要创建对应的目录,以及error.log文件,然后再次启动就没有问题了。