利用Nginx日志进行防盗链主要涉及到分析访问日志,识别非法访问请求,并采取相应的措施阻止这些请求。以下是一些步骤和建议:
首先,你需要定期检查Nginx的访问日志(通常位于/var/log/nginx/access.log
)。日志文件中包含了所有访问网站的请求信息,包括IP地址、请求的资源、HTTP状态码等。
防盗链通常具有以下特征:
Referer
字段,且该字段的值不是你的网站域名。你可以使用Nginx的valid_referers
指令来实现基本的防盗链功能。以下是一个示例配置:
server {
listen 80;
server_name example.com;
location /protected/ {
valid_referers none blocked server_names example.com;
if ($invalid_referer) {
return 403 "Forbidden";
}
# 其他配置
}
}
在这个配置中:
valid_referers none blocked server_names example.com;
表示允许的引用来源包括没有引用来源、被阻止的引用来源以及指定的域名。if ($invalid_referer)
判断引用来源是否无效,如果无效则返回403 Forbidden状态码。Nginx有一些第三方模块可以帮助更精细地控制防盗链,例如ngx_http_referer_module
和ngx_http_geoip_module
。这些模块可以让你根据引用来源、地理位置等信息进行更复杂的防盗链策略。
对于更复杂的防盗链需求,你可以编写脚本来定期分析Nginx日志,识别异常访问模式,并自动更新Nginx配置或采取其他措施。例如,你可以使用Python、Shell脚本等工具来处理日志文件。
设置监控系统(如Prometheus、Grafana)来实时监控网站的访问情况,特别是防盗链相关的指标。当检测到异常访问时,及时发送报警通知。
以下是一个简单的Python脚本示例,用于分析Nginx日志并识别可能的防盗链请求:
import re
from collections import defaultdict
LOG_FILE = '/var/log/nginx/access.log'
BLOCKED_IPS = set()
def parse_log_line(line):
pattern = r'(\d+\.\d+\.\d+\.\d+) - - \[(.*?)\] "(.*?)" (\d+) (\d+) "(.*?)" "(.*?)"'
match = re.match(pattern, line)
if match:
ip, timestamp, request, status, size, referer, user_agent = match.groups()
return ip, request, referer
return None
def is_protected_resource(request):
# 判断请求的资源是否是受保护的资源
protected_extensions = ['.jpg', '.png', '.gif', '.mp4', '.avi']
for ext in protected_extensions:
if request.endswith(ext):
return True
return False
def is_invalid_referer(referer, allowed_domains):
if not referer:
return True
for domain in allowed_domains:
if domain in referer:
return False
return True
def main():
allowed_domains = ['example.com']
with open(LOG_FILE, 'r') as f:
for line in f:
log_entry = parse_log_line(line)
if log_entry:
ip, request, referer = log_entry
if is_protected_resource(request) and is_invalid_referer(referer, allowed_domains):
BLOCKED_IPS.add(ip)
print(f"Blocked IP: {ip}")
if __name__ == '__main__':
main()
这个脚本会解析Nginx日志文件,识别受保护的资源请求,并检查引用来源是否有效。如果发现无效的引用来源,会将IP地址添加到阻止列表中。
通过以上步骤和方法,你可以有效地利用Nginx日志进行防盗链,保护你的网站资源不被非法访问。