0%

Nginx 防盗链配置:通过 Referer 验证保护资源

防盗链是防止其他网站非法引用本网站资源(如图片、视频、CSS)的技术手段,Nginx 通过valid_referers指令检查请求的Referer头,识别非法来源并拒绝访问,从而节省带宽、保护知识产权。本文详细讲解 Nginx 防盗链的配置方法、参数含义及实战案例。

防盗链原理:基于 Referer 头验证

  • Referer 头:客户端请求资源时,HTTP 协议会在请求头中包含Referer字段,记录请求的来源页面 URL(如https://example.com/page.html引用了https://yourdomain.com/image.jpg,则Refererhttps://example.com/page.html)。
  • 防盗链逻辑:Nginx 通过valid_referers定义 “合法来源”,若请求的Referer不在合法列表中,则判定为盗链,返回 403 Forbidden。

基础配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
listen 80;
server_name yourdomain.com;
root /var/www;

# 对图片、视频等静态资源启用防盗链
location ~* \.(jpg|jpeg|png|gif|mp4|css|js)$ {
# 定义合法的Referer来源
valid_referers
none # 允许无Referer的请求(如直接在浏览器输入URL访问)
blocked # 允许Referer被防火墙或代理隐藏的请求
server_names # 允许来自本域名的请求(yourdomain.com及其子域名)
*.yourdomain.com # 允许指定域名及其子域名
*.trusted-site.com; # 允许信任的第三方网站

# 若Referer不合法,则返回403
if ($invalid_referer) {
return 403;
# 可选:返回自定义图片(如“盗链必究”提示图)
# rewrite ^/ /forbidden.png last;
}
}
}

valid_referers参数详解

valid_referers用于定义 “合法来源”,支持多种格式:

阅读全文 »

Elasticsearch 事务日志(Translog):数据安全与持久化的核心保障

Elasticsearch 基于 Lucene 构建,而 Lucene 采用 “延迟写” 策略(数据先存内存,再批量刷盘)提升性能,但存在内存数据丢失风险。事务日志(Translog) 作为 Elasticsearch 的核心组件,通过记录所有未持久化的操作,确保在节点故障时数据可恢复,是数据安全的关键保障。

事务日志的核心作用

  1. 数据恢复:记录所有未写入磁盘的索引操作(新增、更新、删除),节点重启后可通过 Translog 恢复内存中丢失的数据。
  2. 持久化辅助:配合 Lucene 的段(Segment)机制,平衡写入性能与数据安全性。
  3. 原子性保障:确保每个操作要么完全成功(写入 Translog 并同步到段),要么失败时可回滚。

数据写入与 Translog 交互流程

数据从写入到持久化的完整流程如下,Translog 贯穿始终:

初始写入:内存缓冲 + Translog 记录

  • 文档写入时,先进入 Memory Buffer(内存缓冲区,JVM 堆内存)
  • 同时,操作被追加到 Translog(磁盘文件),确保即使节点崩溃,操作也不会丢失。
  • 此时状态:数据不可搜索(未进入倒排索引),但已通过 Translog 持久化,安全性得到保障。

准实时可见:Refresh 操作

默认每隔 index.refresh_interval(1 秒)触发 Refresh

阅读全文 »

Elasticsearch 二次评分(Rescore):优化顶部结果相关性

在 Elasticsearch 中,当基础查询返回的顶部文档相关性不够理想时,可通过二次评分(Rescore) 机制对前 N 个文档重新计算得分,进一步优化排序。这种方式既能保证查询效率(仅处理顶部文档),又能提升关键结果的准确性,适用于需要精细调整排序的场景(如搜索引擎结果页 Top 10 优化)。

二次评分的核心原理

二次评分的工作流程如下:

  1. 基础查询:执行初始查询(如 matchbool),获取匹配文档并按得分排序。
  2. 筛选顶部文档:从每个分片的结果中选取前 window_size 个文档(默认取 from + size 个)。
  3. 重新评分:对这些顶部文档应用二次评分查询(如 function_scorescript_score),计算新得分。
  4. 合并结果:根据配置的评分模式(如求和、相乘)合并原始得分与二次评分,得到最终排序。

基础语法与示例

基本结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
GET index/_search
{
"query": { // 1. 基础查询
"match": { "title": "elasticsearch" }
},
"rescore": { // 2. 二次评分配置
"window_size": 50, // 每个分片取前50个文档进行二次评分
"query": {
"rescore_query": { // 二次评分查询
"function_score": {
"script_score": {
"script": "doc['publishTime'].value / 1000000" // 以发布时间作为加分项
}
}
},
"query_weight": 0.8, // 原始得分权重
"rescore_query_weight": 0.2 // 二次评分权重
}
},
"size": 10 // 最终返回10条结果
}

得分计算逻辑

最终得分由原始查询得分和二次评分按权重合并:

阅读全文 »

Elasticsearch 中的查询(Query)与过滤(Filter):核心区别与应用场景

在 Elasticsearch 中,查询(Query)和过滤(Filter)是两种核心的数据筛选机制,虽然都能实现结果筛选,但在用途、性能和实现方式上有本质区别。理解二者的差异是优化查询性能和相关性的关键。

核心区别

维度 查询(Query) 过滤(Filter)
核心目标 筛选匹配的文档,并计算相关性得分(_score) 仅筛选匹配的文档,不计算得分
性能特点 消耗 CPU 资源(需计算得分),无缓存 不消耗额外 CPU,结果可被缓存(Filter Cache)
适用场景 全文检索、相关性排序(如 “搜索关键词”) 精确匹配、范围筛选(如 “价格> 100”“状态 = 激活”)

查询(Query):注重相关性

查询操作不仅会筛选出符合条件的文档,还会根据文档与查询条件的匹配程度计算相关性得分_score),得分越高,文档与查询的相关性越强。

常用查询类型

  • 全文查询matchmatch_phrase(用于文本字段,会分词)。
  • 术语查询termterms(用于精确匹配,如关键词、数字)。
  • 复合查询booldis_max(组合多个查询条件)。

示例:匹配 “elasticsearch 教程” 并计算得分

1
2
3
4
5
6
7
8
GET books/_search
{
"query": {
"match": {
"title": "elasticsearch 教程" // 全文匹配,计算得分
}
}
}
阅读全文 »