前言
本文主要介绍nginx部署到Android板上的三种方案,个人建议优先选择方案三。
方案一:依赖于termux安装,移植到其他设备和集成到固件较为复杂,路径也有一定限制;
方案二:不依赖termux,但交叉编译工具链适配有点费事,编译问题较多,且安装路径限制严重,必须prefix配置在一个编译服务器和设备上共有的根目录结构,只有etc和bin,但集成到固件的话,设备端放这两个目录不规范且Selinux权限较难搞定;
方案三:依赖termux安装clang和make,但下载的默认编译器就是跟设备架构适配的,./configure时无需修改nginx源码,prefix路径选择也较为自由,建议放在data目录下,权限问题较好解决,system和vendor下也可以放,但如果需要开机自启动,权限问题会有点难搞
一、使用Termux辅助安装后移植
1、直接在termux中使用指令pkg install nginx安装nginx,用nginx -v测试是否成功

2、根据自身需求修改nginx.conf文件,可参考方案二中修改
3、找到对应的安装目录,把相关文件全部pull出来,然后在移植到其他设备验证,过程中遇到一些路径或者文件缺失错误,重点可能是一些路径匹配问题,根据提示和之前的安装路径修改即可
二、nginx源码在项目中交叉编译
1、环境准备
(1)确定当前项目架构,可在adb中使用uname -m查询

(2)在项目源码中找到对应的交叉编译工具链,如果没有可在安卓ndk官网下载NDK 下载 | Android NDK | Android Developers (google.cn),在编译的过程中如果遇到一些nginx源码c文件中的类型定义之类的错误,可以更换ndk版本试一下,可能是版本不匹配,我这里用的是nginx-1.29.0+android-ndk-r21e,下载以后需配置环境变量:
(3)编辑~/.bashrc 问价末尾添加以下内容,然后执行source ~/.bashrc使配置生效,也可以直接在服务器使用export方式临时设置环境变量,但此种方式关闭当前终端后就失效了。

(4)根据需求下载nginx、openssl、zlib、pcre等必要源码,如果只需要nginx基础web访问功能此只下载nginx即可,nginx源码官网:http://nginx.org/download/nginx-1.29.0.tar.gz,选择自己需要的版本,也可以使用wget指令下载


2、配置源码
nginx源码本身不支持交叉编译,直接configure会配置不过,需要进行一些修改
(1)提示找不到C complier,修改auto/cc/name文件


(2)提示size错误,修改auto/types/sizeof,32位系统改为4,64位改为8


3、交叉编译
(1)解压完后进入nginx源码目录,默认是没有Makefile的,需要先用configure脚本生成Makefile,可使用./configure –help查看编译配置选项,根据自己的需求选择配置,打开或者关闭某些功能,如需使用openssl等,执行configure时添加对应配置选项即可

(2)我这里需求比较简单,只需要基础功能,不依赖于其他模块,所以只需要最简单的配置,clang版本尽量使用最新android API,确保编译时链接正确的系统库头文件 ,避免一些兼容性问题导致编译不过,我这里用的是aarch64-linux-android30-clang
./configure --prefix=etc/nginx #指定安装位置
--with-cc=aarch64-linux-android30-clang #指定交叉编译工具链
(3)此时会报HTTP rewrite错误,此功能默认打开的,但是需要pcre库支持,可以下载pcre源码编译解决,也可以配置时添加–without-http_rewrite_module禁用此重写功能解决

cd pcre-8.45
./configure --prefix=$pwd --host=aarch64-linux-android30
make -j32
配置成功如图所示:
(4)至此,configure成功

(5)执行make -j32进行编译,会报错如下,返回配置添加–without-http_upstream_zone_module禁用共享内存模块,重新编译

(6)继续报一些内存错误,在objs目录找到 ngx_auto_config.h 文件,增加宏定义
#ifndef NGX_HAVE_SYSVSHM
#define NGX_HAVE_SYSVSHM 1
#endif

(7)至此编译成功,再使用make install安装,完成后会生成install文件夹,install文件夹中有以下文件,sbin中的nginx为最终执行文件,使用file nginx可查看文件格式是否跟一开始的设备架构一致,完整的configure参数如下:
./configure --prefix=etc/nginx
--with-cc=aarch64-linux-android30-clang #指定编译架构
--without-http_upstream_zone_module #禁用共享内存模块,避免编译错误
--without-http_rewrite_module #不依赖pcre时,需禁用http重写功能

