0%

CentOS 服务开机自启配置全指南

在 CentOS 系统中,配置服务开机自启是系统管理的重要任务,确保关键服务在系统重启后能自动运行。本文将详细介绍两种主要配置方法:chkconfig 工具和 /etc/rc.local 文件,以及服务的日常管理命令。

使用 chkconfig 管理开机自启

chkconfig 是 CentOS 中传统的服务管理工具,主要用于管理 /etc/init.d/ 目录下的系统服务脚本,支持设置不同运行级别下的自启状态。

chkconfig 基本要求

要使用 chkconfig 管理服务,该服务必须满足:

  • /etc/init.d/ 目录下存在对应的启动脚本
  • 脚本中包含 chkconfig 注释块(指定默认运行级别和优先级)

检查服务脚本是否存在:

1
2
3
ls /etc/init.d/服务名
# 示例:检查 httpd 服务脚本
ls /etc/init.d/httpd

chkconfig 核心命令

添加服务到 chkconfig 管理
阅读全文 »

日志框架全解析:从接口到实现的完整指南

在 Java 开发中,日志是系统调试、问题排查和运行监控的核心工具。日志框架主要分为日志接口(门面)日志实现两类,前者提供统一的 API,后者负责具体的日志输出逻辑。合理选择和搭配日志框架,能在不修改业务代码的前提下灵活切换日志实现,显著提升系统的可维护性。本文将详细解析主流日志框架的分类、特点及集成方式。

日志框架的核心分类

日志框架的设计遵循门面模式(Facade Pattern):日志接口定义统一的日志操作规范,日志实现负责具体的日志输出(如控制台、文件、数据库等)。这种分离让业务代码依赖接口而非具体实现,便于后期切换日志组件。

1. 日志接口(门面)

日志接口本身不实现日志功能,仅定义一套通用的日志操作 API(如debug()info()error()等),主流接口有两个:commons-logging(JCL)slf4j

(1)commons-logging(JCL,Apache Commons Logging)
  • 特点:Apache 推出的日志门面,采用动态加载机制(运行时通过配置文件指定日志实现)。

  • 依赖:

    1
    2
    3
    4
    5
    <dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version> <!-- 稳定版本 -->
    </dependency>
  • 配置方式:需通过commons-logging.properties指定日志实现:

阅读全文 »

Redis 命令解析流程:以 SET 命令为例

Redis 对命令的解析和执行是其核心功能之一,涉及协议解析、参数处理、命令路由等多个环节。本文以 SET 命令为例,详细解析 Redis 如何接收、解析并执行命令。

命令解析的整体流程

Redis 处理客户端命令的流程可概括为:
接收命令数据 → 协议解析 → 填充 client 结构体 → 路由到对应命令函数 → 执行命令 → 返回结果

其中,client 结构体是贯穿全程的核心载体,记录了命令的参数、客户端状态、连接信息等关键数据。

client 结构体:命令解析的核心载体

client 结构体是 Redis 描述客户端连接和命令请求的核心数据结构,与命令解析相关的关键字段如下:

字段名 作用
argc 命令参数的数量(包含命令名本身)。例如 SET key value 中,argc=3
argv 命令参数数组(robj* 类型,robj 是 Redis 通用对象结构)。argv[0] 为命令名(如 "SET"),argv[1...] 为命令参数(如 "key""value")。
querybuf 接收客户端命令的缓冲区(sds 类型,动态字符串),存储未解析的原始命令数据。
qb_pos querybuf 中已解析的位置,用于增量解析命令。
cmd 指向当前执行的命令结构体(redisCommand 类型),包含命令的处理函数、参数个数限制等元信息。

SET 命令解析:从代码看细节

