当前位置: 首页 > news >正文

Nginx 使用 Keepalived 搭建 nginx 高可用

一、环境准备

两台装有 nginx 的 CentOS 虚拟机。

[root@nginx1 ~]# echo "192.168.40.81 say Hello" > /usr/local/nginx/html/index.html
[root@nginx2 ~]# echo "192.168.40.82 say Hello" > /usr/local/nginx/html/index.html

二、原理

Keepalived 为我们后端服务器组虚拟出一组 VIP,该 VIP 只能由优先级最高的一台服务器持有。客户端访问,就只访问 VIP。

当主服务器挂掉之后,Keepalived 自动帮我们把 VIP 漂移到 BACKUP 服务器。以此来保证服务的高可用。

Keepalived 通过检测服务器上的 Keepalived 进程的存活状态,来判断服务器是否存活。

三、安装

1)安装 keepalived

# 在 nginx1 安装 keepalived
[root@nginx1 ~]# yum install -y keepalived
# 在 nginx2 安装 keepalived
[root@nginx2 ~]# yum install -y keepalived

  2)配置

使用 yum 安装后配置文件在 /etc/keepalived/keepalived.conf

# 备份 nginx1 keepalived 配置文件
[root@nginx1 keepalived]# cp keepalived.conf keepalived.conf.bak
# 备份 nginx2 keepalived 配置文件
[root@nginx2 keepalived]# cp keepalived.conf keepalived.conf.bak
  •  nginx1 上 keepalived.conf:
! Configuration File for keepalivedglobal_defs {router_id lb1
}vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.40.80}
}
  • global_defs:全局配置标识。
  • router_id:路由器标识,一般不用改,也可以写成每个主机自己的主机名。
  • vrrp_instance:一个 vrrp_instance 就是定义一个虚拟路由器的,VI_1 是实例名称。
  • state:指定 keepalived 的角色,MASTER 表示此主机是主服务器,BACKUP 表示此主机是备服务器。
  • interface:指定检测网络的网卡接口。就比如下图的 ens33。

  • virtual_router_id:虚拟路由标识,数字形式,同一个 VRRP 实例使用唯一的标识,即在同一个 vrrp_instance下,master 和 backup 必须一致。
  • priority:节点优先级,数字越大表示节点的优先级越高,在一个 VRRP 实例下,MASTER 的优先级必须要比 BACKUP 高,不然就会切换角色。
  • advert_int:用于设定 MASTER 与 BACKUP 之间同步检查的时间间隔,单位为秒。
  • auth_type:预共享密钥认证,同一个虚拟路由器的 keepalived 节点必须一样。
  • auth_pass:设置密钥。
  • virtual_ipaddress:设置虚拟IP地址,可以设置多种形式:
  • 10.0.0.100 不指定网卡,默认为 eth0,注意:不指定/prefix,默认为/32;
  • 10.0.0.101/24 dev eth1 指定 VIP 的网卡;
  • 10.0.0.102/24 dev eth2 label eth2:1 指定 VIP 的网卡 label。
  • nginx2 上 keepalived.conf:
! Configuration File for keepalivedglobal_defs {router_id lb2
}vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 51priority 90advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.40.80}
}

3)启动

# 启动 MASTER 服务器 keepalived 并设置为开机自启动
[root@nginx1 keepalived]# systemctl enable keepalived --now
[root@nginx1 keepalived]# systemctl status keepalived
[root@nginx1 keepalived]# ip a

会发现 MASTER 服务器多出了 192.168.40.80 这个IP。

# 启动 BACKUP 服务器 keepalived 并设置为开机自启动
[root@nginx2 keepalived]# systemctl enable keepalived --now
[root@nginx2 keepalived]# systemctl status keepalived
[root@nginx2 keepalived]# ip a

备份服务器并不持有 VIP。

 4)访问

此时访问 VIP,请求都是被打到 MASTER 上的 nginx。

 5)故障测试

# 停掉 MASTER
[root@nginx1 ~]# init 0

 此时 VIP 飘移到 BACKUP。

6)重启 MASTER

 此时 VIP 又漂移回来了。

四、定制脚本

