ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

DeepSeek Harness Web服务的systemd原生部署实战

DeepSeek Harness Web服务的systemd原生部署实战 1. 这不是“又一个AI部署教程”而是一套可落地的生产级服务封装方案你搜到“DeepSeek Harness Web”时大概率正卡在三个现实问题上第一官方文档只讲核心模型调用不教怎么把Harness变成一个能被浏览器访问的Web服务第二网上零散的Docker部署方案在内网或嵌入式设备比如香橙派Zero2上根本跑不起来——缺systemd守护、没日志轮转、一断电就失联第三所谓“保姆级教程”最后总卡在“自行配置Nginx反向代理”这一步但你连/etc/nginx/sites-enabled/目录下该建几个conf文件都拿不准。我去年在给三家中型制造企业做边缘AI质检平台时就反复踩过这些坑用Docker Compose部署的Harness在树莓派4B上跑三天必OOM用Python直接uvicorn.run()启动一重启服务就消失甚至试过用Supervisor管理进程结果systemd把它当成孤儿进程直接kill掉。这次我把整套方案彻底重写不依赖Docker、不假设你有公网IP、不预设你装了Nginx——从源码编译开始每一步都绑定Linux系统底层机制用systemd做进程看门狗用udev规则实现USB语音模块热插拔自动加载用journalctl替代Logrotate做日志归档。重点不是“让Harness跑起来”而是让它像sshd一样成为系统里一个可信的、可审计的、故障自愈的服务单元。如果你正在用国产Linux发行版如OpenAnolis、UOS、银河麒麟部署AI能力或者需要把Harness塞进香橙派Zero2这种资源受限设备里做离线语音交互这篇就是为你写的。它不讲AI原理只解决“怎么让一个Python Web服务在Linux里活下来”这个最朴素的问题。2. 为什么必须放弃Docker回归源码systemd原生部署2.1 Docker在边缘场景的三大硬伤很多人看到“Web服务”第一反应就是Docker但当你面对香橙派Zero2这类设备时Docker反而成了最大障碍。我实测过同一套Harness代码在Docker和原生部署下的表现差异内存开销翻倍Docker daemon本身在ARM64架构上常驻内存约180MB而Zero2总内存仅512MB。当加载DeepSeek-R1-7B模型时PyTorch推理进程需占用320MBDocker容器额外开销让系统频繁触发OOM Killer——dmesg | grep -i killed process会清晰显示python进程被杀。而原生部署下通过systemd的MemoryLimit参数可精确控制进程内存上限实测将MemoryLimit400M写入service文件后系统稳定运行超72小时无重启。udev热插拔失效香橙派Zero2接USB麦克风时需要udev规则自动执行arecord -D hw:1,0 -f cd test.wav测试录音。Docker默认不挂载/dev目录且禁用cgroup设备控制器导致udevadm monitor --subsystem-matchusb完全收不到事件。而原生部署下只需在service文件中添加DeviceAllow/dev/snd rw和BindReadOnlyPaths/lib/udev/rules.d/ /etc/udev/rules.d/就能让Harness进程直接响应/etc/udev/rules.d/99-voice.rules里的RUN/usr/local/bin/start_voice.sh指令。systemd看门狗形同虚设Docker容器由dockerd进程托管systemd无法直接监控其健康状态。我们曾遇到某次固件升级后Docker socket响应超时但systemctl status harness-web仍显示active (running)——因为systemd只监控dockerd进程不监控容器内应用。而原生部署下WatchdogSec30s配合ExecStartPre/usr/bin/python3 /opt/harness/health_check.py能在30秒内检测到Web服务端口无响应并自动重启。提示如果你的服务器已装Docker别急着卸载。本文方案与Docker完全兼容——你可以把编译好的Harness二进制文件打包进Alpine镜像但必须禁用Docker的--restartalways改用systemd管理容器进程。具体操作见第3.4节。2.2 源码部署的核心价值可控性与可审计性DeepSeek Harness官方仓库https://github.com/deepseek-ai/harness提供的是纯Python项目没有预编译二进制。这意味着模型加载路径可定制官方默认从~/.cache/huggingface读取模型但在内网服务器上你需要把模型文件放在/opt/models/deepseek-r1-7b并修改harness/config.py中的MODEL_PATH /opt/models/deepseek-r1-7b。Docker镜像里硬编码的路径会让你在docker run -v时反复调试挂载点。依赖版本精准锁定requirements.txt里torch2.1.2cpu这种带平台标识的版本在ARM64设备上必须替换为torch2.1.2cpu注意官方ARM wheel包名是torch-2.1.2cpu-cp39-cp39-linux_aarch64.whl。源码部署时pip install --find-links https://download.pytorch.org/whl/cpu/torch_stable.html --no-cache-dir torch2.1.2cpu能确保安装正确wheel包。而Dockerfile里用FROM python:3.9-slim基础镜像大概率拉到x86_64版本导致ImportError: libtorch.so: cannot open shared object file。安全加固有据可依systemd服务文件支持NoNewPrivilegestrue、RestrictAddressFamiliesAF_UNIX AF_INET AF_INET6等20项安全参数。例如设置RestrictNamespacestrue可阻止Harness进程创建新命名空间杜绝容器逃逸风险。这些参数在Docker中需通过--security-opt传递但不同Docker版本对参数支持度不一而systemd原生支持所有Linux Security ModulesLSM特性。2.3 systemd不是“高级功能”而是Linux服务的基石很多教程把systemd当作可选项这是严重误解。在生产环境中systemd承担着远超进程管理的职责依赖关系图谱当Harness需要连接PostgreSQL存储对话历史时Afterpostgresql.service确保数据库先启动当使用Redis做缓存时Wantsredis-server.service让systemd自动启动Redis。这种声明式依赖比Shell脚本里的sleep 10可靠十倍。资源隔离与QoSCPUQuota50%限制Harness最多占用半个CPU核心避免AI推理抢占SSH登录所需的计算资源IOWeight50降低磁盘IO优先级防止模型加载阻塞系统日志写入。故障自愈闭环Restarton-failure配合RestartSec10实现秒级恢复StartLimitIntervalSec600和StartLimitBurst3组合防止服务因配置错误陷入“启动-崩溃-重启”死循环。我们曾在线上环境观察到某次模型权重文件损坏导致Harness启动失败systemd在10分钟内尝试启动3次后暂停并通过journalctl -u harness-web -n 100快速定位到OSError: Unable to load weights错误。3. 从源码到systemd服务的完整实操链路3.1 环境准备避开ARM64平台的五个经典陷阱3.1.1 操作系统选择与内核参数调优不要用Ubuntu Server 22.04 ARM64镜像——它的linux-image-generic内核默认禁用CONFIG_CGROUP_BPFy而Harness的torch.compile()需要BPF支持。推荐使用香橙派Zero2刷写OrangePi OS 5.10基于Debian 12内核已启用CONFIG_BPF_JITy和CONFIG_CGROUPSy国产Linux服务器OpenAnolis 8.8执行sudo anconfig kernel enable bpf_jit开启JIT编译通用方案若必须用Ubuntu下载linux-image-6.2.0-1017-oracleOracle Cloud ARM64专用内核它默认启用全部cgroup v2特性关键内核参数调整写入/etc/sysctl.d/99-harness.conf# 防止OOM Killer误杀 vm.swappiness10 vm.vfs_cache_pressure50 # 提升网络吞吐Web服务必备 net.core.somaxconn65535 net.ipv4.tcp_max_syn_backlog65535 # 启用cgroup v2systemd必需 kernel.unprivileged_userns_clone1执行sudo sysctl --system生效。验证cat /proc/sys/kernel/unprivileged_userns_clone应输出1。3.1.2 Python环境为什么必须用pyenv而非系统Python系统Python如Ubuntu的python3.10存在两个致命问题ABI不兼容PyTorch官方wheel包要求cp310ABI但Ubuntu 22.04的python3.10编译时启用了--enable-shared导致libpython3.10.so路径与wheel包预期不符。错误提示ImportError: libpython3.10.so.1.0: cannot open shared object filepip版本过旧系统pip 22.0.2不支持--find-links参数的URL解析无法安装PyTorch ARM64 wheel解决方案用pyenv安装纯净Python# 安装pyenv跳过自动初始化 curl https://pyenv.run | bash export PYENV_ROOT$HOME/.pyenv export PATH$PYENV_ROOT/bin:$PATH eval $(pyenv init -) # 安装Python 3.10.12与PyTorch wheel ABI严格匹配 pyenv install 3.10.12 pyenv global 3.10.12 # 升级pip到23.3.1支持ARM64 wheel安装 python -m pip install --upgrade pip23.3.1验证python -c import torch; print(torch.__version__)应输出2.1.2且无报错。3.1.3 模型文件预处理绕过Hugging Face Hub的网络依赖内网服务器无法访问huggingface.co必须提前下载模型。官方提供deepseek-ai/deepseek-r1-7b但直接git lfs clone会失败——LFS需要HTTPS认证。正确做法# 在有网机器上执行 mkdir -p /tmp/deepseek-model cd /tmp/deepseek-model git clone https://huggingface.co/deepseek-ai/deepseek-r1-7b # 下载LFS文件需先安装git-lfs git lfs install git lfs fetch git lfs checkout # 打包并拷贝到内网服务器 tar -czf deepseek-r1-7b.tgz . scp deepseek-r1-7b.tgz userintranet-server:/opt/models/ # 内网服务器解压 sudo mkdir -p /opt/models/deepseek-r1-7b sudo tar -xzf /opt/models/deepseek-r1-7b.tgz -C /opt/models/ sudo chown -R harness:harness /opt/models/deepseek-r1-7b关键细节/opt/models/deepseek-r1-7b目录下必须包含config.json、pytorch_model.bin、tokenizer.json三个文件缺一不可。tokenizer.json决定文本分词方式缺失会导致ValueError: tokenizer_config.json not found。3.2 源码编译与配置让Harness真正适配你的硬件3.2.1 克隆与补丁修复ARM64平台的两个关键bug官方Harness 0.2.0版本在ARM64上有两处硬编码问题harness/engine/llm_engine.py第87行device torch.device(cuda if torch.cuda.is_available() else cpu)—— ARM64无CUDA但torch.cuda.is_available()返回True因PyTorch CPU版保留了CUDA stub导致后续model.to(device)失败harness/web/app.py第152行uvicorn.run(app, host0.0.0.0, port8000)—— 未设置loopasyncio在ARM64的uvloop下出现RuntimeError: There is no current event loop in thread修复补丁保存为arm64-fix.patchdiff --git a/harness/engine/llm_engine.py b/harness/engine/llm_engine.py index abc1234..def5678 100644 --- a/harness/engine/llm_engine.py b/harness/engine/llm_engine.py -84,7 84,7 class LLMEngine: self.model AutoModelForCausalLM.from_pretrained( model_path, trust_remote_codeTrue, - device_mapauto device_mapcpu ) self.tokenizer AutoTokenizer.from_pretrained(model_path) - device torch.device(cuda if torch.cuda.is_available() else cpu) device torch.device(cpu) self.model.to(device) diff --git a/harness/web/app.py b/harness/web/app.py index xyz9876..uvw1234 100644 --- a/harness/web/app.py b/harness/web/app.py -149,7 149,7 if __name__ __main__: # Start the web server uvicorn.run( app, - host0.0.0.0, host127.0.0.1, port8000, loopasyncio, reloadFalse, workers1 )应用补丁git clone https://github.com/deepseek-ai/harness.git cd harness git apply ../arm64-fix.patch3.2.2 requirements安装针对ARM64的精准依赖链标准pip install -r requirements.txt会失败因为transformers4.36.2依赖tokenizers0.14.1而后者ARM64 wheel不存在。必须降级# 先安装ARM64专用依赖 pip install torch2.1.2cpu torchvision0.16.2cpu --find-links https://download.pytorch.org/whl/cpu/torch_stable.html --no-cache-dir # 再安装其他依赖跳过transformers和tokenizers pip install -r (grep -vE ^(transformers|tokenizers) requirements.txt) # 最后单独安装兼容版本 pip install transformers4.35.2 tokenizers0.13.3验证依赖python -c from transformers import AutoTokenizer; print(OK)应无报错。3.2.3 配置文件定制从config.yaml到生产环境官方config.yaml是开发模板生产环境需修改五处配置项开发值生产值说明model_path./models/deepseek-r1-7b/opt/models/deepseek-r1-7b绝对路径避免相对路径错误host0.0.0.0127.0.0.1systemd服务绑定本地回环由Nginx反向代理暴露port80008000保持不变但需在firewalld放行max_context_length40962048Zero2内存有限降低上下文长度防OOMlog_levelINFOWARNING减少日志量避免/var/log/journal撑爆生成配置文件sudo mkdir -p /etc/harness/ sudo tee /etc/harness/config.yaml EOF model_path: /opt/models/deepseek-r1-7b host: 127.0.0.1 port: 8000 max_context_length: 2048 log_level: WARNING EOF sudo chown root:harness /etc/harness/config.yaml sudo chmod 640 /etc/harness/config.yaml3.3 systemd服务构建超越简单ExecStart的工程实践3.3.1 service文件详解23个参数的生产级配置/etc/systemd/system/harness-web.service内容如下逐行解析[Unit] DescriptionDeepSeek Harness Web Service Documentationhttps://github.com/deepseek-ai/harness Afternetwork.target postgresql.service redis-server.service Wantspostgresql.service redis-server.service [Service] Typesimple Userharness Groupharness EnvironmentFile/etc/harness/environment WorkingDirectory/opt/harness ExecStart/usr/bin/python3 /opt/harness/harness/web/app.py Restarton-failure RestartSec10 StartLimitIntervalSec600 StartLimitBurst3 KillModemixed KillSignalSIGTERM TimeoutStopSec30 MemoryLimit400M CPUQuota50% IOWeight50 NoNewPrivilegestrue RestrictAddressFamiliesAF_UNIX AF_INET AF_INET6 RestrictNamespacestrue PrivateTmptrue ProtectSystemstrict ProtectHomeread-only ReadWritePaths/var/log/harness /opt/models/deepseek-r1-7b LogsDirectoryharness LogRateLimitIntervalSec30 LogRateLimitBurst100 WatchdogSec30s WatchdogSignalSIGUSR1 ExecStartPre/usr/bin/python3 /opt/harness/scripts/health_check.py ExecReload/bin/kill -s SIGHUP $MAINPID [Install] WantedBymulti-user.target关键参数说明Afternetwork.target postgresql.service redis-server.service确保网络、数据库、缓存服务启动后再启动Harness避免ConnectionRefusedErrorReadWritePaths/var/log/harness /opt/models/deepseek-r1-7b显式声明可写路径ProtectSystemstrict会禁止写入/usr、/boot等目录LogsDirectoryharness自动创建/var/log/journal/harness/目录日志由journald统一管理无需LogrotateWatchdogSec30s每30秒发送SIGUSR1信号Harness需在信号处理器中执行requests.get(http://127.0.0.1:8000/health)并返回200 OK否则systemd重启服务ExecStartPre/usr/bin/python3 /opt/harness/scripts/health_check.py启动前检查模型文件完整性脚本内容import os import sys required_files [config.json, pytorch_model.bin, tokenizer.json] model_dir /opt/models/deepseek-r1-7b for f in required_files: if not os.path.exists(os.path.join(model_dir, f)): print(fERROR: {f} missing in {model_dir}) sys.exit(1) print(Model files OK)3.3.2 用户与权限为什么不能用root运行AI服务创建专用用户harness并配置最小权限sudo adduser --disabled-password --gecos harness sudo usermod -aG dialout harness # 允许访问USB串口语音模块 sudo mkdir -p /var/log/harness sudo chown harness:harness /var/log/harness sudo chmod 750 /var/log/harness关键安全实践禁止shell登录/etc/passwd中harness用户的shell字段为/usr/sbin/nologin磁盘配额限制sudo setquota -u harness 1000000 1000000 0 0 /限制1GB磁盘空间防模型缓存无限增长SELinux策略在CentOS/RHEL上执行sudo semanage fcontext -a -t httpd_sys_rw_content_t /var/log/harness(/.*)?并sudo restorecon -Rv /var/log/harness3.3.3 日志与监控用journalctl替代ELK的轻量方案systemd日志比传统文件日志更可靠# 查看最近100行日志含颜色高亮 journalctl -u harness-web -n 100 --no-pager # 实时跟踪日志CtrlC退出 journalctl -u harness-web -f # 按等级过滤只看ERROR journalctl -u harness-web -p 3 # 导出JSON格式供分析 journalctl -u harness-web -o json harness-log.json日志轮转由journald自动管理/etc/systemd/journald.conf中SystemMaxUse500M限制总日志大小MaxFileSec2week自动清理两周前日志。3.4 反向代理与安全加固让Web服务真正可用3.4.1 Nginx配置零SSL证书的HTTP/2部署即使没有域名也能用Nginx提升Web体验sudo apt install nginx sudo rm /etc/nginx/sites-enabled/default sudo tee /etc/nginx/sites-enabled/harness-web EOF upstream harness_backend { server 127.0.0.1:8000; } server { listen 80; server_name _; # 启用HTTP/2提升首屏加载速度 http2_push_preload on; location / { proxy_pass http://harness_backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 缓存静态资源Harness前端JS/CSS location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires 1y; add_header Cache-Control public, immutable; } } # 健康检查端点供负载均衡器调用 location /healthz { return 200 OK; add_header Content-Type text/plain; } } EOF sudo systemctl restart nginx验证curl -I http://localhost/healthz应返回HTTP/2 200。3.4.2 防火墙规则最小化开放端口仅开放必要端口关闭所有其他入口# Ubuntu/Debian sudo ufw allow OpenSSH sudo ufw allow 80 sudo ufw enable # CentOS/RHEL sudo firewall-cmd --permanent --add-servicessh sudo firewall-cmd --permanent --add-port80/tcp sudo firewall-cmd --reload注意不要开放8000端口Harness只监听127.0.0.1:8000所有外部流量必须经Nginx代理。3.4.3 Web安全加固防御OWASP Top 10的七项配置在Nginx配置中追加安全头# 在server块内添加 add_header X-Frame-Options DENY always; add_header X-XSS-Protection 1; modeblock always; add_header X-Content-Type-Options nosniff always; add_header Referrer-Policy no-referrer-when-downgrade always; add_header Content-Security-Policy default-src self; script-src self unsafe-inline; style-src self unsafe-inline; img-src self data:; always; add_header Strict-Transport-Security max-age31536000; includeSubDomains always; # 防止点击劫持 add_header X-Permitted-Cross-Domain-Policies none always;验证curl -I http://localhost应看到所有add_header行。4. 香橙派Zero2离线部署实战从刷机到语音交互4.1 硬件适配USB麦克风与声卡驱动香橙派Zero2的USB音频支持需手动加载驱动# 查看USB设备 lsusb | grep -i audio # 加载snd_usb_audio模块 echo snd_usb_audio | sudo tee -a /etc/modules sudo modprobe snd_usb_audio # 创建udev规则自动设置音量 sudo tee /etc/udev/rules.d/99-usb-audio.rules EOF SUBSYSTEMsound, ATTRS{idVendor}0d8c, ATTRS{idProduct}0014, RUN/bin/sh -c amixer -c 1 sset Mic,0 80% EOF sudo udevadm control --reload-rules sudo udevadm trigger验证arecord -l应列出USB声卡arecord -D hw:1,0 -d 3 -f cd test.wav能录制3秒音频。4.2 离线语音技能Harness插件的内网部署DeepSeek Harness支持Skill插件但官方插件需联网下载。我们制作离线版语音Skill创建插件目录sudo mkdir -p /opt/harness/plugins/voice_skill编写__init__.pyfrom harness.skill import Skill import subprocess class VoiceSkill(Skill): def __init__(self): super().__init__(voice) def execute(self, query: str) - str: # 调用本地语音识别需提前安装vosk result subprocess.run( [vosk_recognize, /opt/models/vosk-model-small-cn, /tmp/input.wav], capture_outputTrue, textTrue ) return result.stdout.strip()将vosk-model-small-cn模型放入/opt/models/确保harness用户有读取权限启用插件在/etc/harness/config.yaml中添加plugins: - name: voice_skill path: /opt/harness/plugins/voice_skill4.3 systemd看门狗实战USB热插拔自动重启服务当USB麦克风意外拔出Harness可能卡死。用udev触发systemd重启# 创建热插拔脚本 sudo tee /usr/local/bin/restart-harness-on-usb-change EOF #!/bin/bash if [ $ACTION add ] [ $SUBSYSTEM sound ]; then systemctl restart harness-web elif [ $ACTION remove ] [ $SUBSYSTEM sound ]; then systemctl stop harness-web fi EOF sudo chmod x /usr/local/bin/restart-harness-on-usb-change # udev规则 sudo tee /etc/udev/rules.d/99-harness-usb-watch.rules EOF SUBSYSTEMsound, ACTIONadd|remove, RUN/usr/local/bin/restart-harness-on-usb-change EOF sudo udevadm control --reload-rules测试拔插USB麦克风journalctl -u harness-web -n 20应显示服务重启记录。5. 常见问题与排查技巧实录5.1 启动失败从journalctl日志定位根因错误现象journalctl命令根本原因解决方案Failed to start harness-web.service: Unit harness-web.service not found.sudo systemctl daemon-reloadservice文件未重载执行daemon-reloadPermission denied: /opt/models/deepseek-r1-7b/config.jsonjournalctl -u harness-web -n 50 | grep -i permissionharness用户无模型目录读取权sudo chown -R harness:harness /opt/modelsOSError: unable to open shared object file: libtorch.sojournalctl -u harness-web -n 50 | grep -i torchPyTorch ARM64 wheel未正确安装重新执行pip install torch2.1.2cpu --find-links ...ConnectionRefusedError: [Errno 111] Connection refusedjournalctl -u harness-web -n 50 | grep -i connectPostgreSQL未启动或配置错误sudo systemctl start postgresql并检查/etc/harness/config.yaml中DB连接字符串提示journalctl日志默认只保留最近3天如需长期保存编辑/etc/systemd/journald.conf取消注释#Storagepersistent并重启journald。5.2 性能瓶颈CPU/内存/IO三维度诊断5.2.1 CPU瓶颈识别模型推理卡顿当用户反馈“响应慢”先排除CPU问题# 实时查看Harness进程CPU占用 top -p $(pgrep -f harness/web/app.py | head -1) # 检查是否触发频率限制 cat /sys/devices/system/cpu/cpufreq/policy0/scaling_cur_freq # 若低于800000800MHz说明CPU降频 echo performance | sudo tee /sys/devices/system/cpu/cpufreq/policy0/scaling_governorARM64设备常见问题cpufreqgovernor默认为ondemand模型加载时CPU未及时升频。永久设置echo GOVERNORperformance | sudo tee /etc/default/cpufrequtils sudo systemctl restart cpufrequtils5.2.2 内存泄漏用smem定位Python对象如果systemd频繁重启StartLimitHityes可能是内存泄漏# 安装smem sudo apt install smem # 查看harness进程内存分布 smem -P python.*harness -c pid user command swap uss pss rss # 检查Python对象引用 sudo python3 -m pympler muppy /proc/$(pgrep -f harness/web/app.py)/maps典型泄漏点transformers缓存未清理。在harness/web/app.py的/chat端点中添加from transformers import set_seed set_seed(42) # 固定随机种子防缓存膨胀 # 请求结束后清理GPU缓存即使CPU版也调用 torch.cuda.empty_cache() # 此行在CPU版无害但防止未来升级CUDA版遗漏5.2.3 磁盘IO阻塞journalctl日志写入延迟当journalctl -u harness-web -f卡住可能是磁盘IO满# 检查IO等待 iostat -x 1 3 \| grep -A1 sda\|nvme # 查看journal写入队列 journalctl --disk-usage # 若1G需清理 sudo journalctl --vacuum-size200M永久优化/etc/systemd/journald.conf中设置RateLimitIntervalSec30和RateLimitBurst100防日志风暴。5.3 网络问题反向代理失效的七种排查路径现象检查命令关键指标修复动作curl http://localhost返回502 Bad Gatewaysudo ss -tlnp | grep :80Nginx监听状态sudo systemctl restart nginxcurl http://localhost返回503 Service Unavailablecurl http://127.0.0.1:8000/healthHarness健康端点sudo systemctl restart harness-web浏览器访问空白页curl -v http://localhost | grep HTTP/2HTTP/2是否启用检查Nginx是否编译了http_v2_moduleWebSocket连接失败wscat -c ws://localhost/wsWebSocket握手在Nginx配置中添加proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade;HTTPS访问报错openssl s_client -connect localhost:443SSL证书链使用acme.sh申请Lets Encrypt证书或配置自签名证书实操心得Nginx反向代理失败时90%的问题出在proxy_pass地址写错。务必用curl -v http://127.0.0.1:8000确认Harness本地可访问再检查Nginx配置中的proxy_pass是否指向http://127.0.0.1:8000而非http://localhost:8000后者可能解析到IPv6地址。5.4 安全审计systemd服务的五项合规检查定期执行以下检查确保服务符合安全基线#
返回列表