You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Deep Security API获取入侵防护规则时触发500内部服务器错误

解决Deep Security API批量拉取规则时的500内部服务器错误

看起来你在用Python脚本批量收集Deep Security的入侵防护规则和关联计算机ID时,遇到了棘手的500内部服务器错误,而且是在处理了约14000条记录后触发的。这种服务器端错误通常不是你的代码逻辑有问题,而是请求负载超出了服务器的处理能力,或者旧版本存在稳定性bug。下面是具体的排查思路和修复方案:

可能的触发原因

  • 高频请求耗尽服务器资源:你的脚本是循环遍历每台计算机同步调用API,短时间内大量连续请求会让服务器CPU、内存占用飙升,最终触发内部错误。
  • 单请求数据量过载:如果某台计算机关联了特别多的入侵防护规则,单次list_intrusion_prevention_rules_on_computer请求返回的数据量太大,超过了服务器的处理阈值。
  • 旧版本API稳定性问题:你使用的是Deep Security 12.0.296,这个版本可能存在批量请求相关的已知bug,对高负载场景的处理能力有限。

针对性修复方案

1. 添加请求延迟(控制速率)

在每次API调用后加入短暂延迟,避免给服务器造成持续的高压力。比如用time.sleep(0.5)让脚本每处理一台计算机就暂停0.5秒,具体时长可以根据服务器的承受能力调整。

2. 实现异常重试机制

500错误有时候是服务器的临时波动导致的,针对这类错误添加重试逻辑(用指数退避策略,比如第一次等1秒,第二次等2秒,最多重试3次),可以避免因为单次服务器故障导致整个脚本中断。

3. 批量插入数据库

你现在每获取一条规则就执行一次数据库提交,频繁的IO操作会拖慢脚本速度,间接导致API请求的时间窗口拉长。可以攒够一批数据(比如100条)再一次性插入并提交,减少数据库操作的次数。

4. 启用API分页(如果支持)

查看Deep Security 12.0的API文档,确认list_intrusion_prevention_rules_on_computer是否支持limitoffset这类分页参数。如果支持,分批次拉取单台计算机的规则,减少单次请求的数据量。

5. 考虑升级Deep Security版本

新版本的Deep Security通常会修复旧版本的API稳定性问题,提升高负载场景下的处理能力,如果条件允许,升级到较新的版本可能从根本上解决这个问题。

优化后的脚本示例

我把上面的优化点整合到你的脚本里了,还加入了重试库tenacity来简化重试逻辑(需要先通过pip install tenacity安装):

# -*- coding: utf-8 -*-
from __future__ import print_function
import sys, warnings
import pymssql
import datetime
import deepsecurity
import time
from deepsecurity.rest import ApiException
from urllib3.exceptions import InsecureRequestWarning
from tenacity import retry, stop_after_attempt, wait_exponential

urllib3.disable_warnings(InsecureRequestWarning)
if not sys.warnoptions:
    warnings.simplefilter("ignore")

# 配置Deep Security API
configuration = deepsecurity.Configuration()
configuration.host = "Server/api/"
configuration.api_key['api-secret-key'] = 'Key'

# 初始化数据库连接和API实例
conn = pymssql.connect("localhost","" ,"", "DeepSecurity")
cursor = conn.cursor()
api_rules_instance = deepsecurity.ComputerIntrusionPreventionRuleDetailsApi(deepsecurity.ApiClient(configuration))
api_computers_instance = deepsecurity.ComputersApi(deepsecurity.ApiClient(configuration))

api_version = 'v1'
overrides = False
batch_size = 100  # 批量插入的批次大小
insert_batch = []

# 带重试机制的规则获取函数
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=1, max=5))
def fetch_rules_for_computer(computer_id):
    return api_rules_instance.list_intrusion_prevention_rules_on_computer(computer_id, api_version, overrides=overrides)

try:
    recorddt = datetime.datetime.now()
    # 获取所有计算机列表
    computers_response = api_computers_instance.list_computers(api_version, overrides=overrides)
    
    for computer in computers_response.computers:
        try:
            # 获取当前计算机的入侵防护规则
            rules_response = fetch_rules_for_computer(computer.id)
            
            for rule in rules_response.intrusion_prevention_rules:
                # 清理CVE格式
                clean_cve = str(rule.cve).replace("['", "").replace("']", "").replace("'", "")
                insert_batch.append((rule.id, rule.name, clean_cve, recorddt, computer.id))
                
                # 达到批次大小则执行插入
                if len(insert_batch) >= batch_size:
                    cursor.executemany("INSERT INTO ip_rules VALUES (%d, %s, %s ,%s,%s) ", insert_batch)
                    conn.commit()
                    insert_batch = []  # 清空批次
            
            # 每处理完一台计算机,添加延迟
            time.sleep(0.5)
            
        except ApiException as e:
            print(f"Failed to fetch rules for computer {computer.id}: {str(e)}")
            continue
    
    # 处理剩余未插入的规则数据
    if insert_batch:
        cursor.executemany("INSERT INTO ip_rules VALUES (%d, %s, %s ,%s,%s) ", insert_batch)
        conn.commit()
        
except ApiException as e:
    print(f"Exception when fetching computer list: {str(e)}")
finally:
    # 确保数据库连接关闭
    conn.close()

额外提示

  • 如果你不确定API是否支持分页,可以查阅Deep Security 12.0的官方API文档,确认list_intrusion_prevention_rules_on_computer的参数列表。
  • 可以监控Deep Security服务器的CPU、内存使用情况,如果服务器本身资源不足,也可能导致500错误,这时候需要调整服务器配置。

内容的提问来源于stack exchange,提问作者SismsyeA

火山引擎 最新活动