Keepalived 通过检测服务器上的 Keepalived 进程的存活状态,来判断服务器是否存活。

但如果此时,我们的服务器没有挂,但是我们希望 Keepalived 保活的服务(比如 nginx)挂了,由于 Keepalived 进程没有挂,这个时候,Keepalived 是不会帮我们主备切换的。

# 停掉 MASTER
[root@nginx1 ~]# systemctl stop nginx

 这个时候 VIP 并没有迁移走。这个时候,我们就得自己写一个脚本,去检测 nginx 存活状态,如果 nginx 挂了,人为杀死 keepalived 进程,让 keepalived 帮我们主备切换。

先重新启动 nginx

[root@nginx1 ~]# systemctl start nginx

1)修改 keepalived.conf

  •  nginx1 上 keepalived.onf:
! Configuration File for keepalivedglobal_defs {router_id lb1
}vrrp_script check_nginx {script "pgrep nginx"interval 2weight 50  # 当检查失败时,优先级会减去这个值fall 2rise 2
}vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.40.80}track_script {check_nginx} 
}
  •  nginx2 上 keepalived.conf:
! Configuration File for keepalivedglobal_defs {router_id lb2
}vrrp_script check_nginx {script "pgrep nginx"interval 2weight 50  # 当检查失败时,优先级会减去这个值fall 2rise 2
}vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 51priority 90advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.40.80}track_script {check_nginx} 
}

2)重启 keepalived

[root@nginx1 keepalived]# sudo systemctl restart keepalived[root@nginx2 keepalived]# sudo systemctl restart keepalived

3)停掉 MASTER 

# 停掉 MASTER
[root@nginx1 ~]# systemctl stop nginx

 VIP 这次终于被迁移到 BACKUP。

五、应用场景

Keepalived + Nginx 的组合有很多应用场景:

  • 搭建 Nacos 高可用集群
  • 搭建 K8S Ingress 入口

相关文章:

Nginx 使用 Keepalived 搭建 nginx 高可用

一、环境准备 两台装有 nginx 的 CentOS 虚拟机。 [rootnginx1 ~]# echo "192.168.40.81 say Hello" > /usr/local/nginx/html/index.html [rootnginx2 ~]# echo "192.168.40.82 say Hello" > /usr/local/nginx/html/index.html 二、原理 Keepaliv…...

A1062 PAT甲级JAVA题解 Talent and Virtue

About 900 years ago, a Chinese philosopher Sima Guang wrote a history book in which he talked about peoples talent and virtue. According to his theory, a man being outstanding in both talent and virtue must be a "sage(圣人)"…...

数据指标和数据标签

数据指标和数据标签是数据管理与分析中的两个重要概念,它们在用途、形式和应用场景上有显著区别。以下是两者的详细对比: 1. 核心定义 维度数据指标(Data Metrics)数据标签(Data Tags/Labels)定义量化衡量…...

常见的排序算法(Java版)简单易懂好上手!!

排序 “排序”顾名思义就是把乱序的变成有序的,就像我们玩斗地主这种牌类游戏时,我们拿到牌都会将牌给排序一下,更好的在对局中方便思考和观察,我们排序算法也亦是如此。 文章目录 排序一、冒泡排序二、选择排序三、插入排序四、…...

用统计零花钱的例子解释:Shuffle 是啥?

举个栗子 🌰:统计全班同学的零花钱总和 假设你是班长,全班有 4个小组,每个小组记录了自己的零花钱情况: 第1组:张三(5元)、李四(3元)、张三(2元) 第2组:王五(4元)、张三(1元)、李四(2元) …...

Kafka topic 中的 partition 数据倾斜问题

在 Kafka 中,如果一个 Topic 有多个 Partition,但这些 Partition 中的消息数量或流量分布不均衡,就会出现 数据倾斜(Data Skew) 的问题。 ✅ 什么是数据倾斜? 数据倾斜指的是: 某些 Partitio…...

Python基础总结(十)之函数

Python函数 函数是Python中也是非常重要的,函数是带名字的代码块,用于完成具体的工作。要执行函数定义的特定任务,可调用该函数。 一、函数的定义 函数的定义要使用def关键字,def后面紧跟函数名,缩进的为函数的代码…...

