历史编译记录。 本文以 2023 年宝塔面板与 Nginx 1.22 为背景,说明构建参数和动态模块兼容性。当前面板的脚本入口、参数与模块打包方式需要按版本核对。
当时为了使用 Nginx 的 stream realip 功能,我修改了宝塔安装脚本的 ./configure 参数后重新编译。思路仍有参考价值,但不能把当年的面板脚本和版本号直接当作今天的安装命令。
安装脚本应从面板对应版本的官方渠道获取。先保留现有 nginx.sh,再检查下载来源、脚本内容与版本兼容性;不要先删除本地文件,再执行未经验证的下载内容。
先确认正在运行哪个 Nginx
面板环境可能与系统包同时安装 Nginx。先查看 master process 与实际二进制,使用那个二进制的 -V 检查 configure 参数,不能仅凭 shell 中的 nginx 判断面板实例。
ps -eo pid,args | grep '[n]ginx: master'
# 将下面路径换成正在运行的二进制;这是我使用过的宝塔路径。
/www/server/nginx/sbin/nginx -V 2>&1
读取 master PID 的 /proc/PID/exe 也能确认执行文件。我的家庭基础设施记录使用 /www/server/nginx/sbin/nginx;在另一套系统 Nginx 上执行 -t,不能证明面板配置通过。
模块功能与编译方式
官方 configure 参数 区分几个容易混淆的模块:
| 参数 | 用途 |
|---|---|
--with-stream 或 --with-stream=dynamic |
TCP/UDP stream 代理框架 |
--with-stream_ssl_preread_module |
在不终止 TLS 的情况下读取 ClientHello SNI/ALPN |
--with-stream_realip_module |
stream 层接收可信 PROXY 来源地址 |
--with-http_realip_module |
HTTP 层还原可信代理提供的来源地址 |
如果模块已编译为动态模块,还要检查 load_module 和对应 .so 是否加载。缺少某项时,不要只在旧脚本里追加一个参数就替换整个运行实例:保留当前版本、完整 configure 参数、补丁、库依赖与模块 ABI,是能够回滚的前提。

自编译和系统包的路径、模块兼容性、OpenSSL 链接方式可能不同。动态模块应按匹配的 Nginx 版本与构建选项编译,必要时使用 --with-compat;这也不能保证任意第三方模块跨版本兼容。面板更新还可能覆盖自定义构建,实际维护方案必须说明后续升级方式。
变更后验证
在隔离环境完成构建与模块加载检查,再使用实际二进制和实际配置进行 -t。通过后才替换/重载服务,并验证依赖该模块的功能:例如 stream SNI 分流、PROXY 前缀收发和可信来源地址。
/www/server/nginx/sbin/nginx -t
/www/server/nginx/sbin/nginx -V 2>&1
这里没有执行新的面板安装或重编译,也没有验证当前宝塔脚本的 install 参数。旧的 install 1.22 仅属于当年操作记录;已有 Nginx 实例应按当前支持版本维护。

评论区