首页
斐讯设备
疯言疯语
系统运维
编程语言
网站建设
友情连接
推荐
autojs
Search
1
charles破解注册码(含windows和mac)最新安装教程「亲测有效」
62 阅读
2
mac下的好用工具小身材大本领-NeatDownloadManager-ndm下载器
41 阅读
3
【N1和Armbian】一、N1刷Linux系统armbian
40 阅读
4
aris常用命令收集
37 阅读
5
docker更新现有容器为自动重启
35 阅读
登录
Search
标签搜索
JAVA
JAVA学习系列
docker
Linux
js
N1
git
模块二
模块一
端口
模块五
数据库
模块九
模块四
镜像
模块三
模块六
MySQL
百度网盘
nginx
DaiMaFengZi
累计撰写
596
篇文章
累计收到
11
条评论
首页
栏目
斐讯设备
疯言疯语
系统运维
编程语言
网站建设
页面
友情连接
推荐
autojs
搜索到
86
篇与
的结果
2026-08-21
Redis 内存防崩溃优化方案
Redis 内存防崩溃优化方案目标:让 Redis 永远有硬上限,系统永远不进 Swap,事故提前告警而非事后重启。⚠️ 全文命令中的密码已替换为占位符 你的密码,执行时请换成真实密码;redis-cli 路径每台服务器不同,请先按【附一】查询替换。附一、先查询 redis-cli 路径(每台服务器不同,纯查询、不影响系统)下面都是只读查询命令,不会改动任何东西,放心执行:# 1. 看系统 PATH 里是否已能直接调用(最常用) which redis-cli # 2. 看正在运行的 redis-server 二进制在哪,redis-cli 通常在同目录的 bin 下 ps -ef | grep redis-server # 3. 常见安装目录直查(哪个有输出就用哪个) ls -l /usr/local/redis/bin/redis-cli 2>/dev/null ls -l /usr/bin/redis-cli 2>/dev/null ls -l /opt/redis/bin/redis-cli 2>/dev/null # 4. 全盘找(只读扫描,不影响系统;结果里取第一个存在的路径) find / -name redis-cli -type f 2>/dev/null | head查到后,把下文命令里的 /usr/local/redis/bin/redis-cli 整体换成你查到的实际路径即可。一、根因结论(一句话)Redis 没有有效的内存上限(或上限过大)→ 内存无限增长 → 物理内存耗尽 → Swap 打满(100%) → 页面置换风暴 → CPU 99% → 系统假死。典型崩溃时间线:Redis 吃满内存 → Swap 96% → Swap 100% → 触发事件,CPU 2%→42% → CPU 99% / 高负载 / 假死 → 人工重启。核心矛盾不是"Redis 用了多少",而是"它能不能无限用"。 只要给它一个硬上限并留足系统余量,同样的负载绝不会再把机器拖死。二、设计三原则#原则作用1给 Redis 设硬上限 maxmemory满则"驱逐旧数据",而非"撑爆系统内存"2系统永远留余量,绝不进 SwapSwap 一旦打满,Redis 延迟暴涨、CPU 被置换吞掉3合理监控水位,提前感知风险把事故消灭在苗头,而不是 100% 假死说明:原则 2 的"绝不进 Swap"是靠原则 1 把 Redis 框在合理上限内实现的(详见第三节),不需要去动系统内核参数。三、maxmemory 设置(最关键的一步)3.1 计算公式(务必满足)maxmemory ≤ (物理内存 × 0.85) − 其他进程常驻内存例:物理 31G,其他常驻进程(应用、数据库、Agent 等)合计约 6G。安全上限:31 × 0.85 − 6 ≈ 20G。即 Redis 最多给到 20G 也不会逼系统用 Swap。3.2 推荐值按"当前工作集 × 1.5"留余量防突增。若当前稳定 8G,则 maxmemory = 12G(12884901888 字节)。12G + 6G 其他 ≈ 18G,远小于 31G,系统永远有空闲 → 永不 Swap。3.3 设置命令(路径请先按【附一】查询替换)# 临时生效(立即止血) /usr/local/redis/bin/redis-cli -a '你的密码' CONFIG SET maxmemory 12884901888 # 验证 /usr/local/redis/bin/redis-cli -a '你的密码' CONFIG GET maxmemory3.4 ⚠️ 持久化(极易踩坑)若 redis 启动时没有带配置文件参数(如 redis-server 0.0.0.0:6379),它是用默认配置启动的,CONFIG REWRITE 可能新建文件但重启仍会丢配置。必须找到真正的启动入口并写进去(以下为只读查询,定位用):# 看是不是 systemd 托管 systemctl cat redis 2>/dev/null systemctl cat redis-server 2>/dev/null # 或看 init 脚本 / 启动脚本里有没有 redis-server ls -l /etc/init.d/ | grep -i redis grep -r "redis-server" /etc/rc.local /root/*.sh /home/*/*.sh 2>/dev/null找到后,在启动配置里显式加一行 maxmemory 12884901888(或指向一个含该项的 redis.conf),再重启验证 CONFIG GET maxmemory 是否持久生效。不要只依赖 CONFIG REWRITE。四、淘汰策略(maxmemory-policy)选择4.1 策略对比策略淘汰范围适用场景风险noeviction不淘汰,写报错不允许丢数据写阻塞,不可用allkeys-lru全部 key,按最近最少用纯缓存永久 key 也会被删allkeys-lfu全部 key,按最不常用纯缓存(更优)永久 key 也会被删volatile-lru/lfu仅有 TTL 的 key缓存+持久混放无 TTL 的 key 永不淘汰,可能涨爆volatile-ttl仅即将过期的 key同 volatile同上选型建议:纯缓存实例用 allkeys-lfu(比 LRU 更懂"常用",缓存命中更好);若缓存与不可重建的持久数据混放,应改用 volatile-lfu 并给缓存 key 补 TTL,或干脆把持久数据拆到独立实例。五、OOM 防护(可选兜底,保护关键进程)本节为"最后兜底",非必须;主防线仍是 maxmemory + 不进 Swap。以下只是调整 OOM 优先级(不改内核行为),风险低。万一再次发生内存争抢,确保关键业务进程(数据库 / 应用)不被 OOM killer 误杀,而让 Redis 优先被回收:# 降低关键进程的 OOM 被杀概率(数值越小越安全,-1000 几乎永不被杀) echo -500 > /proc/<关键进程_pid>/oom_score_adj # 提高 redis 被杀优先级(让它先被回收,而不是拖死整机) echo 500 > /proc/<redis_pid>/oom_score_adj # 换成实际 redis PID六、架构层面(长期根治,均为建议、非强制命令)缓存 / 持久数据分离:Redis 只放可重建的缓存;Session、锁、业务状态搬到其他存储或独立实例。服务器图形界面:生产服务器通常不需要图形界面,如确认无用,可禁用其自启动以省内存(不要盲目卸载,避免牵连依赖)。多实例隔离:若多种业务共用一台 Redis,按业务拆实例,单实例故障域更小、上限更好控。七、应急响应 Runbook(若再次假死)不要反复重启:重启会重新加载/重建数据,可能二次冲击。先确认 Swap 状态。快速查看(只读):free -h; swapon --show # 看 Swap 是否打满若 Redis 已无响应且内存失控:可 redis-cli SHUTDOWN NOSAVE(避免写坏 RDB),再按本方案设好 maxmemory 后拉起。拉起后第一时间 CONFIG GET maxmemory + INFO memory 验证上限已生效。八、落地检查清单[ ] 先按【附一】查到本机 redis-cli 真实路径,替换全文命令[ ] 确认缓存实例是否纯缓存(决定 allkeys-lfu 还是 volatile-lfu)[ ] CONFIG SET maxmemory 12884901888(12G,立即生效)[ ] 找到 redis 真实启动入口,把 maxmemory 写进配置/启动参数(持久化)[ ] 切换/确认 maxmemory-policy(纯缓存→allkeys-lfu)[ ] 配置 OOM 优先级,保护关键进程(可选)[ ] 验证:重启 redis 后 CONFIG GET maxmemory 仍为 12G附:命令安全提示命令行用 -a 明文密码会触发告警且密码进 history。建议改用环境变量(把 你的密码 换成真实密码):export REDISCLI_AUTH='你的密码' /usr/local/redis/bin/redis-cli CONFIG GET maxmemory附:检查脚本#!/bin/bash # redis_health_check.sh # 用途:巡检 Redis 内存水位 + 系统 Swap,超标即打印告警(可接邮件/钉钉) # 用法:crontab 每 5 分钟执行一次,输出追加入日志 # */5 * * * * /usr/local/redis/redis_health_check.sh >> /var/log/redis_health.log 2>&1 # ===== 配置区(按需修改)===== # 密码:执行前请换成真实密码(或改用 export REDISCLI_AUTH 方式,避免明文) PASS='你的密码' HOST=127.0.0.1 PORT=6379 # redis-cli 路径:每台服务器不一样,优先用 which 自动查找;找不到再手动改成实际路径 # 也可先手动查询: which redis-cli # ls -l /usr/local/redis/bin/redis-cli 2>/dev/null # ps -ef | grep redis-server # find / -name redis-cli -type f 2>/dev/null | head REDIS_CLI=$(command -v redis-cli 2>/dev/null) if [ -z "$REDIS_CLI" ]; then REDIS_CLI="/usr/local/redis/bin/redis-cli" # 自动找不到时,改成你查到的真实路径 fi TS=$(date '+%Y-%m-%d %H:%M:%S') echo "===== [$TS] Redis 健康巡检 =====" # ---- 1. Redis 内存使用率 ---- USED=$($REDIS_CLI -h $HOST -p $PORT -a "$PASS" INFO memory 2>/dev/null | awk -F: '/^used_memory:/{print $2}' | tr -d '\r') MAX=$($REDIS_CLI -h $HOST -p $PORT -a "$PASS" INFO memory 2>/dev/null | awk -F: '/^maxmemory:/{print $2}' | tr -d '\r') EVI=$($REDIS_CLI -h $HOST -p $PORT -a "$PASS" INFO stats 2>/dev/null | awk -F: '/^evicted_keys:/{print $2}' | tr -d '\r') if [ -n "$MAX" ] && [ "$MAX" -gt 0 ] 2>/dev/null; then RATIO=$(awk "BEGIN{printf \"%.2f\", $USED/$MAX*100}") echo "Redis 内存使用率: ${RATIO}% (used=$USED max=$MAX)" # 超过 85% 逼近 maxmemory,即将触发驱逐 if awk "BEGIN{exit !($RATIO>85)}"; then echo " [告警] 内存使用率大于85%,逼近 maxmemory,即将触发 key 驱逐!" fi else echo " [错误] maxmemory 未设置或为 0 —— Redis 可无限吃内存,存在崩溃风险!" fi echo "累计驱逐 key 数 (evicted_keys): ${EVI:-未知}" # ---- 2. 系统 Swap 使用率 ---- SWAP_TOTAL=$(free | awk '/Swap:/{print $2}') SWAP_USED=$(free | awk '/Swap:/{print $3}') if [ -n "$SWAP_TOTAL" ] && [ "$SWAP_TOTAL" -gt 0 ] 2>/dev/null; then SWAP_RATIO=$(awk "BEGIN{printf \"%.2f\", $SWAP_USED/$SWAP_TOTAL*100}") echo "系统 Swap 使用率: ${SWAP_RATIO}%" if awk "BEGIN{exit !($SWAP_RATIO>50)}"; then echo " [严重] Swap 使用率大于50%,系统已进入危险区,立即排查内存占用!" fi else echo "系统未启用 Swap(或未检测到)—— 无需关注 Swap 水位" fi echo ""
2026年08月21日
0 阅读
0 评论
0 点赞
2026-07-24
Ungoogled Chromium Binaries 离线部署实战指南
Ungoogled Chromium Binaries 离线部署实战指南—— 跨发行版、多架构服务器环境下的"绿色版"精准获取与使用1. 为什么选择 Ungoogled Chromium Binaries?在离线、多发行版(EulerOS / Kylin / Ubuntu)、多版本且混合架构(x86_64 + ARM64)的服务器环境中部署 Chrome,官方 .deb/.rpm 包因对 glibc、NSS、GTK 等系统库的严格版本锁定而完全不可用。Ungoogled Chromium Binaries 是 ungoogled-software/ungoogled-chromium 主仓库官方推荐的预编译二进制分发页面。它专门解决了以下核心痛点:零/低系统依赖:Portable(便携)版本静态链接了大部分运行时库,不绑定特定版本的 glibc,真正实现"解压即用"。双架构全覆盖:同时提供 x86_64 和 aarch64 (ARM64) 构建,完美适配信创鲲鹏/飞腾及传统 Intel/AMD 服务器。去 Google 化:移除了所有 Google 私有服务、追踪器和 API 依赖,符合内网及信创环境的安全合规要求。免 Root 权限:无需系统级安装,普通用户即可运行,避免污染宿主系统环境。⚠️ 安全声明该页面的二进制由社区贡献者构建,非可重现构建(non-reproducible)。若用于高安全合规环境,建议在隔离环境中自行从源码审计构建。对于一般内网服务器自动化、渲染、截图等场景,此方案是当前兼容性最优解。2. 读懂下载页:没有搜索框,如何找到"绿色版"?很多用户首次打开该页面时会困惑:没有搜索框,也没有"绿色版/安装版"的中文标签。这是因为该页面遵循开源社区惯例,按 平台 + 架构 + 构建类型 分类。你需要建立以下概念映射:页面表格中的名称实际含义对应 Windows 概念是否推荐离线多系统环境Portable Linux 64-bit解压后直接运行的 tar.xz 包,自带依赖库✅ 真·绿色版强烈推荐Linux AppImage 64-bit自包含的 .AppImage 单文件✅ 绿色版推荐(仅 x86_64)Portable Linux 64-bit (musl)针对 Alpine/Void 等轻量系统的静态构建✅ 超级绿色版老旧系统兜底Debian/Ubuntu (unportable).deb 包,需 dpkg 安装,强依赖系统库❌ 安装版绝对不要用Fedora/RHEL (unportable).rpm 包,需 rpm 安装,强依赖系统库❌ 安装版绝对不要用💡 核心原则只认准 Portable 和 AppImage 字样。凡是带有 unportable、.deb、.rpm 后缀的,一律跳过。快速定位技巧页面为静态生成,无搜索功能。请使用浏览器 Ctrl+F 搜索以下关键词:x86_64 绿色版 → 搜索 Portable Linux 64-bitARM64 绿色版 → 搜索 Portable Linux 64-bit ARM 或 aarch64自包含单文件 → 搜索 AppImage3. 下载与离线部署全流程第一步:联网机下载访问 Ungoogled Chromium Binaries在表格中找到目标架构对应的 Portable 行,点击版本号链接(如 150.0.7871.128-1),跳转至 GitHub Release 页面。下载对应文件:目标架构文件名示例x86_64ungoogled-chromium-150.0.7871.128-1-linux-portable.tar.xzARM64ungoogled-chromium-150.0.7871.128-1-linux-arm64-portable.tar.xz务必同时下载中文字体(离线服务器无 CJK 字体必然乱码):wget https://github.com/notofonts/noto-cjk/raw/main/Sans/SubsetOTF/SC/NotoSansSC-Regular.otf第二步:离线服务器部署将下载的文件通过 U 盘或内网传输至目标服务器后执行:# 1. 创建目录并解压(无需 root) mkdir -p /opt/chromium tar -xf ungoogled-chromium-*-portable.tar.xz -C /opt/chromium --strip-components=1 # 2. 放置字体 mkdir -p /opt/chromium/fonts cp NotoSansSC-Regular.otf /opt/chromium/fonts/ # 3. 赋予执行权限 chmod +x /opt/chromium/chrome # 4. 验证动态链接库完整性(应全部显示 found 或 static) ldd /opt/chromium/chrome第三步:运行测试/opt/chromium/chrome \ --headless=new \ --no-sandbox \ --disable-gpu \ --disable-dev-shm-usage \ --font-path=/opt/chromium/fonts \ --screenshot=/tmp/test.png \ https://example.com确认 /tmp/test.png 生成且中文渲染正常,即部署成功。4. 多架构统一启动脚本(生产环境推荐)在混合架构集群中,建议封装 wrapper 脚本自动适配,屏蔽底层差异:#!/bin/bash # /usr/local/bin/chrome-headless ARCH=$(uname -m) CHROME_DIR="/opt/chromium" FONT_DIR="${CHROME_DIR}/fonts" case "$ARCH" in x86_64) CHROME_BIN="${CHROME_DIR}/chrome-x86_64" ;; aarch64) CHROME_BIN="${CHROME_DIR}/chrome-aarch64" # ARM64 二进制缺失时回退到容器 if [ ! -f "$CHROME_BIN" ]; then exec docker run --rm \ -v "${FONT_DIR}:/usr/share/fonts/custom:ro" \ zenika/alpine-chrome \ --headless=new --no-sandbox --disable-gpu \ --disable-dev-shm-usage \ --font-path=/usr/share/fonts/custom \ "$@" fi ;; *) echo "Unsupported architecture: $ARCH" >&2 exit 1 ;; esac exec "$CHROME_BIN" \ --headless=new \ --no-sandbox \ --disable-gpu \ --disable-dev-shm-usage \ --font-path="$FONT_DIR" \ "$@"调用方式统一为:chrome-headless --screenshot=/tmp/output.png https://example.com5. 常见问题速查表问题现象根因解决方案GLIBC_2.xx not found宿主机 glibc 版本过低换用 musl Portable 构建,或使用容器方案中文显示方块/乱码缺少 CJK 字体添加 --font-path 指向 Noto Sans SC 或文泉驿字体Out of memory / 崩溃/dev/shm 空间不足必须加 --disable-dev-shm-usageRunning as root without --no-sandboxroot 用户运行加 --no-sandbox(容器内或 root 下必需)ARM64 无可用 Portable 构建社区未覆盖该架构使用 zenika/alpine-chrome ARM64 容器镜像替代ldd 显示大量 not foundPortable 版仍依赖少量系统库安装缺失基础库(如 libnss3),或换用完全静态构建6. 参考链接二进制下载页:https://ungoogled-software.github.io/ungoogled-chromium-binaries/主仓库(源码/补丁):https://github.com/ungoogled-software/ungoogled-chromium容器替代方案:https://hub.docker.com/r/zenika/alpine-chromeCJK 字体下载:https://github.com/notofonts/noto-cjk
2026年07月24日
15 阅读
0 评论
0 点赞
2026-07-17
Nginx平滑升级离线编译与零停机热替换完整手册
Nginx 1.30.4 离线编译与零停机热替换完整手册⚠️ 前置条件确认当前身份:root旧版 Nginx 前缀:/usr/local/nginx编译依赖:gcc、make、pcre-devel、zlib-devel、openssl-devel 等必须已在离线环境中提前安装。若未安装,需先通过 rpm/deb 包离线安装依赖,否则 ./configure 会失败。📥 第一阶段:获取源码与解压1. 下载 Nginx 1.30.4 源码包在有网络的机器上下载后,通过 U盘/SCP 等方式传入服务器 /home/zjgzwyjsadmin/ 目录:# 在联网机器执行示例 wget https://nginx.org/download/nginx-1.30.4.tar.gz2. 解压并进入源码目录cd /home/nginx-1.30.4 tar -zxvf nginx-1.30.4.tar.gz cd nginx-1.30.4路径约定后续所有命令均假设源码位于 /home/nginx-1.30.4。若您实际路径不同,请全局替换。🔧 第二阶段:编译构建(仅编译,不安装)1. 提取旧版编译参数OLD_ARGS= $ (nginx -V 2>&1 | grep "configure arguments:" | sed 's/configure arguments: //') echo "📋 旧版参数: $ OLD_ARGS"2. 配置编译选项# 使用旧版参数确保模块完全兼容 ./configure $ OLD_ARGS3. 编译生成新二进制# 利用多核加速编译,绝不执行 make install! make -j $ (nproc)4. 编译后双重验证(必做)# 验证1:参数一致性(注意 -- 分隔符防止 grep 误解析) ./objs/nginx -V 2>&1 | grep "configure arguments:" | grep -F -- " $ OLD_ARGS" \ && echo "✅ 编译参数一致" || { echo "❌ 参数不一致,停止!"; exit 1; } # 验证2:新二进制能正确解析现有配置 ./objs/nginx -t # 期望输出: syntax is ok / test is successful只有两个验证均通过,才能继续。 若失败,检查 $OLD_ARGS 完整性或重新 make clean && make。🔒 第三阶段:全量备份(不可跳过)BACKUP_TIME= $ (date +%Y%m%d_%H%M%S) NGINX_BIN= $ (which nginx) # 备份二进制 cp " $ NGINX_BIN" " $ {NGINX_BIN}.bak. $ {BACKUP_TIME}" # 备份配置目录 cp -a /usr/local/nginx/conf "/usr/local/nginx/conf.bak. $ {BACKUP_TIME}" echo "✅ 备份完成:" ls -lh " $ {NGINX_BIN}.bak. $ {BACKUP_TIME}" ls -ld "/usr/local/nginx/conf.bak. $ {BACKUP_TIME}"🔄 第四阶段:零停机热替换执行💡 原理:USR2 启动新 Master → 新 Worker 接管新请求 → WINCH 优雅关闭旧 Worker→ QUIT 退出旧 Master。全程无连接中断。# 确保在源码目录下 cd /home/zjgzwyjsadmin/nginx-1.30.4 NGINX_BIN= $ (which nginx) # 步骤1:覆盖二进制(旧进程在内存中运行,不受磁盘影响) cp ./objs/nginx " $ NGINX_BIN" # 步骤2:启动新 Master 进程 kill -USR2 $ (cat /usr/local/nginx/logs/nginx.pid) sleep 3 # 步骤3:确认双 Master 共存(必须看到两行 master) ps aux | grep "[n]ginx: master" # 步骤4:优雅关闭旧 Worker kill -WINCH $ (cat /usr/local/nginx/logs/nginx.pid.oldbin) # 步骤5:业务健康检查(关键决策点!) curl -sI http://localhost | head -3 tail -20 /usr/local/nginx/logs/error.log | grep -E "emerg|crit|alert" # ✅ 正常 → 继续步骤6 # ❌ 异常 → 立即执行下方【紧急回滚预案】 # 步骤6:彻底退出旧 Master kill -QUIT $ (cat /usr/local/nginx/logs/nginx.pid.oldbin) # 步骤7:最终版本确认 nginx -v # 期望输出: nginx version: nginx/1.30.4✅ 第五阶段:升级后验证矩阵检查项命令合格标准版本号nginx -vnginx/1.30.4进程唯一性`ps aux \grep "[n]ginx: master" \wc -l`输出 1配置语法nginx -ttest is successful错误日志tail -20 /usr/local/nginx/logs/error.log无新增 emerg/crit业务响应curl -sI http://localhostHTTP 2xx/3xx监听端口`ss -tlnp \grep nginx`所有预期端口 LISTEN🔙 紧急回滚预案(30秒内恢复)仅在第四阶段步骤5健康检查失败时执行:NGINX_BIN= $ (which nginx) # ⚠️ 将下方时间戳替换为第三阶段输出的实际 BACKUP_TIME BACKUP_TIME="YYYYMMDD_HHMMSS" # 1. 终止新进程组 kill -QUIT $ (cat /usr/local/nginx/logs/nginx.pid) 2>/dev/null # 2. 恢复旧二进制 cp " $ {NGINX_BIN}.bak. $ {BACKUP_TIME}" " $ NGINX_BIN" # 3. 重启旧版本 nginx -t && nginx # 4. 验证回滚成功 nginx -v && curl -sI http://localhost⚠️ Root 环境安全警告SELinux:若启用,覆盖二进制后必须执行 restorecon -v "$NGINX_BIN",否则新 Master 无法绑定端口。WINCH 耐心等待:WebSocket/大文件下载等长连接可能导致旧 Worker 持续数分钟。用 watch -n1 'ps aux | grep "[n]ginx: worker"' 监控,绝不要 kill -9。PID 路径:以上命令假设 PID 在 /usr/local/nginx/logs/nginx.pid。若不同,通过 nginx -V 2>&1 | grep -oP '(?<=--pid-path=)\S+' 获取实际路径并全局替换。操作窗口:尽管零停机,仍建议在业务低峰期执行。离线依赖:若 ./configure 报错缺少库,需在离线环境中提前准备好对应的 devel 包(如 pcre2-devel、zlib-devel、openssl-devel)并通过 rpm -ivh 或 dpkg -i 安装。
2026年07月17日
18 阅读
0 评论
0 点赞
2026-05-20
NGINX 零停机平滑升级全流程实操指南
一、 概述在生产环境下,升级 NGINX 二进制文件通常面临一个挑战:如何升级而不需要停止服务(零停机)?NGINX 通过一套精巧的信号量(Signals)机制实现了平滑升级。其核心原理是:启动一个新的主进程(Master Process)接管监听端口,让旧进程在处理完现有请求后优雅退出,从而实现无缝切换。二、 升级前置准备与环境摸底在升级之前,必须确保新版本的编译参数与当前运行的版本完全一致,否则会导致启动失败或功能缺失。1. 查询当前版本及编译参数# 查看当前版本号 nginx -v # 查看详细编译参数 (极其重要,升级时必须使用相同的参数) nginx -V记录项: 重点记录 configure arguments 之后的所有内容(如 --prefix=/usr/local/nginx)。2. 确认二进制文件路径与 PID# 确认 nginx 可执行文件路径 which nginx # 确认当前运行的主进程 PID ps aux | grep nginx 记录项: 记录 master process 的 PID。3. 配置文件语法检查在任何操作前,确保当前配置文件没有语法错误。nginx -t三、 新版本编译准备核心原则:只编译→→不安装。 严禁直接执行 make install,因为这会覆盖您生产环境的配置文件。1. 下载并解压wget http://nginx.org/download/nginx-x.x.x.tar.gz tar -zxvf nginx-x.x.x.tar.gz cd nginx-x.x.x2. 配置与编译使用第一阶段记录的编译参数进行配置:# 使用之前 nginx -V 记录的参数 ./configure --prefix=/usr/local/nginx [其他参数...] # 编译生成二进制文件 make编译完成后,新的二进制文件位于 objs/nginx。四、 执行平滑升级(核心步骤)步骤 1:二进制文件替换由于 Linux 内核禁止覆盖正在运行的二进制文件(会报 Text file busy),我们必须使用 mv 命令通过改变 inode 的方式进行替换。 # 1. 备份旧文件 cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak # 2. 使用 mv 替换新文件 (绕过 Text file busy) mv objs/nginx /usr/local/nginx/sbin/nginx # 3. (可选) 如果系统中有快捷路径 /usr/local/bin/nginx,请同步更新 cp /usr/local/nginx/sbin/nginx /usr/local/bin/nginx步骤 2:启动新主进程 (USR2)向旧主进程发送 USR2 信号,通知其启动新版本的二进制进程。 kill -USR2 <旧MasterPID> 状态: 此时,旧主进程和新主进程同时存在,它们共同监听端口,但新请求将开始分发给新进程。 步骤 3:优雅停止旧工作进程 (WINCH) 向旧主进程发送 WINCH 信号,通知旧的工作进程(Worker Processes)在处理完当前请求后立即退出。 code Bash kill -WINCH <旧MasterPID> 状态: 此时,所有新流量已全部由新版本进程处理。步骤 4:业务验证(关键环节) 在彻底删除旧版本前,必须进行全方位验证: 本地验证: curl -I http://127.0.0.1:端口 外部验证: telnet IP 端口 或 浏览器访问。 日志验证: tail -f /usr/local/nginx/logs/error.log 检查是否有 [emerg] 报错。 ### 步骤 5:彻底关闭旧主进程 (QUIT) 确认业务运行稳定后,关闭不再需要的旧主进程。 ```text kill -QUIT ``` 五、 异常处理与回滚方案 1. 怎么回滚? 如果在 步骤 3 之后发现新版本运行异常,可以通过以下指令将流量瞬间切回旧版本: code Bash # 向新主进程发送 WINCH 信号,让新 worker 退出 kill -WINCH # 此时流量会自动切回尚未关闭的旧 worker 进程 2. 常见坑点排查 ```text Text file busy: 不要用 cp 覆盖运行中的文件,必须用 mv。 版本显示不一致: 如果 nginx -v 显示旧版而 ps 显示新版,说明 /usr/local/bin/nginx 和 /usr/local/nginx/sbin/nginx 两者不一致,请同步覆盖。 Telnet 不通: 若 curl 内部通但外部不通,请检查防火墙(Firewalld/Security Group)策略,这通常与 NGINX 升级无关,而是网络层波动。 ``` 六、 总结流程图 备份→→编译→→mv替换→→USR2(启动新版)→→WINCH(切流量)→→验证→→QUIT(删旧版)
2026年05月20日
16 阅读
0 评论
0 点赞
2026-01-11
Onlyoffice 文件大小超出了为服务器设置的限制
我的容器名是 myonlyoffice 请修改成自己的容器名一、从docker 容器中下载 /etc/onlyoffice/documentserver/default.jsondocker cp myonlyoffice:/etc/onlyoffice/documentserver/default.json /usr/local/default.json查看 default.json 文件中的 FileConverter"FileConverter": { "converter": { "maxDownloadBytes": 524288000, // 这里要修改 "downloadTimeout": { "connectionAndInactivity": "2m", "wholeCycle": "2m" }, "downloadAttemptMaxCount": 3, "downloadAttemptDelay": 1000, "maxprocesscount": 1, "fontDir": "null", "presentationThemesDir": "null", "x2tPath": "null", "docbuilderPath": "null", "args": "", "spawnOptions": {}, "errorfiles": "", "streamWriterBufferSize": 8388608, "maxRedeliveredCount": 2, "inputLimits": [ { "type": "docx;dotx;docm;dotm", "zip": { "uncompressed": "5000MB", // 修改 "template": "*.xml" } }, { "type": "xlsx;xltx;xlsm;xltm", "zip": { "uncompressed": "1000MB", // 修改 "template": "*.xml" } }, { "type": "pptx;ppsx;potx;pptm;ppsm;potm", "zip": { "uncompressed": "1000MB", // 修改 "template": "*.xml" } } ] } }二、将修改好的配置文件上传到容器中docker cp /usr/local/default.json myonlyoffice:/etc/onlyoffice/documentserver/default.json在重启容器docker restart myonlyoffice三、完成
2026年01月11日
5 阅读
0 评论
0 点赞
2025-11-27
centos8.5更换阿里yum源
1、删除centos8 /etc/yum.repos.d/目录下的所有yum源。cd /etc/yum.repos.d/ && rm -rf *repo 2、下载 CentOS-Base.repo 到 /etc/yum.repos.d/。curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo3、 运行 yum makecache 生成缓存。yum makecache
2025年11月27日
1 阅读
0 评论
0 点赞
2025-11-26
在联网机器上下载所有 RPM 包并在离线机器上安装所有软件
在联网机器上下载所有 RPM 包并在离线机器上安装所有软件下载1. 安装下载工具sudo dnf install -y dnf-utils2. 创建目录mkdir ~/openEuler-20.03-LTS-SP4 && cd ~/openEuler-20.03-LTS-SP43. 启用必要仓库(关键!)欧拉openEuler系统sudo dnf config-manager --set-enabled everything EPOLCentos8.5系统sudo dnf config-manager --set-enabled base AppStream3. 下载dnf download --resolve \ nginx \ redis \ docker \ java-1.8.0-openjdk \ java-1.8.0-openjdk-devel4. 验证ls -l *.rpm | wc -l5. 打包tar -czvf openEuler-24.03-LTS-x86_64.tar.gz *.rpm安装:1. 解压 RPM 包cd /tmp tar -xzvf offline-apps.tar.gz dnf deplist java-1.8.0-openjdk2. 安装所有软件(自动解决依赖顺序)sudo dnf install -y *.rpm# (如果系统只有 yum,没有 dnf,可用:) # sudo yum localinstall -y *.rpm3. 启动并启用服务sudo systemctl enable --now nginx sudo systemctl enable --now redis sudo systemctl enable --now docker4. 验证安装结果nginx -v # 应显示版本 redis-cli --version # 应显示版本 docker --version # 应显示版本 java -version # 应显示 OpenJDK 17 curl http://localhost # 应看到 nginx 欢迎页
2025年11月26日
13 阅读
0 评论
0 点赞
2025-10-15
nginx安装顺序之:麒麟V10系统安装nginx
1.查询并删掉旧包 rpm -qa | grep perl #查看当前以及安装的perl开头的安装包 rpm -e --nodeps perl-devel-5.28.0-434.ky10.x86_64 # 卸载命令 rpm -e --nodeps perl-libs-5.28.0-434.ky10.x86_64 # 卸载命令 rpm -e --nodeps perl-5.28.0-434.ky10.x86_64 # 卸载命令2.按顺序安装插件离线包 rpm -ivh perl-libs-5.28.3-3.p01.ky10.x86_64.rpm --nodeps --force rpm -ivh perl-devel-5.28.3-3.p01.ky10.x86_64.rpm --nodeps --force rpm -ivh perl-5.28.3-3.p01.ky10.x86_64.rpm --nodeps –force3.按照顺序安装 rpm -ivh gd-2.2.5-6.ky10.x86_64.rpm --nodeps --force rpm -ivh gperftools-libs-2.7-7.ky10.x86_64.rpm --nodeps --force rpm -ivh nginx-filesystem-1.16.1-9.p01.ky10.noarch.rpm --nodeps --force rpm -ivh nginx-mod-http-image-filter-1.16.1-9.p01.ky10.x86_64.rpm --nodeps --force rpm -ivh nginx-mod-http-perl-1.16.1-9.p01.ky10.x86_64.rpm --nodeps --force rpm -ivh nginx-mod-http-xslt-filter-1.16.1-9.p01.ky10.x86_64.rpm --nodeps --force rpm -ivh nginx-mod-mail-1.16.1-9.p01.ky10.x86_64.rpm --nodeps --force rpm -ivh nginx-all-modules-1.16.1-9.p01.ky10.noarch.rpm --nodeps --force rpm -ivh nginx-1.16.1-9.p01.ky10.x86_64.rpm --nodeps --force rpm -ivh nginx-mod-stream-1.16.1-9.p01.ky10.x86_64.rpm --nodeps –force4.启动nginxsystemctl start nginx.service #启动服务5.可能出现的问题使用rpm -ivh安装驱动包过程中提示“/sbin/ldconfig: /usr/ib64/ibLLVM-7.so is not a symbolic link”用root用户cd /usr/lib64 In sf libLLVM-7.0.0.so libLLVM-7.so6.下载地址https://update.cs2c.com.cn/NS/V10/V10SP2/os/adv/lic/base/x86_64/Packages/
2025年10月15日
4 阅读
0 评论
0 点赞
1
2
...
11