macOS 15 (Sequoia) 解除Gatekeeper限制

macOS 15 (Sequoia) 解除Gatekeeper限制指南 问题描述 在macOS 15中执行sudo spctl --global-disable命令后,系统提示: Globally disabling the assessment system needs to be confirmed in System Settings 但隐私与安全性界面未显示"任何来源&…...

【Flask开发踩坑实录】pip 安装报错:“No matching distribution found” 的根本原因及解决方案!

关键词:pip 报错、镜像源问题、flask-socketio、Python开发环境、安装失败 作者:未名编程 | 更新时间:2025.05.11 📌 引言:一场莫名其妙的 pip 安装失败 最近在开发一个基于 Flask 的图像检索网站时&#…...

50.辐射抗扰RS和传导抗扰CS测试环境和干扰特征分析

辐射抗扰RS和传到抗扰CS测试环境和干扰特征分析 1. 辐射抗扰RS2. 传导抗扰CS 1. 辐射抗扰RS 辐射抗扰RS考察对外界电磁场干扰得抗扰能力,测试频段为80MHz~2000MHz,用1KHz得正弦波进行调幅,在电波暗室内进行。测试标准:IEC 61000-…...

零基础玩转sqlmap - 从入门到摸清数据库

sqlmap 包下载链接:https://pan.quark.cn/s/a6ab2586f77e 基本操作 最简单的用法:sqlmap -u "网址" - 直接测试这个网址有没有SQL注入漏洞 带参数的测试:如果网址后面有参数,比如 id1,sqlmap会自动检测 指…...

AI面经总结-试读

写在前面 该面经于2022年秋招上岸后耗时一个半月整理完毕,目前涵盖Python、基础理论、分类与聚类、降维、支持向量机SVM、贝叶斯|决策树、KNN、Boosting&Bagging、回归、代价函数与损失函数、激活函数、优化函数、正则优化、初始化与归一化、卷积、池化、传统图…...

python打卡day22@浙大疏锦行

复习日 仔细回顾一下之前21天的内容,没跟上进度的同学补一下进度。 作业: 自行学习参考如何使用kaggle平台,写下使用注意点,并对下述比赛提交代码 一、数据预处理 import pandas as pd import numpy as np import matplo…...

网络安全设备配置与管理-实验5-p150虚拟防火墙配置

实验5-p150虚拟防火墙配置 做不出来可以把项目删掉再新建。 实验六多加几步配置静态路由表就行。 文章目录 实验5-p150虚拟防火墙配置1. 实验目的2. 实验任务3. 实验设备4. 实验拓扑图和设备接口5. 实验命令与步骤1. 连线与配置2. 实验验证 思考题 1. 实验目的 通过该实验掌握…...

数值运算的误差估计

数值运算的误差估计 设两个近似数 x 1 ∗ x_1^* x1∗​与 x 2 ∗ x_2^* x2∗​的误差限分别为 ε ( x 1 ∗ ) \varepsilon(x_{1}^{*}) ε(x1∗​)和 ε ( x 2 ∗ ) \varepsilon(x_{2}^{*}) ε(x2∗​) 误差限满足一下运算法则: 和差运算的误差限: 设 y …...

HCIP-BGP实验一

一:拓扑图 二:需求分析: 保证R1-R5的环回地址相互能够通讯。 分析; 1.IP的配置 2.R2-R4完成IGP配置,配置OSPF 3.完成BGP配置。 4.优化配置,包括下一跳的选择,IBGP对等体建邻的IP地址。 三…...

linux内核pinctrl/gpio子系统驱动笔记

