服务器运维(三十一)服务器日志分析工具之error_log日志—东方仙盟—东方仙盟

error日志

日志分析

东方仙盟 Nginx error_log 日志分析工具使用说明

核心代码

一、Nginx error_log 日志分析的核心价值(聚焦异常快速定位)

Nginx 的 error_log 日志记录了服务器运行过程中所有错误、警告和异常事件,对其进行专业分析,是快速定位服务器故障、排查异常根源的核心手段,具体价值体现在:

1. 秒级定位异常根源,大幅缩短排障时间

  • 精准识别错误类型(如 Lua 脚本执行错误、PHP 弃用警告、FastCGI 通信错误等):无需逐行翻阅海量日志,直接锁定核心异常类型,避免 "大海捞针" 式排查;
  • 关联异常 IP 与错误详情:快速定位是特定客户端 IP 触发的错误,还是服务器全局异常,1 分钟内缩小排查范围至 "具体 IP / 具体错误类型"。

2. 分级识别风险,优先处理高优先级问题

  • 自动标记错误风险等级(高 / 中 / 低):✅ 高风险(如 Lua 脚本堆栈错误、服务器内部 500 错误):立即处理,避免服务中断;✅ 中风险(如 FastCGI 通信错误):重点关注,防止问题扩散;✅ 低风险(如 PHP 弃用警告):规划优化,不影响核心服务;
  • 按错误出现频次排序:优先解决高频触发的异常,快速降低服务器错误率。

3. 提前预警潜在故障,避免服务中断

  • 识别 "隐性异常"(如 Lua 变量空值拼接错误):这类错误初期可能不影响服务,但长期积累易引发崩溃,提前发现可防患于未然;
  • 关联客户端行为:发现特定 IP 触发的异常请求(如恶意访问导致的脚本执行错误),及时拦截,避免攻击扩大。

4. 优化服务性能,提升稳定性

  • 定位重复出现的低级别错误(如 PHP 弃用警告):通过调整配置(如 php.ini 参数)消除冗余错误,减少服务器日志冗余和资源消耗;
  • 分析上游服务异常(如 FastCGI 通信错误):快速定位是 Nginx 配置问题还是后端 PHP 服务故障,针对性优化。

二、网页版 error_log 分析工具的核心优势(零安装,异常定位快人一步)

传统的 error_log 排查需要登录服务器、使用复杂的命令行工具(如 grep、awk)筛选日志,且依赖运维人员的经验,而本网页版工具彻底解决这些痛点,核心优势聚焦 "快速定位":

1. 零安装成本,随时随地快速排查

  • 无需在服务器 / 本地安装任何软件、插件,打开浏览器即可使用,跨 Windows/Mac/Linux/ 移动端全兼容;
  • 无需部署服务器端工具,避免因安装第三方软件引入新的异常,同时节省服务器资源。

2. 智能解析,异常信息结构化呈现

  • 自动提取核心信息:从杂乱的 error_log 文本中,智能解析出 "错误类型、风险等级、客户端 IP、错误详情",无需人工整理;
  • 双维度统计视图:✅ 错误类型统计:按出现频次排序,一眼看出最频发的异常;✅ IP 与错误详情:关联触发异常的客户端 IP,快速区分 "客户端问题" 还是 "服务器问题"。

3. 操作极简,非技术人员也能快速定位异常

  • 无需掌握 Linux 命令或日志分析语法,3 步完成异常定位:
    1. 复制 Nginx error_log 日志内容(默认路径/var/log/nginx/error.log);
    2. 粘贴到工具文本框,点击 "开始解析错误日志";
    3. 查看结构化结果,直接定位 "高风险错误类型""高频异常 IP"。

4. 数据本地解析,安全且高效

  • 日志仅在本地浏览器解析,不上传至任何服务器,保障业务数据隐私;
  • 自动截断过长错误信息,保留核心内容,界面整洁,重点异常信息一目了然。