(8)如需使用openssl可单独配置编译,配置openssl时需注意要配置为对应的架构,可通过./Configure –help查询支持的架构,配置成功如图所示,编译生产的so也可使用file指令查看文件格式
cd openssl-1.1.1f
./Configure android-arm64 -D__ANDROID_API__=30 #根据交叉编译工具链修改
make -j32


(9)pcre跟openssl同理,配置成功会显示对应工具链,如果不是需要的工具链,可通过export指定CC和CXX,指定后重新configure和make
cd pcre-8.45
./configure --prefix=$(pwd) --host=aarch64-linux-android30
export CC=aarch64-linux-android30-clang
export CXX=aarch64-linux-android30-clang++
make -j32

(10)使用openssl和pcre等模块的时候,如果先单独编译过openssl和pcre,在nginx里configure后需要在生成的makefile中删掉再次编译的部分,否则会编译报错

4、移植到设备验证
(1)install文件夹整个直接push到设备的data目录下,此处需注意,文件放置路径保持跟nginx交叉编译时的prefix参数要一致,否则会报一些无法找到文件之类的错误信息,例如etc/nginx,注意服务器编译到etc目录需su权限,push到设备后需用chmod给nginx赋执行权限
(2)根据需求修改nginx.conf文件,主要包括端口号和要访问的静态文件(地图碎片)存储路径

(3)运行./nginx后,可在本设备或同一局域网中的其他设备浏览器中通过http://设备IP:8080访问预置的静态文件,若无WiFi,设备本身可通过自己的回环IP访问
(4)初次访问失败,提示403错误或者无法访问此网站,HTTP状态码403代表没有权限,拒绝访问,需要关闭防火墙和Selinux,并在nginx.conf中修改启动用户为root,重新push到设备重新启动nginx,访问成功



三、在设备中编译nginx源码
1、环境准备
(1)百度下载termux工具安装包
(2)在设备中使用adb install -d /path/to/com.termux.apk(根据自己实际路径修改),安装后termux路径在/data/data/com.termux


(3)设备连接WiFi,用termux安装gcc/clang编译工具链ndk r17+以后都是使用clang了,根据提示指令安装即可,此方式下载的工具链自动会跟设备架构匹配,安装后工具链位置在/data/data/com.termux/files/usr/bin中


(4)安装make工具链,安装指令和位置跟clang同理


(5)下载完后,在adb shell中配置环境变量
(6)把提前下载解压好的nginx源码直接push到设备的data/nginx目录,或者其他有读写权限的目录均可,给nginx文件夹直接赋777权限
2、源码编译
(1)此方案配置nginx时无需做源码部分修改,只需./configure –prefix=/data/nginx-1.29.0 –with-cc=clang指定prefix目录和编译器,需注意工具链(clang和make等)要在termux中安装,但实际源码编译操作是在adb shell环境下
(2)由于termux默认下载只有clang-20版本,make编译时会报如下运算错误,追溯源码发现此处条件均为0,此处手动修改如下可解决,有兴趣的也可尝试升级clang版本解决


(3)make install安装nginx,默认安装目录在/data/data/com.termux/files/usr,可在源码./configure时修改指定,如./configure –prefix=/data/nginx/install,安装完成后会有下列文件,其中sbin/nginx即为最终执行文件

3、功能验证
(1)./nginx -v可查询版本号, -h查看参数列表,-t可测试配置文件是否正确,至此服务搭建完成。


(2)设备连接WiFi,ifconfig获取IP地址,同一局域网中的电脑可通过浏览器访问http://设备IP:8080可访问地图碎片数据,设备本身也可以通过浏览器访问
(3)若设备没有WiFi的情况下,设备本身可通过回环IP(也叫localhost)访问,即http://localhost:8080

4、预置到固件
(1)整个文件夹按照编译时的prefix目录放到系统源码中对应位置,添加开机自启动,给nginx文件赋执行权限和Selinux权限,编译到固件中,烧录后开机即可根据IP访问



















暂无评论内容