目录 一、简单介绍二、主要源码文件和目录gpio子系统pinctrl子系统两个子系统之间的关系设备树例子 三、主要的数据结构gpio子系统pinctrl子系统 四、驱动初始化流程五、难点说明 一、简单介绍 GPIO子系统: Linux GPIO子系统是Linux内核中负责处理GPIO(通用输入输出…...

Qt—多线程基础

一、QThread 1.为什么使用多线程 在默认情况下,Qt使用的是单线程,当你启动一个 Qt 应用程序时,它会运行在一个单一的主线程(也被称为 GUI 线程)中。这个主线程负责处理所有的 GUI 事件和界面渲染。 但在一些其他情况下…...

HTML5表格语法格式详解

HTML5 表格的基本结构 HTML5 表格由 <table> 标签定义&#xff0c;表格中的每一行由 <tr> 标签定义&#xff0c;表头单元格由 <th> 标签定义&#xff0c;数据单元格由 <td> 标签定义。表格的基本结构如下&#xff1a; <table><tr><th…...

《Go小技巧易错点100例》第三十三篇

​ Validator自定义校验规则 Go语言中广泛使用的validator库支持通过结构体标签定义校验规则。当内置规则无法满足需求时&#xff0c;我们可以轻松扩展自定义校验逻辑。 示例场景&#xff1a;验证用户年龄是否成年&#xff08;≥18岁&#xff09; type User struct {Age in…...

Spring AI(3)——Chat Memory

Chat Memory介绍 大型语言模型&#xff08;LLM&#xff09;是无状态的&#xff0c;这意味着它们不保留关于以前互动的信息。为了解决这个问题&#xff0c;Spring AI提供了Chat Memory&#xff08;聊天记忆&#xff09;功能。通过Chat Memory&#xff0c;用户可以实现在与LLM的…...

双向循环神经网络(Bi-RNN)详解

双向循环神经网络(Bidirectional Recurrent Neural Network, Bi-RNN)是一种能够同时利用序列数据过去和未来信息的循环神经网络架构&#xff0c;在许多序列建模任务中表现出色。 1. Bi-RNN基本概念 1.1 核心思想 Bi-RNN通过组合两个独立的RNN层来工作&#xff1a; 前向RNN&…...

【Bluedroid】HID DEVICE 连接的源码分析

本文分析Android Bluetooth协议栈中HID device设备连接流程的完整实现,从应用层接口到协议栈底层的交互细节。通过关键函数(如connect()、BTA_HdConnect()、HID_DevConnect()等)的代码解析,重点关注btif、bta、HID协议栈三层的协同机制,揭示BTA_HD_CONN_STATE_EVT事件传递…...

第二十一周:项目开发中遇到的相关问题(二)

本周接着介绍本次新闻项目中遇到的一些问题。首先谈谈Controller层中的请求路径问题&#xff08;RequestMapping&#xff09;,RequestMapping注解是Spring框架中用于处理HTTP请求映射的核心注解&#xff0c;它可以将HTTP请求映射到具体的控制器方法上。 1.关于它的基本作用&…...

深度解析大模型学习率:优化策略与挑战

大模型超参数Learning Rate的深度学习 学习率(Learning Rate)是机器学习和深度学习中最核心的超参数之一,尤其在训练大规模语言模型(LLMs)时,其设置直接影响模型的收敛速度、训练稳定性及最终性能。以下从多维度详细解析学习率的定义、作用、挑战及优化策略。 一、学习率…...

云计算-容器云-KubeVirt 运维

KubeVirt 运维&#xff1a;创建 VM 使用提供的镜像在 kubevirt 命名空间下创建一台 VM&#xff0c;名称为 exam&#xff0c;指定 VM 的内存、CPU、网卡和磁盘等配置。 [rootk8s-master-node1 ~]# kubectl explain kubevirt.spec. --recursive |grep useuseEmulation <boo…...

C++内存管理详解

目录 1.C/C中的内存 2.C内存管理 2.1C语言内存管理 2.2new和delete 2.2.1概念及定义 2.2.2自定义类型内存管理 2.2.3 delete与delete[ ] 1.C/C中的内存 在C/C中编译器会对不同的代码进行内存分配&#xff0c;给代码的内存区主要分为栈区、堆区、数据段(静态区)、代码段(…...

二叉搜索树讲解

1. 二叉搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一颗空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 1. 若它的左子树不为空&#xff0c;则左子树上的所有结点的值都小于等于根节点的值。 2. 若它的右子树不为空&#xff0c;则右子树上的所有结…...

MySQL 索引设计宝典:原理、原则与实战案例深度解析

目录 前言第一章&#xff1a;索引设计的基础原则 (知其然&#xff0c;更要知其所以然)第二章&#xff1a;实战案例&#xff1a;电商订单系统的索引设计第三章&#xff1a;索引设计的实践流程总结结语 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜…...

如何租用服务器并通过ssh连接远程服务器终端

这里我使用的是智算云扉 没有打广告 但确实很便宜 还有二十小时免费额度 链接如下 注册之后 租用新实例 选择操作系统 选择显卡型号 点击租用 选择计费方式 选择镜像 如果跑深度学习的话 就选项目对应的torch版本 没有的话 就创建纯净的cuda 自己安装 点击创建实例 创建之后 …...

TikTok 账号运营干货:AI 驱动优化

TikTok 账号运营是一项需要全方位精心雕琢的工作。首先&#xff0c;账号资料的打造至关重要&#xff0c;务必保证完整且富有吸引力。头像要清晰醒目&#xff0c;能够直观传达账号的核心特色&#xff1b;昵称需简洁易记&#xff0c;方便用户快速识别与记忆&#xff1b;简介则要精…...

Redis 分布式锁

什么是分布式锁 在一个分布式的系统中, 也会涉及到多个节点访问同一个公共资源的情况. 此时就需要通过 锁 来做互斥控制, 避免出现类似于 "线程安全" 的问题 而 java 的 synchronized 或者 C 的 std::mutex, 这样的锁都是只能在当前进程中生效, 在分布式的这种多个进…...

Redis爆肝总结

一、基础 1.介绍 本质上是一个Key-Value类型的内存数据库&#xff0c;数据的加载在内存当中进行操作&#xff0c;定期通过异步操作把数据库数据flush到硬盘上进行保存。 速度快的根本原因 纯内存操作&#xff0c;性能非常出色&#xff0c;每秒可以处理超过10万次读写操作&a…...

Qt模块化架构设计教程 -- 轻松上手插件开发

概述 在软件开发领域,随着项目的增长和需求的变化,保持代码的可维护性和扩展性变得尤为重要。一个有效的解决方案是采用模块化架构,尤其是利用插件系统来增强应用的功能性和灵活性。Qt框架提供了一套强大的插件机制,可以帮助开发者轻松实现这种架构。 模块化与插件系统 模…...

[项目总结] 抽奖系统项目技术应用总结

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

【运维】基于Python打造分布式系统日志聚合与分析利器

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在分布式系统中,日志数据分散在多个节点,管理和分析变得复杂。本文详细介绍如何基于Python开发一个日志聚合与分析工具,结合Logstash和F…...

MySql(基础)

表名建议用 反引号 包裹&#xff08;尤其是表名包含特殊字符或保留字时&#xff09;&#xff0c;但如果表名是普通字符串&#xff08;如 user&#xff09;&#xff0c;可以省略。 注释&#xff08;COMMENT 姓名&#xff09; 数据库 1.查看数据库&#xff1a;show databases…...

怎样选择成长股 读书笔记(一)

文章目录 第一章 成长型投资的困惑一、市场不可预测性的本质困惑二、成长股的筛选悖论三、管理层评估的认知盲区四、长期持有与估值波动的博弈五、实践中的认知升级路径总结&#xff1a;破解困惑的行动框架 第二章 如何阅读应计制利润表一、应计制利润表的本质与核心原则1. 权责…...

系统思考:个人与团队成长

四年前&#xff0c;我交付的系统思考项目&#xff0c;今天学员的反馈依然深深触动了我。 我常常感叹&#xff0c;系统思考不仅仅是一场培训&#xff0c;更像是一场持续的“修炼”。在这条修炼之路上&#xff0c;最珍贵的&#xff0c;便是有志同道合的伙伴们一路同行&#xff0…...

并行发起http请求

1. 使用 axios Promise.all <template><input type"file" multiple change"handleFileUpload" /> </template><script> import axios from axios;export default {methods: {async handleFileUpload(event) {const files event…...

【数据结构入门训练DAY-31】组合的输出

本文介绍了如何使用深度优先搜索&#xff08;DFS&#xff09;算法解决数的组合问题。题目要求从1到n的自然数中选取r个数&#xff0c;输出所有可能的组合&#xff0c;并按字典顺序排列。文章详细描述了解题思路&#xff0c;包括建立数组存储数字、使用DFS递归处理候选数、以及如…...

leetcode0815. 公交路线-hard

1 题目&#xff1a; 公交路线 官方标定难度&#xff1a;难 给你一个数组 routes &#xff0c;表示一系列公交线路&#xff0c;其中每个 routes[i] 表示一条公交线路&#xff0c;第 i 辆公交车将会在上面循环行驶。 例如&#xff0c;路线 routes[0] [1, 5, 7] 表示第 0 辆公…...

花朵识别系统Python+深度学习+卷积神经网络算法+TensorFlow+人工智能

一、介绍 花朵识别系统。本系统采用Python作为主要编程语言&#xff0c;基于TensorFlow搭建ResNet50卷积神经网络算法模型&#xff0c;并基于前期收集到的5种常见的花朵数据集&#xff08;向日葵、玫瑰、蒲公英、郁金香、菊花&#xff09;进行处理后进行模型训练&#xff0c;最…...

LLM 论文精读(四)LLM Post-Training: A Deep Dive into Reasoning Large Language Models

这是一篇2025年发表在arxiv中的LLM领域论文&#xff0c;是一篇非常全面的综述类论文&#xff0c;介绍了当前主流的强化学习方法在LLM上的应用&#xff0c;文章内容比较长&#xff0c;但建议LLM方面的从业人员反复认真阅读。 写在最前面 为了方便你的阅读&#xff0c;以下几点的…...

网址为 http://xxx:xxxx/的网页可能暂时无法连接,或者它已永久性地移动到了新网址

这是由于浏览器默认的非安全端口所导致的&#xff0c;所谓非安全端口&#xff0c;就是浏览器出于安全问题&#xff0c;会禁止一些网络浏览向外的端口。 避免使用6000,6666这样的端口 6000-7000有很多都不行&#xff0c;所以尽量避免使用这个区间 还有在云服务器中&#xff0c…...

【C++】16.继承

C三大特性&#xff1a;封装&#xff0c;继承&#xff0c;多态 在前面的章节中&#xff0c;我们讲过了封装&#xff0c;也就是通过类和访问修饰符来进行封装。 接下来我们就来认识一下新的特性——继承 1. 继承的概念及定义 1.1 继承的概念 继承(inheritance)机制是面向对…...

LlamaIndex 第七篇 结构化数据提取

大型语言模型&#xff08;LLMs&#xff09;在数据理解方面表现出色&#xff0c;这也促成了它们最重要的应用场景之一&#xff1a;能够将常规的人类语言&#xff08;我们称之为非结构化数据&#xff09;转化为特定的、规范的、可被计算机程序处理的格式。我们将这一过程的输出称…...

PHP API安全设计四要素:构建坚不可摧的接口防护体系

引言&#xff1a;API安全的重要性 在当今前后端分离和微服务架构盛行的时代&#xff0c;API已成为系统间通信的核心枢纽。然而&#xff0c;不安全的API可能导致&#xff1a; 数据泄露&#xff1a;敏感信息被非法获取篡改风险&#xff1a;传输数据被中间人修改重放攻击&#x…...

英语16种时态

时态应用场合格式例子一般现在时表示经常、反复发生的动作&#xff0c;客观事实或普遍真理主语 动词原形&#xff08;第三人称单数作主语时动词加 -s/-es&#xff09;The sun rises in the east.一般过去时表示过去某个时间发生的动作或存在的状态主语 动词的过去式I visited…...

使用 goaccess 分析 nginx 访问日志

介绍 goaccess 是一个在本地解析日志的工具, 可以直接在命令行终端环境中使用 TUI 界面查看分析结果, 也可以导出为更加丰富的 HTML 页面. 官网: https://goaccess.io/ 下载安装 常见的 Linux 包管理器中都包含了 goaccess, 直接安装就行. 以 Ubuntu 为例: sudo apt instal…...