基于海思3559 nginx 的交叉编译与部署

基于海思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.csdn.net/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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值