使用 Certbot 更新并统一多子域名 SSL 证书实践总结

在服务器上使用 HTTPS 是保证安全访问的必备措施,而 Let’s Encrypt 提供了免费的 SSL 证书,结合 Certbot 工具可以非常方便地申请和更新证书。在实际场景中,往往不仅需要为主域名配置证书,还要同时支持多个子域名,比如: python-replCopyEditwww.domain.com mail.domain.com app1.domain.com app2.domain.com … 以下是一次完整实践记录,总结关键步骤与注意事项。 💡 证书现状查看 首先查看现有证书及已包含的域名: bashCopyEditcertbot certificates 输出示例: yamlCopyEditFound the following certs: Certificate Name: domain.com Domains: domain.com mail.domain.com www.domain.com Expiry Date: 2025-09-22 21:50:18+00:00 (VALID: 82 days) Certificate Path: /etc/letsencrypt/live/domain.com/fullchain.pem Private Key Path: /etc/letsencrypt/live/domain.com/privkey.pem 🔄 重新申请并添加更多子域名 为了将所有需要的子域名统一到一个证书中,执行以下命令(使用 …

Nginx 多服务反向代理方案对比与最佳实践

在自建服务器或私有云环境中,常常需要将多个 Web 服务整合到同一个公网 IP 上对外提供访问。常见的服务如 Rocket.Chat、Nextcloud、Proxmox VE、Mailcow 等,如何设计访问方式成为系统架构中一项重要决策。本文详细总结三种典型方案,并进行全面对比,帮助选择最适合的部署方式。 💡 三种典型方案 方案一:不同端口访问 思路每个服务占用一个独立的端口,用户通过域名加端口号访问,如: 优点 缺点 方案二:同域名 + 路径前缀 思路多个服务共享同一个域名,通过路径前缀区分,如: 优点 缺点 方案三:子域名 思路为每个服务配置一个独立子域名,如: 优点 缺点 ⚖️ 总体对比总结 不同端口访问 同域名 + 路径前缀 子域名 域名数量 1 1 多个子域名 端口体验 差(需手动输入) 好 好 兼容性 中 差 最好 用户体验 差 一般 最佳 配置复杂度 最简单 复杂 …

ClamAV 警告信息解析:cli_scanxz: decompress file size exceeds limits

在使用 ClamAV 进行文件扫描时,日志中经常会出现如下警告信息: pgsqlCopyEditLibClamAV Warning: cli_scanxz: decompress file size exceeds limits – only scanning 105906176 bytes 这条信息可以分解为以下几个部分: 产生原因 ClamAV 为了防止扫描过程中消耗过多系统资源,默认对解压后文件的大小设定了限制。这主要是出于性能和安全考虑,避免在面对恶意构造的巨型压缩文件时导致系统资源耗尽。 是否需要调整 若需要完整扫描所有内容,可在 clamd.conf 配置文件中通过修改如下参数进行调整: confCopyEditMaxFileSize 500M MaxScanSize 1G 需要注意,增加这些值将导致更高的内存和 CPU 占用,并可能导致扫描耗时显著增加。实际应用中,通常只在对安全性要求极高的环境或需要扫描大文件的情况下才会考虑修改。 总结 当 ClamAV 遇到解压后超出大小限制的文件时,会发出警告但继续进行扫描,仅扫描指定限制内的部分数据。这种机制是一种平衡性能与安全性的默认保护措施。在大多数场景下,可保持默认配置,无需额外干预。

使用 ClamAV 进行 Linux 系统全盘扫描并保存日志

在 Linux 系统中,如果需要定期对整台机器进行恶意软件(病毒、木马等)扫描,ClamAV 是一个常用的免费工具。以下介绍如何进行全盘扫描,并将完整扫描结果保存为带时间戳的日志文件,方便后续查看或归档。 基础扫描命令 ClamAV 的 clamscan 工具支持递归扫描,最基本的写法如下: bashCopyEditclamscan -r / 但这样会扫描系统中的所有文件,包括 /proc、/sys、/dev 等虚拟或设备目录,这些目录不适合扫描,会产生大量错误信息。 排除系统特殊目录 为了避免扫描无意义的系统伪文件系统,可以使用 –exclude-dir 参数排除这些目录,例如: bashCopyEdit–exclude-dir=/proc –exclude-dir=/sys –exclude-dir=/dev 此外,如果还需要排除其他目录(比如存放大文件或备份的目录),也可继续添加 –exclude-dir 参数。 自动保存扫描日志 为了后期分析结果,通常需要将扫描输出同时保存为日志文件。可以结合 tee 命令实现: bashCopyEditclamscan -r –bell –exclude-dir=/proc –exclude-dir=/sys –exclude-dir=/dev / | tee /root/clamav_scan_$(date +%Y%m%d_%H%M%S).log 命令说明 是否支持「增量扫描」 ClamAV 的 clamscan 不会自动跳过已扫描过的文件,每次执行都会重新完整扫描。它不包含「增量扫描」或「缓存机制」,也不会记住上次扫描状态。 如果需要仅扫描新增或修改过的文件,需要额外实现文件变更检测(例如使用 inotify)或定期针对指定文件夹进行局部扫描。 总结 💡 …

使用 rkhunter 执行系统 Rootkit 检查及配置 SSH 安全

近期在对 Linux 系统进行安全加固时,执行了 rootkit 检查工具 rkhunter,并同步完善了 SSH 配置。以下为详细流程总结。 🕵️ rkhunter 检查流程 在执行 rkhunter –check 时,默认会在每个阶段提示「按 Enter 继续」,需要手动操作,无法一次性跑完。为实现自动化,可使用以下命令: sudo rkhunter –check –skip-keypress 如果需要将输出保存为日志文件,可追加 tee: sudo rkhunter –check –skip-keypress | tee /root/rkhunter_check_$(date +%Y%m%d_%H%M%S).log 💾 更新文件属性数据库 执行属性文件数据库更新时,常用命令如下: udo rkhunter –propupd 默认会提示确认,可使用 -y 参数自动同意: sudo rkhunter –propupd -y 🔒 SSH 配置安全性调整 rkhunter 在检测 SSH …

邮件评分优化与检测流程总结

近期针对自建域名邮件发送,进行了一次详细的评分检测与优化测试,目标是尽可能提高邮件送达率并符合各大邮件服务商的安全及合规要求。 🎯 背景 测试中使用了一个新注册的 .top 域名,通过 mail-tester.com 检测,初步得分为 8/10,整体表现较好,但仍有部分扣分项需要分析和理解。 ✅ 已完成的安全配置 ⚠️ 主要被扣分的原因 💬 内容优化尝试 ✅ 最终结论 💡 建议 🔗 参考

使用反向代理实现 Apache 服务的域名切换与 HTTPS 加密(含 Certbot 与 FRP 配置)🌐

在构建个人服务时,我们常常需要将 Apache 提供的本地服务通过公网访问,并启用 HTTPS 进行加密通信。本文记录了如何: 🧱 架构概览 本次部署采用了以下结构: arduinoCopyEdit公网用户 ↓ VPS(运行 FRP Server,负责公网端口) ↓ FRP 客户端 → 反向代理服务器(Nginx + Certbot,TLS 终结) ↓ 内网 Apache 主机,仅提供 HTTP 服务(80端口) 🛰️ FRP 配置 FRP 客户端(运行在反代服务器) 配置如下(已脱敏): iniCopyEdit[web_https] type = tcp local_ip = 127.0.0.1 local_port = 443 remote_port = xxxx # 例如 VPS 映射的 …

一个HTTP请求的曲折经历

原文: https://www.neroht.com/article-detail/18 一个HTTP请求的曲折经历 nero发布于 2020-04-30 09:04:73 写在前面 作为程序员的我们每天都在和网络请求打交道,而前端程序员接触的最多的就是HTTP请求。平时工作中,处理网络请求之类的操作是最多的了。但是一个请求从客户端发出到被服务端处理、再回送响应,再被客户端接收这一个闭环的底层细节可能并没有深究过,本篇文章是我的一篇读书笔记,总结出来恰好涉及到了这一过程,分享出来希望可以对大家有所启发。 文中某些点如果表述有误,欢迎指出来,不胜感激。 从一个经典的面试题说起 从输入URL到页面展现的过程 输入URL后,会先进行域名解析。优先查找本地host文件有无对应的IP地址,没有的话去本地DNS服务器查找,还不行的话,本地DNS服务器会去找根DNS服务器要一个域服务器的地址进行查询,域服务器将要查询的域名的解析服务器地址返回给本地DNS,本地DNS去这里查询就OK了。 浏览器拿到服务器的IP地址后,会向它发送HTTP请求。HTTP请求经由一层层的处理、封装、发出之后,最终经由网络到达服务器,建立TCP/IP连接,服务器接收到请求并开始处理。 服务器构建响应,再经由一层层的处理、封装、发出后,到达客户端,浏览器处理请求。 浏览器开始渲染页面,解析HTML,构建render树,根据render树的节点和CSS的对应关系,进行布局,绘制页面。 这4个步骤包含了一个HTTP请求的完整生命周期,文章着重介绍第2步和第3步,也就是请求是如何在两个物理端点之间进行通信的。数据的发出和接收必然会经历一些处理、解析的过程,这些过程在系统的不同层次进行。 分层 一个HTTP请求从源端发出到在终端接收的处理过程都是要经过以下四层。其中每一层都有各自的协议。 我们先来理解一下协议是什么,协议是经过约定,双方共同承认,并且需要共同遵守的规则。上面的每一层,都有各自的协议,协议的执行者是通信链路两端内的对应层。每一层通过协议来理解数据,并进行处理。 上图中只举例出了最常见的协议,实际上每一层都有细分的协议: 应用层:应用程序负责将数据以相应规则(协议)进行包装,发给传输层 HTTP:超文本传输协议 FTP:文件传输协议 SMTP:简单邮件传送协议 SNMP:简单网络管理协议 传输层:负责将应用层传过来的数据进行分组,为确保终端接收数据的顺序和完整性,会对每个分组进行标记,交给网络层 TCP:传输控制协议 UDP:用户数据协议 网络层:负责将传输层发来的数据分组发送到目标终端 IP:网际协议 ICMP:Internet互联网控制报文协议 IGMP:Internet组管理协议 链路层:为网络层发送和接收数据单元 ARP:地址解析协议 RARP:逆地址解析协议 封装和分用 数据在经过每一层的时候都要被对应的协议包装,到达终端的时候,要一层一层的解包。这两个过程叫封装和分用。 发送时,用户数据被HTTP封装为报文,每一层会将上层传过来的报文作为本层的数据块,并添加自己的首部,其中包含了协议标识,这一整体作为本层报文向下传递。 接收时,数据自下而上流动,经过每一层时被去掉报文首部,根据报文标识确定正确的上层协议,最终到应用层被应用程序处理。 封装 源端发送HTTP报文时,报文会以数据流的形式通过一条已经打开的TCP连接按序传输,TCP收到数据流后会将其分割成小的数据块,每个小块被添加的TCP首部与数据块共同组成了TCP分组,分组经由网络层发送,网络层遵循IP协议,当收到分组发送请求后,会将分组其放入IP数据报,填充报头,将数据报发经由链路层发送出去。 这一过程经过每层的时候都会被增加一些首部信息,有时还需要增加尾部信息,每一层都会把数据封装到各自的报文中, 并在报文首部添加协议标识,这个过程叫封装。 分用 终端接收到一个以太网数据帧时,数据自底层向上流动,去掉发送时各层协议加上的报文首部,每层协议都要检查报文首部的协议标识,从而确定上层协议,保证数据被正确处理,这个过程叫分用。 终端从链路层接收到数据请求后,进入网络层对数据进行解析,交给给传输层,校验分组顺序和完整性,从数据块中取出数据,得到HTTP报文,交给应用层进行处理。这个过程会逐层剥离报头还原数据。 逐层分析 我们已经知道,数据是从源端自上而下到终端自下而上被一层层处理的,现在就来看一下每层都做了什么事情。 HTTP HTTP属于应用层,用户触发交互所产生的行为数据和服务端对此的响应都由它封装成HTTP报文,再交由下层协议进行处理。报文的作用是客户端与服务端沟通的载体,双方都要遵循统一规则对信息进行处理,这一规则称为HTTP。 …

nginx.service: Failed to parse PID from file /var/run/nginx.pid: Invalid argument bugs

原文:https://medium.com/@parsher/nginx-service-failed-to-parse-pid-from-file-var-run-nginx-pid-invalid-argument-bugs-fda95eeeda73 # Fix for Nginx PID problem in Ubuntu 16.04 in an EC2 instance sudo systemctl stop nginx sudo mkdir /etc/systemd/system/nginx.service.d # build the file in root where no sudo is needed printf “[Service]\nExecStartPost=/bin/sleep 0.1\n” > override.conf sudo cp override.conf /etc/systemd/system/nginx.service.d/override.conf sudo systemctl daemon-reload sudo systemctl start nginx