我想在NAS上通过Nginx的目录索引功能运行一个下载站。自带的autoindex不是很好看,所以用FancyIndex的Docker镜像部署。
刚好之前也研究过这个模块的编译,所以就想在群晖上利用原生的WebStation配置。最后是失败了,但是编译出的二进制和群晖是兼容的,因此记录一下,给其他工具的编译提供一些参考。
系统平台
编译平台:
Arch:x86_64
OS:Debian Buster
目标平台:
Dev: DS920+
Arch:x86_64(J4125 GeminiLake)
OS:DSM7.0
交叉编译工具链下载
群晖开源项目:https://sourceforge.net/projects/dsgpl/
我们需要的工具链在:https://sourceforge.net/projects/dsgpl/files/Tool%20Chain/。根据自己的系统版本和CPU架构,选择对应的工具链下载。
cd /opt
wget https://sourceforge.net/projects/dsgpl/files/Tool%20Chain/DSM%207.0.0%20Tool%20Chains/Intel%20x86%20Linux%204.4.180%20%28GeminiLake%29/geminilake-gcc750_glibc226_x86_64-GPL.txz
tar xvf geminilake-gcc750_glibc226_x86_64-GPL.txz
解压完成后会在bin目录下看到目标平台的编译工具,gcc、g++、ld等。
将所需工具添加到环境变量,以便编译时编译系统能够获取到这些文件。
export PATH=$PATH:${pwd}/x86_64-pc-linux-gnu/bin
内核版本和CPU架构也可以在群晖内进行验证:
查看内核:uname -a
。
查看CPU架构:ls /sys/module/ |grep synobios
。
Nginx以及其依赖的源码下载
如果编译给本机使用,通过包管理器安装所需要依赖即可,但是编译指定目标平台的代码,依赖也需要编译成目标平台的,所以需要依赖源码。
因为是打算给群晖编译的,所以版本上尽可能的贴近群晖使用的版本。
cd /usr/local/src
wget https://nginx.org/download/nginx-1.20.1.tar.gz
wget https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.gz
wget https://zlib.net/zlib-1.2.13.tar.gz
wget https://www.openssl.org/source/openssl-1.1.1t.tar.gz
ls *.tar.gz |xargs -n1 tar xzvf
生成Makefile
Nginx通过configure生成Makefile,在这里指定使用的gcc和g++为我们下载的工具链中的套件。
./configure --with-cc=x86_64-pc-linux-gnu-gcc \
--with-cpp=x86_64-pc-linux-gnu-g++ \
--with-pcre=../pcre-8.45 \
--with-zlib=../zlib-1.2.13 \
--with-openssl=../openssl-1.1.1t \
--with-threads \
--with-http_ssl_module
编译
make
最终生成的二进制文件在当前nginx编译工作目录下的objs目录下。
测试
上述并没有涉及动态模块的添加,但是和正常的nginx编译没有什么区别,只是conifure添加了两个参数,执行编译使用的工具链。
我在实践的时候,编译出的动态模块可以被群晖的Ningx正确加载。配置完虚拟主机后尝试访问,Ningx报403,后台日志显示为权限问题,但是无论我如何更改权限,始终无法正常访问,所以就放弃了。
由于群晖的Nginx没有办法通过Nginx -V
看到编译选项,所以可能和编译出的模块之间存在一些不兼容。
尽管没有解决问题,但是实践还是很有意义,可以通过类似的方式,编译iperf3、tcping等工具,能减少对Docker的依赖。