基于海思3559 nginx 的交叉编译与部署
一 、概述:
版本号 | nginx-1.6.2 |
---|---|
依赖包 | zlib-1.2.9 openssl-1.0.2(此安装包需要版本适配,不建议更换依赖包版本) nginx-rtmp-module.tar |
编译环境 | 海思的交叉编译环境(本文以3559为例) aarch64-himix100-linux- |
编译结果 | 基于海思3559 可直接部署的文件 nginx.tar |
安装包下载地址 | https://download.youkuaiyun.com/download/ls2018536/12689533 |
二 、 解压安装包
解压nginx-1.6.2.tar.gz
tar -zxvf nginx-1.6.2.tar.gz
解压openssl-1.0.2.tar.gz
tar -zxvf openssl-1.0.2.tar.gz
移动 openssl-1.0.2 到nginx-1.6.2内
mv openssl-1.0.2 nginx-1.6.2/
解压 zlib-1.2.9.tar.gz
tar -zxvf zlib-1.2.9.tar.gz
移动zlib-1.2.9 到 nginx-1.6.2
mv zlib-1.2.9 nginx-1.6.2/
解压nginx-rtmp-module.tar
tar -xvf nginx-rtmp-module.tar
移动 mv nginx-rtmp-module 到nginx-1.6.2
mv nginx-rtmp-module nginx-1.6.2/
此时nginx-1.6.2目录如下所示:
三 、交叉编译openssl-1.0.2
1、进入openssl-1.0.2文件夹下
cd openssl-1.0.2
2、建立文件夹_install
mkdir _install
3、修改编译文件执行下面命令:
./config no-asm shared -fPIC --prefix=/data/lis/workspace/nginx/nginx-1.6.2/openssl-1.0.2/_install --cross-compile-prefix=aarch64-himix100-linux-
备注:/data/lis/workspace/nginx/nginx-1.6.2/openssl-1.0.2/_install 为安装路径,根据自己的目录进行修改
aarch64-himix100-linux- 为交叉编译工具
4、进入Makefile, 删除64 行和181行 -m64
5、开始编译(编译时间比较长请耐心等待)
make (如果编译失败,请make clean 后再进行尝试)
备注:因为nginx只需要编译后里面的静态库,所以需要安装,交叉编译完成即可。
四 、交叉编译nginx-1.6.2
1、编写配置脚本b.sh如下:(本人nginx路径是/data/lis/workspace/nginx/nginx-1.6.2)根据自己的路径行修改
#!/bin/sh
BUILD_PATH=/data/lis/workspace/nginx/nginx-1.6.2
INSTALL_PATH=/data/lis/workspace/nginx/nginx
CC_PATH=/opt/hisi-linux/x86-arm/aarch64-himix100-linux/bin/aarch64-himix100-linux-gcc
CPP_PATH=/opt/hisi-linux/x86-arm/aarch64-himix100-linux/bin/aarch64-himix100-linux-g++
CONFIG_DIR=/data/lis/workspace/nginx/nginx/conf
LOG_DIR=/data/lis/workspace/nginx/nginx/log
TEMP_DIR=/data/lis/workspace/nginx/nginx/tmp
HOME_NGINX=/data/lis/workspace/nginx/nginx-1.6.2 #解压出来的路径可用pwd代替
./configure --prefix=/data/lis/workspace/minio/nginx-1.6.2/nginx \
--add-module=$HOME_NGINX/nginx-rtmp-module \
--with-zlib=$HOME_NGINX/zlib-1.2.9 \
--without-pcre --without-http_rewrite_module \
--with-http_ssl_module \
--with-openssl=$HOME_NGINX/openssl-1.0.2 \
--with-cc=$CC_PATH \
--with-cpp=$CPP_PATH
2、建立nginx 的安装路径,执行b.sh脚本
[lis@svr222 nginx-1.6.2]$ mkdir nginx
(此路径需要与脚本内的--prefix=/data/lis/workspace/minio/nginx-1.6.2/nginx路径相同)
[lis@svr222 nginx-1.6.2]$ ./b.sh 会出现一些错误,请根据本文说明进行修改。
错误 1.
./configure: error: C compiler /opt/hisi-linux/x86-arm/aarch64-himix100-linux/bin/aarch64-himix100-linux-gcc is not found
修改 nginx-1.6.2/auto/cc/ name
[lis@svr222 nginx-1.6.2]$ vi auto/cc/name
if [ "$NGX_PLATFORM" != win32 ]; then
ngx_feature="C compiler"
ngx_feature_name=
#ngx_feature_run=yes //帮yes 修改成no
ngx_feature_run=no
ngx_feature_incs=
ngx_feature_path=
ngx_feature_libs=
ngx_feature_test=
. auto/feature
if [ $ngx_found = no ]; then
echo
echo $0: error: C compiler $CC is not found
echo
exit 1
fi
fi
错误 2.
checking for int size ...auto/types/sizeof: line 43: objs/autotest: cannot execute binary file bytes
./configure: error: can not detect int size
cat: objs/autotest.c: No such file or directory
修改nginx-1.6.2/auto/ type/ sizeof
[lis@svr222 nginx-1.6.2]$ vi auto/types/sizeof
END
ngx_size=4
#cat << END > $NGX_AUTOTEST.c
#
##include <sys/types.h>
##include <sys/time.h>
#$NGX_INCLUDE_UNISTD_H
##include <signal.h>
##include <stdio.h>
##include <sys/resource.h>
#$NGX_INCLUDE_INTTYPES_H
#$NGX_INCLUDE_AUTO_CONFIG_H
#
#int main() {
# printf("%d", (int) sizeof($ngx_type));
# return 0;
#}
END
3、编译 :在编译的过程中会出现一些错误,具体参考下列进行解决。
make
4、 安装nginx
make install
错误 1.
adding module in /data/lis/workspace/nginx/nginx-1.6.2/nginx-rtmp-module
./configure: error: no /data/lis/workspace/nginx/nginx-1.6.2/nginx-rtmp-module/config was found
请检查nginx-1.6.2/ 下是否缺少nginx-rtmp-module文件夹,如果缺少请拷贝进去继续编译
错误 2.
src/os/unix/ngx_errno.c: In function 'ngx_strerror':
src/os/unix/ngx_errno.c:37:31: error: 'NGX_SYS_NERR' undeclared (first use in this function)
msg = ((ngx_uint_t) err < NGX_SYS_NERR) ? &ngx_sys_errlist[err]:
^~~~~~~~~~~~
src/os/unix/ngx_errno.c:37:31: note: each undeclared identifier is reported only once for each function it appears in
src/os/unix/ngx_errno.c: In function 'ngx_strerror_init':
src/os/unix/ngx_errno.c:58:11: error: 'NGX_SYS_NERR' undeclared (first use in this function)
len = NGX_SYS_NERR * sizeof(ngx_str_t);
^~~~~~~~~~~~
make[1]: *** [objs/src/os/unix/ngx_errno.o] Error 1
make[1]: Leaving directory `/data/lis/workspace/nginx/nginx-1.6.2'
make: *** [build] Error 2
在objs/ngx_auto_config.h内添加宏定义如下:
#ifndef NGX_SYS_NERR
#define NGX_SYS_NERR 132
#endif
#ifndef NGX_HAVE_SYSVSHM
#define NGX_HAVE_SYSVSHM 1
#endif
错误 3.
/data/lis/workspace/nginx/nginx-1.6.2/openssl-1.0.2/.openssl/lib/libssl.a: error adding symbols: File n wrong format
collect2: error: ld returned 1 exit status
make[1]: *** [objs/nginx] Error 1
make[1]: Leaving directory `/data/lis/workspace/nginx/nginx-1.6.2'
make: *** [build] Error 2
此错误是因为没有找到libssl.a 造成的。修改改文件寻找路径具体如下
[lis@svr222 nginx-1.6.2]$ vi auto/lib/openssl/conf (修改之后需要从新执行b.sh文件生成新的Makefile 。 前面解决的问题依然会遇到解决方法相同)
CORE_INCS="$CORE_INCS $OPENSSL/include"
CORE_DEPS="$CORE_DEPS $OPENSSL/include/openssl/ssl.h"
CORE_LIBS="$CORE_LIBS $OPENSSL/libssl.a"
CORE_LIBS="$CORE_LIBS $OPENSSL/libcrypto.a"
CORE_LIBS="$CORE_LIBS $NGX_LIBDL"
错误 4.
make -f objs/Makefile
make[1]: Entering directory `/data/lis/workspace/nginx/nginx-1.6.2'
/opt/hisi-linux/x86-arm/aarch64-himix100-linux/bin/aarch64-himix100-linux-gcc -c -pipe -O -W -Wall -Wpointer-arith -Wno-unused -Werror -g -I/data/lis/workspace/nginx/nginx-1.6.2/nginx-rtmp-module -I src/core -I src/event -I src/event/modules -I src/os/unix -I /data/lis/workspace/nginx/nginx-1.6.2/openssl-1.0.2/include -I /data/lis/workspace/nginx/nginx-1.6.2/zlib-1.2.9 -I objs \
-o objs/src/core/nginx.o \
src/core/nginx.c
In file included from src/os/unix/ngx_linux_config.h:59:0,
from src/core/ngx_config.h:26,
from src/core/nginx.c:8:
objs/ngx_auto_config.h:21:0: error: unterminated #ifndef
#ifndef NGX_HAVE_SCHED_SETAFFINITY
make[1]: *** [objs/src/core/nginx.o] Error 1
make[1]: Leaving directory `/data/lis/workspace/nginx/nginx-1.6.2'
make: *** [build] Error 2
1、需要重新交叉编译 openssl-1.0.2,具体方法与上述文章相同
2、重新执行b.sh脚本 然后继续编译 make
五 、部署
1、拷贝文件
将当前目录下的nginx目录下所有移植到开发板上
2、修改脚本
修改nginx/conf/nginx.conf
user root;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
3、执行进程 (本文拷贝的目录是/mnt/mtd/data/ ,需要根据不同的目录进行修改)
./nginx -c /mnt/mtd/data/nginx/conf/nginx.conf -p /mnt/mtd/data/nginx