后端网络通信【免费下载链接】jsproxyAn online proxy based on ServiceWorker项目地址https://gitcode.com/gh_mirrors/js/jsproxy点击查看免费下载jsproxy 在线代理长期运行后Nginx 的访问日志proxy.log会持续增长若不加以控制将占用大量磁盘空间并拖慢磁盘 IO。本指南以仓库log-svc目录下的日志备份服务为核心完整讲解其工作原理、启动方式、备份与压缩流程并结合 svc.sh、backup.sh、run.sh 等源码给出可复用的运维方案。读完本文你将掌握一套无需 root、不中断服务、可自定义阈值的 Nginx 日志轮转与压缩实战套路并理解其与log.conf、nginx.conf日志配置之间的联动关系。一、背景与定位为什么需要日志备份服务Nginx 长时间运行是常态但日志文件不会自动轮转。以 jsproxy 为例nginx.conf 中开启了access_log logs/proxy.log log_proxy buffer64k flush1s;即所有代理请求都会写入proxy.log高流量下文件会快速膨胀。log-svc目录下的日志备份服务即nginx 日志备份服务解决了这一问题该服务定期检查日志文件大小达到阈值后将日志备份到backup目录并压缩同时通知 Nginx 重新打开日志文件实现不重启服务的平滑轮转。从仓库文件布局看该服务由三个部分组成文件作用log-svc/svc.sh守护调度脚本循环调用备份逻辑log-svc/backup.sh核心备份与压缩脚本log-svc/backup/存放临时备份日志的目录二、整体架构调度循环 备份脚本 nginx 封装整个服务的运行逻辑可以概括为一条链路svc.sh循环调度每 60 秒一次 └─ backup.sh检查日志大小 ├─ 达到阈值mv 移走日志 → touch 新建日志 → run.sh reopen 通知 nginx 重开 └─ 未达阈值直接退出 └─ 压缩阶段nice -n 19 xz 压缩 backup 目录下的 *.log其中run.sh是仓库根目录下的 Nginx 封装脚本用于在任意位置向 Nginx 发送控制信号是backup.sh实现日志重开的关键依赖这一点会在下文详细展开。在已部署的服务器上目录约定为服务目录/home/jsproxy/server日志目录/home/jsproxy/server/nginx/logs备份目录/home/jsproxy/server/log-svc/backup上述路径定义在 backup.sh 的变量声明中部署时若目录结构不同需要同步调整。三、启动方式一条命令、一个普通用户原文档给出的启动方式非常简单./svc.sh 即后台运行守护脚本无需其他初始化动作。文档同时强调使用jsproxy用户运行无需root。这一点是有实际意义的日志文件由jsproxy用户启动的 Nginx 进程创建属主为jsproxy因此普通用户即可读写备份目录位于用户主目录下的server/log-svc/backup同样对jsproxy用户可写整个流程只用到了mv、touch、stat、xz等普通命令并通过nginx -s reopen发送信号而非修改系统级配置全程不需要提升权限。需要说明的是./svc.sh 适用于前台会话中的临时启动生产环境更稳妥的做法是借助 systemd、supervisor 等进程管理器托管或改用 crontab 调度详见下文第四节。四、svc.sh60 秒一次的守护循环svc.sh 的全部逻辑非常精简#!/usr/bin/env bash # 功能定时调用 backup.sh echo log svc running CUR_DIR$(cd dirname $0 pwd) # 也可用 crontab while true do $CUR_DIR/backup.sh sleep 60 done要点分析CUR_DIR的解析cd \dirname $0 pwd将脚本自身所在目录解析为绝对路径确保后续调用backup.sh 时不依赖当前工作目录这也是脚本可以在任意位置启动的前提。轮询式调度while truesleep 60构成 60 秒周期的轮询。由于backup.sh内部自带大小阈值判断未达阈值立即退出60 秒的粒度足够及时响应日志增长又不会造成额外负担。crontab 替代方案脚本注释明确提示也可用 crontab。在部署时可将备份逻辑交由 crontab 托管例如每分钟执行一次* * * * * /home/jsproxy/server/log-svc/backup.sh效果等价且无需常驻进程。选择哪种方式取决于运维习惯轮询方式便于统一管理常驻进程crontab 方式则更轻量、天然支持日志查看。五、backup.sh备份与压缩的核心逻辑backup.sh 是整个服务的核心其完整流程可分为路径与阈值定义 → 错误日志清理 → 主日志轮转 → 压缩四个阶段。5.1 路径与阈值定义SVC_DIR/home/jsproxy/server LOG_DIR$SVC_DIR/nginx/logs DST_DIR$SVC_DIR/log-svc/backup LOG_FILE$LOG_DIR/proxy.log LOG_SIZE$(( 256 * 1024 * 1024 )) ERR_FILE$LOG_DIR/error.log ERR_SIZE$(( 256 * 1024 * 1024 ))这里的核心参数变量含义取值/计算LOG_DIRNginx 日志目录/home/jsproxy/server/nginx/logsDST_DIR备份目标目录/home/jsproxy/server/log-svc/backupLOG_FILE主代理访问日志proxy.log使用log_proxy格式LOG_SIZE触发备份的阈值256 MiB256 * 1024 * 1024字节ERR_FILE错误日志error.logERR_SIZE触发清理的阈值256 MiB两个阈值均为 256 MiB可通过直接修改脚本中LOG_SIZE/ERR_SIZE的数值调整策略。例如低流量环境可下调至 64 MiB 以控制磁盘占用高流量环境可上调以减少轮转频率。5.2 error.log 的清理策略# error.log 达到 ERR_SIZE开始备份目前只清理 errsize$(stat --printf%s $ERR_FILE) if (( $errsize $ERR_SIZE )); then echo $ERR_FILE fi值得注意的设计取舍error.log 目前只做清空echo $ERR_FILE并不归档备份。注释中目前只清理表明这是一处有意的简化——错误日志通常用于排障量级远小于访问日志清空即可释放空间。若业务需要保留错误日志历史可参照下文proxy.log的轮转方式将清空改为移动 重开。脚本使用stat --printf%s读取文件字节数注意这种方式是直接对文件系统元数据的查询无需读取文件内容性能开销极小。5.3 proxy.log 的轮转流程mv → touch → reopen当proxy.log达到 256 MiB 阈值后执行关键的轮转三步logtime$(date %Y-%m-%d-%H-%M-%S) # # 先移走日志文件然后创建新的日志文件通知 nginx 重新打开 # mv $LOG_FILE $DST_DIR/$logtime.log touch $LOG_FILE $SVC_DIR/run.sh reopen sleep 1逐步拆解mv移走旧日志将proxy.log重命名为backup/2026-09-25-00-30-00.log这类带时间戳的文件名date %Y-%m-%d-%H-%M-%S精确到秒避免同一分钟内多次轮转导致文件覆盖。此时旧日志从logs目录消失。touch新建空文件立即在logs/proxy.log位置创建同名的空文件保证 Nginx 后续写入有落点。run.sh reopen通知 Nginx 重开由于 Nginx 在启动时已打开旧文件描述符仅靠mvtouch不会让它切换到新文件必须发送信号让 Nginx 重新打开日志文件详见第六节。sleep 1等待 Nginx 完成文件重开与缓冲落盘避免紧接着的压缩阶段与正在写入的句柄冲突。整个流程不重启 Nginx 进程对在线服务零中断这正是平滑轮转的核心价值。5.4 xz 压缩与 nice 优先级# # 日志压缩 # 根据实际情况调整策略在不影响系统的前提下充分利用剩余 CPU # echo compress ... nice -n 19 xz $DST_DIR/*.log echo done压缩阶段的两个细节值得展开nice -n 19降低优先级nice值范围 -201919 是普通进程中的最低优先级。日志压缩属于后台任务使用最低优先级可保证压缩过程不抢占 Nginx 等核心服务的 CPU这正是脚本注释在不影响系统的前提下充分利用剩余 CPU的实现手段。xz批量压缩xzLZMA2 算法压缩率高适合文本型访问日志。命令作用于$DST_DIR/*.log下所有未压缩的日志文件而非仅处理刚轮转的那一个天然支持漏备份场景的补压也具备幂等性。压缩完成后.log原文件被替换为.log.xz磁盘占用大幅下降。需要说明的是脚本中压缩阶段与轮转阶段都在同一个backup.sh进程内串行执行先完成轮转再统一压缩。压缩对象覆盖备份目录下所有*.log因此即使某次轮转后进程异常退出下次运行时也会把遗留的未压缩日志一并处理掉。六、日志重开机制run.sh 与 nginx -s reopenbackup.sh调用的$SVC_DIR/run.sh reopen是轮转能否成功的关键一环。仓库根目录下的 run.sh 是对 Nginx 命令的封装# # 该脚本封装 nginx 调用可在任意位置执行 # # 启动./run.sh # 重启./run.sh -s reload # 关闭./run.sh -s quit # NGX_BIN~/openresty/nginx/sbin/nginx CUR_DIR$(cd dirname $0 pwd) if [ $1 ]; then PARAM-s $1 fi $NGX_BIN -c $CUR_DIR/nginx.conf -p $CUR_DIR/nginx $PARAM原理拆解脚本将传入的参数拼为-s 参数形式。因此run.sh reopen实际执行的是nginx -s reopen -c nginx.conf -p nginx。nginx -s reopen是 Nginx 标准的日志重开信号它会通知 master 进程重新打开所有日志文件。由于我们已提前touch出新的proxy.logNginx 重开后即写入新文件旧文件则停留在备份目录等待压缩。-c指定配置文件、-p指定 prefix 目录保证信号操作针对 jsproxy 自己的 Nginx 实例且日志路径logs/proxy.log与 nginx.conf 中的access_log定义一致。该脚本同时提供了./run.sh启动、./run.sh -s reload重载、./run.sh -s quit退出三种用法可在任意位置调用。从 nginx.conf 可以看到主日志配置access_log logs/proxy.log log_proxy buffer64k flush1s;buffer64k flush1s表示日志先写入 64 KB 缓冲区、每 1 秒刷盘一次。这意味着轮转时机不必与请求完全对齐——sleep 1之后缓冲区内尚未刷盘的少量日志会由 Nginx 在重开后继续写入新文件最多损失约 1 秒的日志数据这在运维实践中是可接受的。七、日志内容被轮转的 proxy.log 里有什么了解被备份日志的内容有助于设定合理的轮转策略与后续分析。proxy.log使用的log_proxy格式定义在仓库根目录 log.conf采用 Tab 分隔、02作为格式版本前缀格式变化时递增以便解析核心字段包括字段含义$time_iso8601请求时间ISO 8601$_origin_id请求源别名对应 allowed-sites.conf 中定义的站点映射$_ver前端配置版本定义于www/conf.js$remote_addr用户 IP当前未考虑 XFF$_level/$_switched节点切换实验相关状态$upstream_cache_status上游缓存命中状态$request_time/$request_length/$bytes_sent请求耗时与流量统计$request_method/$_url/$status方法、代理 URL、状态码$_bodyhash返回内容 SHA256 摘要用于统计重复内容由 lua/http-body-hash.lua 在响应阶段计算$upstream_http_access_control_allow_origin统计acao *的站点用于维护可直连列表$http_user_agent/$_ref/$_mode/$_typeUA、referer、请求 mode、destination 属性由于这些字段多由 Lua 模块如 lua/http-dec-req-hdr.lua、lua/http-enc-res-hdr.lua在请求/响应阶段写入 Nginx 变量日志备份服务的价值不仅在于节省磁盘还在于长期保留这些高价值的结构化访问数据为流量分析、重复内容统计、节点质量评估提供原始素材。仓库根目录还有一份 www.conf 定义了独立于代理日志的站点访问日志logs/access.log log_www以及 nginx.conf 中通过include log.conf引入的日志格式定义部署时可一并纳入轮转评估范围。八、运维注意事项与实践建议8.1 备份目录是临时仓库backup/README.md 明确说明该目录存放临时备份的日志。这意味着backup目录并非日志的最终归档地而是轮转与压缩的中转站。运维上建议定期将backup/*.log.xz转移至独立归档区或对象存储避免目录无限膨胀结合磁盘容量评估轮转阈值与清理周期例如保留最近 N 天的压缩日志后自动清理。8.2 压缩策略按实际调整脚本注释指出压缩策略根据实际情况调整nice -n 19是保守选择若服务器 CPU 有富余可适当提高优先级如nice -n 10以缩短压缩耗时若日志量极大也可改用gzip/zstd等速度更快的压缩工具或限制压缩并发数。核心原则是压缩不能影响代理服务质量。8.3 从轮询改为 crontab如前所述svc.sh 注释提示了 crontab 方案。相比while true sleep 60的常驻进程crontab 每分钟触发一次backup.sh更简单且天然具备进程级隔离——某次执行失败不会拖垮其他任务。两者任选其一即可不要同时启用以免重复执行。8.4 权限与路径一致性脚本依赖的部署路径是/home/jsproxy/server若实际部署目录不同务必同步修改 backup.sh 中的SVC_DIR与 run.sh 中的NGX_BIN。同时确保jsproxy用户对nginx/logs与log-svc/backup两个目录均有写权限——这正是文档强调无需 root的前提条件。九、小结本文围绕 log-svc/README.md 展开完整梳理了 jsproxy 日志备份服务的四个层次启动方式./svc.sh 、jsproxy 普通用户运行、调度机制svc.sh 的 60 秒循环与 crontab 替代、备份流程backup.sh 的阈值判断、mv touch reopen平滑轮转、nice -n 19 xz低优先级压缩以及底层联动run.sh 对nginx -s reopen的封装、log.conf 定义的日志字段。这套方案不依赖 root、不重启服务、以最低 CPU 优先级完成压缩是一套可直接落地复用的 Nginx 日志运维模板将其与 nginx.conf 的日志缓冲配置、Lua 模块写入的日志字段配合使用即可构建完整的日志采集、归档与分析链路。赞分享后端网络通信【免费下载链接】jsproxyAn online proxy based on ServiceWorker项目地址https://gitcode.com/gh_mirrors/js/jsproxy点击查看免费下载相关推荐Nginx UI日志轮转配置高效管理服务器日志的终极指南Nginx UI日志轮转配置高效管理服务器日志的终极指南 日志轮转是服务器管理中的关键环节Nginx UI提供了简单易用的日志轮转配置功能帮助您自动管理N后端前端运维MCP 服务EOSIO节点日志轮转配置Logrotate与日志压缩策略EOSIO节点日志轮转配置Logrotate与日志压缩策略 日志管理的重要性 节点日志是EOSIO区块链节点运行状态的重要记录包含交易处理、区块同步、共识过区块链Apache APISIX log-rotate 插件实战指南日志自动轮转、按大小切割与 gzip 压缩Apache APISIX log rotate 插件实战指南日志自动轮转、按大小切割与 gzip 压缩 本文以 Apache APISIX 内置的 logAPI网关后端云原生微服务创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考