Android系统集成nginx服务

前言

本文主要介绍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访问

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容