三、工具核心价值:异常快速定位的典型场景

  1. 场景 1:服务响应异常现象:用户反馈访问卡顿 / 报错,传统方式需逐行查日志;工具使用:解析日志后,直接看到 "Lua 脚本执行错误(高风险)" 出现 3 次,且均由特定 IP 触发,1 分钟定位到 "该 IP 的异常请求导致 Lua 脚本报错",快速拦截即可恢复。

  2. 场景 2:日志量过大,排查效率低现象:error_log 日志每天数万行,人工排查耗时数小时;工具使用:解析后按错误类型排序,发现 "PHP 弃用警告(低风险)" 占比 80%,快速调整 php.ini 配置,日志量骤降,核心异常(如 FastCGI 错误)立即凸显。

  3. 场景 3:未知异常导致服务不稳定现象:服务器偶发 500 错误,但无明显规律;工具使用:解析后看到 "上游服务器响应头读取错误(中风险)" 关联多个 IP,定位到后端 FastCGI 服务超时,调整超时参数后问题解决。

代码

复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>东方仙盟服务器日志分析工具之error_log日志</title>
    <style>
        /* 科技修仙风格样式 */
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: "Microsoft Yahei", monospace;
        }
        
        body {
            background: linear-gradient(135deg, #0a0a1a, #1a1a3a);
            color: #00ff9d;
            min-height: 100vh;
            padding: 20px;
            background-image: 
                radial-gradient(circle at 10% 20%, rgba(0, 255, 157, 0.1) 0%, transparent 20%),
                radial-gradient(circle at 90% 80%, rgba(0, 157, 255, 0.1) 0%, transparent 20%);
        }
        
        .container {
            max-width: 1400px;
            margin: 0 auto;
            background: rgba(10, 10, 30, 0.8);
            border: 1px solid #00ff9d;
            border-radius: 8px;
            padding: 30px;
            box-shadow: 0 0 20px rgba(0, 255, 157, 0.2);
        }
        
        .header {
            text-align: center;
            margin-bottom: 30px;
            border-bottom: 2px solid #00cc88;
            padding-bottom: 20px;
        }
        
        h1 {
            font-size: 2.5rem;
            text-shadow: 0 0 10px #00ff9d;
            margin-bottom: 10px;
            color: #00ffcc;
        }
        
        .subtitle {
            color: #00cc99;
            font-style: italic;
        }
        
        .log-input {
            margin-bottom: 30px;
        }
        
        textarea {
            width: 100%;
            height: 300px;
            background: rgba(5, 5, 20, 0.9);
            border: 1px solid #00cc88;
            color: #00ff9d;
            padding: 15px;
            font-size: 14px;
            resize: vertical;
            border-radius: 4px;
            margin-bottom: 15px;
            outline: none;
            transition: all 0.3s;
        }
        
        textarea:focus {
            box-shadow: 0 0 10px rgba(0, 255, 157, 0.5);
            border-color: #00ff9d;
        }
        
        button {
            background: linear-gradient(to right, #009966, #00cc88);
            color: #0a0a1a;
            border: none;
            padding: 12px 30px;
            font-size: 16px;
            font-weight: bold;
            border-radius: 4px;
            cursor: pointer;
            transition: all 0.3s;
            margin-right: 10px;
        }
        
        button:hover {
            background: linear-gradient(to right, #00cc88, #00ff9d);
            box-shadow: 0 0 10px rgba(0, 255, 157, 0.5);
            transform: translateY(-2px);
        }
        
        .results {
            display: flex;
            flex-direction: column;
            gap: 20px;
            margin-top: 30px;
        }
        
        .stat-card {
            background: rgba(15, 15, 40, 0.8);
            border: 1px solid #009966;
            border-radius: 6px;
            padding: 20px;
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
            width: 100%;
        }
        
        .stat-card h2 {
            color: #00ffcc;
            margin-bottom: 15px;
            padding-bottom: 10px;
            border-bottom: 1px solid #00cc88;
        }
        
        .total-errors-card {
            text-align: center;
        }
        
        .total-errors {
            font-size: 3rem;
            font-weight: bold;
            color: #ff6600;
            margin: 10px 0;
        }
        
        table {
            width: 100%;
            border-collapse: collapse;
            margin-top: 15px;
        }
        
        th, td {
            padding: 12px 15px;
            text-align: left;
            border-bottom: 1px solid #006644;
        }
        
        th {
            background: rgba(0, 153, 102, 0.2);
            color: #00ffcc;
            font-size: 16px;
        }
        
        tr:hover {
            background: rgba(0, 153, 102, 0.1);
        }
        
        .error-type {
            color: #ff9900;
            font-weight: bold;
        }
        
        .count-column {
            text-align: center;
            color: #ff6600;
            font-weight: bold;
        }
        
        .ip-column {
            width: 18%;
        }
        
        .error-desc-column {
            width: 82%;
        }
        
        .clear-btn {
            background: linear-gradient(to right, #993300, #cc3300);
        }
        
        .clear-btn:hover {
            background: linear-gradient(to right, #cc3300, #ff3300);
        }
        
        .error-severity {
            display: inline-block;
            padding: 2px 8px;
            border-radius: 4px;
            font-size: 12px;
            font-weight: bold;
            margin-right: 8px;
        }
        
        .severity-high {
            background: #ff4444;
            color: #000;
        }
        
        .severity-medium {
            background: #ffaa00;
            color: #000;
        }
        
        .severity-low {
            background: #00cc66;
            color: #000;
        }
        
        @media (max-width: 768px) {
            h1 {
                font-size: 1.8rem;
            }
            
            .total-errors {
                font-size: 2rem;
            }
            
            th, td {
                padding: 8px 10px;
                font-size: 14px;
            }
            
            .ip-column {
                width: 25%;
            }
            
            .error-desc-column {
                width: 75%;
            }
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="header">
            <h1>东方仙盟服务器日志分析工具之error_log日志</h1>
            <p class="subtitle">科技修仙 · 洞察错误玄机</p>
        </div>
        
        <div class="log-input">
            <h2 style="margin-bottom: 10px;">请输入Nginx error_log日志内容</h2>
            <textarea id="logInput" placeholder="请粘贴Nginx错误日志内容,每行一条日志...">_443"
2026/01/13 21:05:53 [error] 485213#0: *3137634 FastCGI sent in stderr: "PHP message: PHP Deprecated:  Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version. To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead. in Unknown on line 0" while reading response header from upstream, client: 175.24.214.150, server: 东方仙盟.my, request: "POST / 未来之窗f HTTP/1.1", upstream: "fastcgi://unix:/tmp/php.sock:", host: "东方仙盟.my"
2026/01/13 21:07:08 [error] 485213#0: *3138380 FastCGI sent in stderr: "PHP message: PHP Deprecated:  Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version. To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead. in Unknown on line 0" while reading response header from upstream, client: 182.240.66.181, server: 东方仙盟.my, request: "POST  111.java HTTP/2.0", upstream: "fastcgi://unix:/tmp/php.sock:", host: "东方仙盟.my", referrer: "https://servicewechat.com/wx615e492799281b1a/64/page-frame.html"
2026/01/13 22:27:54 [error] 485214#0: *3205911 failed to run log_by_lua*: 东方仙盟firewall/lua_script/module/summary.lua:97: attempt to concatenate local 'uri' (a nil value)
stack traceback:
	东方仙盟firewall/lua_script/module/summary.lua:97: in function 'log'
	东方仙盟firewall/lua_script/on_log.lua:5: in main chunk while logging request, client: 38.248.14.48, server: 东方仙盟.my, request: "POST /cgi-bin/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/bin/sh HTTP/1.1"
2026/01/14 00:07:33 [error] 607193#0: *34852 failed to run log_by_lua*: 东方仙盟firewall/lua_script/module/summary.lua:97: attempt to concatenate local 'uri' (a nil value)
stack traceback:
	东方仙盟firewall/lua_script/module/summary.lua:97: in function 'log'
	东方仙盟firewall/lua_script/on_log.lua:5: in main chunk while logging request, client: 88.151.33.203, server: 东方仙盟.my, request: "POST /cgi-bin/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/.%2e/bin/sh HTTP/1.1"
2026/01/14 00:27:16 [error] 607194#0: *49303 failed to run log_by_lua*: 东方仙盟firewall/lua_script/module/summary.lua:97: attempt to concatenate local 'uri' (a nil value)
stack traceback:
	东方仙盟firewall/lua_script/module/summary.lua:97: in function 'log'
	东方仙盟firewall/lua_script/on_log.lua:5: in main chunk while logging request, client: 167.99.1.98, server: 东方仙盟.my, request: "这个分析error_log"</textarea>
            <button id="analyzeBtn">开始解析错误日志</button>
            <button id="clearBtn" class="clear-btn"> 清空内容</button>
        </div>
        
        <div class="results">
            <!-- 总错误数卡片 -->
            <div class="stat-card total-errors-card">
                <h2> 错误日志统计总览</h2>
                <p>总错误条数:<span id="totalErrors" class="total-errors">0</span></p>
            </div>
            
            <!-- 错误类型统计卡片 -->
            <div class="stat-card">
                <h2> 错误类型统计 (按出现频次排序)</h2>
                <table>
                    <thead>
                        <tr>
                            <th>错误类型</th>
                            <th>错误级别</th>
                            <th class="count-column">出现次数</th>
                        </tr>
                    </thead>
                    <tbody id="errorTypeBody">
                        <tr>
                            <td colspan="3" style="text-align: center; color: #999;">请点击解析按钮查看数据</td>
                        </tr>
                    </tbody>
                </table>
            </div>
            
            <!-- IP与错误详情卡片 -->
            <div class="stat-card">
                <h2>客户端IP与错误详情</h2>
                <table>
                    <thead>
                        <tr>
                            <th class="ip-column">客户端IP</th>
                            <th class="error-desc-column">错误详情</th>
                            <th class="count-column">出现次数</th>
                        </tr>
                    </thead>
                    <tbody id="ipErrorBody">
                        <tr>
                            <td colspan="3" style="text-align: center; color: #999;">请点击解析按钮查看数据</td>
                        </tr>
                    </tbody>
                </table>
            </div>
        </div>
    </div>

    <script>
        // 获取DOM元素
        const logInput = document.getElementById('logInput');
        const analyzeBtn = document.getElementById('analyzeBtn');
        const clearBtn = document.getElementById('clearBtn');
        const totalErrors = document.getElementById('totalErrors');
        const errorTypeBody = document.getElementById('errorTypeBody');
        const ipErrorBody = document.getElementById('ipErrorBody');

        // 解析Nginx error_log日志的函数
        function parseNginxErrorLog(logLine) {
            // 去除首尾空格
            logLine = logLine.trim();
            if (!logLine || !logLine.includes('[error]')) return null;
            
            try {
                // 1. 提取客户端IP
                const ipMatch = logLine.match(/client:\s*(\d+\.\d+\.\d+\.\d+)/);
                const clientIp = ipMatch ? ipMatch[1] : '未知IP';
                
                // 2. 识别错误类型和级别
                let errorType = '未知错误';
                let severity = 'medium'; // high, medium, low
                
                // 常见错误类型识别
                if (logLine.includes('PHP Deprecated')) {
                    errorType = 'PHP弃用警告';
                    severity = 'low';
                } else if (logLine.includes('failed to run log_by_lua')) {
                    errorType = 'Lua脚本执行错误';
                    severity = 'high';
                } else if (logLine.includes('FastCGI sent in stderr')) {
                    errorType = 'FastCGI通信错误';
                    severity = 'medium';
                } else if (logLine.includes('while reading response header from upstream')) {
                    errorType = '上游服务器响应头读取错误';
                    severity = 'medium';
                } else if (logLine.includes('attempt to concatenate local \'uri\' (a nil value)')) {
                    errorType = 'Lua变量空值拼接错误';
                    severity = 'high';
                } else if (logLine.includes('stack traceback')) {
                    errorType = 'Lua脚本堆栈错误';
                    severity = 'high';
                } else if (logLine.includes('404 Not Found')) {
                    errorType = '资源未找到';
                    severity = 'low';
                } else if (logLine.includes('500 Internal Server Error')) {
                    errorType = '服务器内部错误';
                    severity = 'high';
                }
                
                // 3. 提取错误简短描述(前100个字符)
                let errorDesc = logLine.substring(0, 150);
                // 清理特殊字符
                errorDesc = errorDesc.replace(/\s+/g, ' ').replace(/\[\w+\]/g, '');
                
                return {
                    ip: clientIp,
                    errorType: errorType,
                    severity: severity,
                    errorDesc: errorDesc,
                    rawLine: logLine
                };
            } catch (error) {
                console.error('解析错误日志失败:', error, logLine);
                return null;
            }
        }

        // 分析错误日志的主函数
        function analyzeErrorLogs() {
            // 清空之前的结果
            errorTypeBody.innerHTML = '';
            ipErrorBody.innerHTML = '';
            
            // 获取日志内容并按行分割
            const logContent = logInput.value;
            const logLines = logContent.split('\n').filter(line => line.trim() !== '');
            
            // 更新总错误数
            const validLines = logLines.filter(line => line.includes('[error]'));
            totalErrors.textContent = validLines.length;
            
            // 如果没有有效错误日志
            if (validLines.length === 0) {
                errorTypeBody.innerHTML = `
                    <tr>
                        <td colspan="3" style="text-align: center; color: #999;">暂无有效错误日志数据</td>
                    </tr>
                `;
                ipErrorBody.innerHTML = `
                    <tr>
                        <td colspan="3" style="text-align: center; color: #999;">暂无有效错误日志数据</td>
                    </tr>
                `;
                return;
            }
            
            // 统计错误类型
            const errorTypeStats = {};
            // 统计IP错误
            const ipErrorStats = {};
            
            // 解析每条日志并统计
            validLines.forEach(line => {
                const parsed = parseNginxErrorLog(line);
                if (parsed) {
                    // 统计错误类型
                    if (errorTypeStats[parsed.errorType]) {
                        errorTypeStats[parsed.errorType].count++;
                        errorTypeStats[parsed.errorType].severity = parsed.severity;
                    } else {
                        errorTypeStats[parsed.errorType] = {
                            count: 1,
                            severity: parsed.severity
                        };
                    }
                    
                    // 统计IP错误
                    const ipKey = `${parsed.ip}|${parsed.errorType}`;
                    if (ipErrorStats[ipKey]) {
                        ipErrorStats[ipKey].count++;
                    } else {
                        ipErrorStats[ipKey] = {
                            ip: parsed.ip,
                            errorType: parsed.errorType,
                            errorDesc: parsed.errorDesc,
                            count: 1
                        };
                    }
                }
            });
            
            // 如果解析失败
            if (Object.keys(errorTypeStats).length === 0) {
                errorTypeBody.innerHTML = `
                    <tr>
                        <td colspan="3" style="text-align: center; color: #ff6600;">错误日志解析失败,请检查格式</td>
                    </tr>
                `;
                ipErrorBody.innerHTML = `
                    <tr>
                        <td colspan="3" style="text-align: center; color: #ff6600;">错误日志解析失败,请检查格式</td>
                    </tr>
                `;
                return;
            }
            
            // 转换为数组并按出现次数排序
            const errorTypeArray = Object.entries(errorTypeStats).map(([type, data]) => ({
                type: type,
                severity: data.severity,
                count: data.count
            })).sort((a, b) => b.count - a.count);
            
            const ipErrorArray = Object.values(ipErrorStats).sort((a, b) => b.count - a.count);
            
            // 生成错误类型表格
            let errorTypeHtml = '';
            errorTypeArray.forEach(item => {
                let severityClass = '';
                let severityText = '';
                
                switch(item.severity) {
                    case 'high':
                        severityClass = 'severity-high';
                        severityText = '高风险';
                        break;
                    case 'medium':
                        severityClass = 'severity-medium';
                        severityText = '中风险';
                        break;
                    case 'low':
                        severityClass = 'severity-low';
                        severityText = '低风险';
                        break;
                }
                
                errorTypeHtml += `
                    <tr>
                        <td class="error-type">${item.type}</td>
                        <td><span class="error-severity ${severityClass}">${severityText}</span></td>
                        <td class="count-column">${item.count}</td>
                    </tr>
                `;
            });
            errorTypeBody.innerHTML = errorTypeHtml;
            
            // 生成IP错误表格
            let ipErrorHtml = '';
            ipErrorArray.forEach(item => {
                // 截断过长的错误描述
                let displayDesc = item.errorDesc;
                if (displayDesc.length > 120) {
                    displayDesc = displayDesc.substring(0, 120) + '...';
                }
                
                ipErrorHtml += `
                    <tr>
                        <td>${item.ip}</td>
                        <td>
                            <strong>${item.errorType}</strong><br>
                            <span style="color: #99cc99; font-size: 12px;">${displayDesc}</span>
                        </td>
                        <td class="count-column">${item.count}</td>
                    </tr>
                `;
            });
            ipErrorBody.innerHTML = ipErrorHtml;
        }

        // 清空内容
        function clearContent() {
            logInput.value = '';
            totalErrors.textContent = '0';
            errorTypeBody.innerHTML = `
                <tr>
                    <td colspan="3" style="text-align: center; color: #999;">请点击解析按钮查看数据</td>
                </tr>
            `;
            ipErrorBody.innerHTML = `
                <tr>
                    <td colspan="3" style="text-align: center; color: #999;">请点击解析按钮查看数据</td>
                </tr>
            `;
        }

        // 绑定事件
        analyzeBtn.addEventListener('click', analyzeErrorLogs);
        clearBtn.addEventListener('click', clearContent);
        
        // 页面加载完成后自动解析示例数据
        window.addEventListener('load', analyzeErrorLogs);
    </script>
</body>
</html>

四、适配人群

  • 运维人员:秒级定位服务器异常,大幅缩短排障时间,提升运维效率;
  • 开发人员:快速关联代码层面的错误(如 Lua 脚本、PHP 语法),精准修复问题;
  • 团队管理者:无需依赖技术人员,通过风险等级快速判断问题紧急程度,合理安排排障优先级;
  • 小型团队 / 个人站长:无专业运维资源时,低成本实现异常快速定位,避免服务长时间中断。

总结

  1. Nginx error_log 分析的核心价值是快速定位异常根源,分级处理风险,避免服务中断;
  2. 网页版工具零安装、零服务器风险,智能解析日志并结构化呈现,1 分钟锁定核心异常;
  3. 操作仅需 "复制 - 粘贴 - 解析" 三步,非技术人员也能快速定位异常,大幅降低排障成本。

该工具以 "科技修仙" 轻量化设计,将复杂的 error_log 分析简化为 "一键解析、异常秒现",让服务器异常定位从 "依赖经验" 变为 "全员可操作",真正实现 "洞察错误玄机,秒级定位异常"。

阿雪技术观

在科技发展浪潮中,我们不妨积极投身技术共享。不满足于做受益者,更要主动担当贡献者。无论是分享代码、撰写技术博客,还是参与开源项目维护改进,每一个微小举动都可能蕴含推动技术进步的巨大能量。东方仙盟是汇聚力量的天地,我们携手在此探索硅基生命,为科技进步添砖加瓦。

Hey folks, in this wild tech - driven world, why not dive headfirst into the whole tech - sharing scene? Don't just be the one reaping all the benefits; step up and be a contributor too. Whether you're tossing out your code snippets, hammering out some tech blogs, or getting your hands dirty with maintaining and sprucing up open - source projects, every little thing you do might just end up being a massive force that pushes tech forward. And guess what? The Eastern FairyAlliance is this awesome place where we all come together. We're gonna team up

相关推荐
安科士andxe7 小时前
深入解析|安科士1.25G CWDM SFP光模块核心技术,破解中长距离传输痛点
服务器·网络·5g
2601_9491465310 小时前
Shell语音通知接口使用指南:运维自动化中的语音告警集成方案
运维·自动化
儒雅的晴天10 小时前
大模型幻觉问题
运维·服务器
Gofarlic_OMS11 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
通信大师11 小时前
深度解析PCC策略计费控制:核心网产品与应用价值
运维·服务器·网络·5g
dixiuapp11 小时前
智能工单系统如何选,实现自动化与预测性维护
运维·自动化
Elastic 中国社区官方博客11 小时前
如何防御你的 RAG 系统免受上下文投毒攻击
大数据·运维·人工智能·elasticsearch·搜索引擎·ai·全文检索
小锋学长生活大爆炸11 小时前
【教程】免Root在Termux上安装Docker
运维·docker·容器
进击切图仔11 小时前
常用 Docker 命令备份
运维·docker·容器
NotStrandedYet12 小时前
《国产系统运维笔记》第8期:挑战国产化流媒体部署——银河麒麟+龙芯架构编译SRS实战全记录
运维·kylin·国产化·银河麒麟·龙芯·信创运维·srs编译安装