setCommand 函数为例,解析 Redis 如何处理 SET 命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void setCommand(client *c) {
robj *expire = NULL; // 过期时间对象(如 EX 30 中的 30)
int unit = UNIT_SECONDS; // 时间单位(秒/毫秒,默认秒)
int flags = OBJ_NO_FLAGS; // 命令标志(如 NX、XX 等选项)

// 解析扩展参数(如 EX、PX、NX、XX 等)
if (parseExtendedStringArgumentsOrReply(c,&flags,&unit,&expire,COMMAND_SET) != C_OK) {
return; // 解析失败,返回错误
}

// 对 value 进行编码优化(如转为整数编码,节省内存)
c->argv[2] = tryObjectEncoding(c->argv[2]);

// 调用通用设置函数执行核心逻辑
setGenericCommand(c,flags,c->argv[1],c->argv[2],expire,unit,NULL,NULL);
}

步骤 1:解析扩展参数(parseExtendedStringArgumentsOrReply

SET 命令支持丰富的扩展选项(如 SET key value EX 30 NX),该函数的作用是解析这些选项:

阅读全文 »

Servlet 接口详解:Java Web 开发的基石

Servlet 是 Java Web 技术的核心组件,负责处理客户端请求并生成动态响应。它由 Servlet 容器管理,遵循标准化的生命周期,是构建 Java Web 应用的基础。本文将从 Servlet 的核心概念、接口方法、生命周期、配置方式及相关对象等方面,全面解析 Servlet 技术。

Servlet 与 Servlet 容器

1. 什么是 Servlet?

Servlet 是运行在 Web 服务器中的 Java 类,用于处理客户端(如浏览器)的 HTTP 请求并生成动态内容。它具有以下特点:

  • 平台无关:基于 Java 技术,可在任何支持 Java 的 Web 服务器上运行;
  • 由容器管理:生命周期(创建、初始化、服务、销毁)完全由 Servlet 容器控制;
  • 动态内容生成:通过接收请求参数、访问数据库等方式,生成个性化响应。

2. 什么是 Servlet 容器?

Servlet 容器是 Web 服务器(如 Tomcat、Jetty)的一部分,负责与 Servlet 交互并管理其生命周期。其核心功能包括:

  • 加载和实例化 Servlet 类;
  • 调用 Servlet 的生命周期方法(initservicedestroy);
  • 处理 HTTP 请求与响应的封装(将底层 TCP 数据转换为 HttpServletRequest/HttpServletResponse 对象);
  • 管理 Servlet 之间的共享资源(如 ServletContext)。

Servlet 接口核心方法

javax.servlet.Servlet 接口定义了 Servlet 与容器交互的标准协议,包含 5 个核心方法:

阅读全文 »

Nginx 日志配置详解:访问日志、错误日志与日志切割

Nginx 的日志系统是监控服务状态、排查问题的核心工具,主要分为访问日志(access_log)错误日志(error_log)。本文详细讲解日志的配置方法、格式自定义、级别设置及日志切割方案,帮助高效管理日志数据。

访问日志(access_log):记录客户端请求细节

访问日志用于记录客户端的每一次请求,包括请求来源、路径、响应状态等信息,是分析用户行为、排查接口问题的关键依据。

基础配置语法

1
2
3
4
5
6
7
8
9
10
# 完整语法(可省略可选参数)
access_log path [format [buffer=size] [gzip=level] [flush=time] [if=condition]];

# 示例:在server块中启用访问日志
server {
listen 80;
server_name example.com;
# 日志路径为/var/log/nginx/example.access.log,使用main格式
access_log /var/log/nginx/example.access.log main;
}

参数说明

  • path:日志文件路径(必填),如/var/log/nginx/access.log
  • format:日志格式名称(需通过log_format定义,默认使用combined格式);
  • buffer=size:日志写入缓存大小(默认 64k),减少磁盘 IO 次数;
  • gzip=level:日志写入前压缩(1-9 级,级别越高压缩率越高但速度越慢);
  • flush=time:缓存过期时间(如5s),超时后强制写入磁盘;
  • if=condition:条件判断(如if=$request_method=POST),满足条件才写入日志。

自定义日志格式(log_format)

通过log_format可定义个性化日志格式,灵活记录所需字段。语法如下:

阅读全文 »