歲月留聲

OneinStack 升级 nginx-1.25.2 失败折腾记录

已经很久没折腾建站环境,昨晚不知道为啥想升级一下系统、php 和 nginx,前两者很顺利,最后却卡在了平常最容易升级也是耗时最少的 nginx 升级,怎么折腾都失败,并且费时!

OneinStack 升级 nginx-1.25.2 失败折腾记录 - 第1张图片

「OneinStack 升级 nginx-1.25.2 失败折腾记录:https://0xo.net/638」

往常都是执行以下代码清理更新 ngx_brotli 和 ngx_cache_purge 代码,然后使用 OneinStack 自带升级脚本升级 nginx 即可:

rm -rf /root/oneinstack/src/ngx_* && cd /root/oneinstack/src
wget --no-check-certificate -c -O ngx_cache_purge-2.3.tar.gz https://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz && tar xzf ngx_cache_purge-2.3.tar.gz
git clone https://github.com/google/ngx_brotli.git && cd ngx_brotli && git submodule update --init
cd /root/oneinstack/

看了一下错误提示应该与 ngx_brotli 有关,提示如下错误就更新失败:

/bin/ld: cannot find -brotlienc
/bin/ld: cannot find -lbrotlicommon

系统版本:CentOS Linux release 7.9.2009 (Core),这次升级 nginx 编译 OpenSSL 1.1.1v 速度巨慢,一度想放弃,删除 ngx_brotli 再编译……

「OneinStack 升级 nginx-1.25.2 失败折腾记录:https://0xo.net/638」

折腾几次,参考 ngx_brotli 官方安装说明,先把 ngx_brotli 依赖编译好,再使用 OneinStack 自带升级脚本升级 nginx 就好了。

下面记录一下折腾过程:

1、升级 cmake(也可以 cmake --version 检查一下版本 3.22 以上应该就可以):

「OneinStack 升级 nginx-1.25.2 失败折腾记录:https://0xo.net/638」
cd /usr/local/src && curl -LO https://github.com/Kitware/CMake/releases/download/v3.22.2/cmake-3.22.2-linux-x86_64.tar.gz && tar -xvf cmake-3.22.2-linux-x86_64.tar.gz && mv cmake-3.22.2-linux-x86_64 /usr/local/cmake
echo 'export PATH="/usr/local/cmake/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

2、清理更新 ngx_brotli 和 ngx_cache_purge 代码:

rm -rf /root/oneinstack/src/ngx_* && cd /root/oneinstack/src
wget --no-check-certificate -c -O ngx_cache_purge-2.3.tar.gz https://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.tar.gz && tar xzf ngx_cache_purge-2.3.tar.gz
git clone https://github.com/google/ngx_brotli.git && cd ngx_brotli && git submodule update --init
cd /root/oneinstack/

3、编译 ngx_brotli 依赖:

cd /root/oneinstack/src/ngx_brotli/deps/brotli && mkdir out && cd out
cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DCMAKE_C_FLAGS="-Ofast -m64 -march=native -mtune=native -flto -funroll-loops -ffunction-sections -fdata-sections -Wl,--gc-sections" -DCMAKE_CXX_FLAGS="-Ofast -m64 -march=native -mtune=native -flto -funroll-loops -ffunction-sections -fdata-sections -Wl,--gc-sections" -DCMAKE_INSTALL_PREFIX=./installed ..
cmake --build . --config Release --target brotlienc
cd ../../../..

4、下载 nginx 代码(如 1.25.2 版本)并解压,配置:

「OneinStack 升级 nginx-1.25.2 失败折腾记录:https://0xo.net/638」
cd /root/oneinstack/src
wget --no-check-certificate -c http://nginx.org/download/nginx-1.25.2.tar.gz
tar xzf nginx-1.25.2.tar.gz && cd nginx-1.25.2
export CFLAGS="-m64 -march=native -mtune=native -Ofast -flto -funroll-loops -ffunction-sections -fdata-sections -Wl,--gc-sections"
export LDFLAGS="-m64 -Wl,-s -Wl,-Bsymbolic -Wl,--gc-sections"

5、如无意外,这时候再使用 OneinStack 自带升级脚本升级 nginx 就可以了:

温馨提示:记得先开启 screen 再执行升级,瓦工 2018 年双十一 2G2C 套餐编译 OpenSSL 1.1.1v 相当费时,RackNerd 劳动节绝版 3C3G 套餐就快一点。

cd /root/oneinstack && ./upgrade.sh

经过 7 个多小时漫长的等待,终于成功升级到 nginx-1.25.2……

OneinStack 升级 nginx-1.25.2 失败折腾记录 - 第2张图片

应该算是目前折腾历史上耗时最长的一次 nginx 升级:

# nginx -V 
nginx version: nginx/1.25.2
built with OpenSSL 1.1.1v  1 Aug 2023
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-openssl=../openssl-1.1.1v --with-pcre=../pcre-8.45 --with-pcre-jit --with-ld-opt=-ljemalloc --add-module=../ngx_brotli --add-module=../ngx_cache_purge-2.3

瓦工老款 VPS 套餐真的老了……

退出移动版