你的LLM服务核心固定信息
- 启动脚本:
/root/Documents/code/python/scripts/serve_qwen3_32b.sh - 运行端口:
8001 - 运行显卡:
CUDA_VISIBLE_DEVICES=0 - 服务类型:
vLLM驱动的 Qwen3-32B 大模型
pkill -f "vllm serve"
ps aux | grep vllm | grep -v grep
CLASSIFY_MODE=1 \
MAX_MODEL_LEN=4096 \
CUDA_VISIBLE_DEVICES=0 \
PORT=8001 \
nohup /root/Documents/code/python/scripts/serve_qwen3_32b.sh > llm.log 2>&1 &
cd /root/Documents/code/python/scripts/ && CLASSIFY_MODE=1 MAX_MODEL_LEN=4096 CUDA_VISIBLE_DEVICES=0 PORT=8001 nohup ./serve_qwen3_32b.sh > llm.log 2>&1 &
一、后台启动 LLM 服务(推荐唯一方式)
不占用终端、关闭连接不停止、容器内100%稳定
# 进入脚本目录(可选,更稳定)
cd /root/Documents/code/python/scripts/
# 后台启动,日志写入 llm_qwen3.log 文件
CUDA_VISIBLE_DEVICES=0 PORT=8001 nohup ./serve_qwen3_32b.sh > llm_qwen3.log 2>&1 &
执行后直接回车即可,服务已后台运行。
二、查看日志(3种用法,覆盖所有场景)
日志文件:llm_qwen3.log(和启动脚本同目录)
1. 实时滚动查看(看模型加载进度、报错、运行状态)
tail -f llm_qwen3.log
退出查看:按 Ctrl + C
2. 查看最后50行日志(快速检查是否启动完成)
tail -n 50 llm_qwen3.log
3. 查看完整日志(排查历史问题)
cat llm_qwen3.log
三、检查服务是否正常运行(双验证,100%准确)
方法1:检查 vLLM 进程(服务本体)
ps aux | grep vllm | grep -v grep
✅ 有输出 = 服务在运行
❌ 无输出 = 服务已关闭/启动失败
方法2:检查 8001 端口(监听状态)
netstat -tuln | grep 8001
✅ 看到 0.0.0.0:8001 = 端口正常监听,同事可访问
❌ 无输出 = 端口未开放,服务异常
四、安全关闭 LLM 服务(绝对不暴力杀进程)
分两步,优雅关闭,保护模型和显卡:
1. 先找到 LLM 服务的 PID(进程号)
ps aux | grep vllm | grep -v grep
找到第二列的数字,就是 PID(例如 57879)
2. 安全关闭服务
# 替换为你的实际PID
kill 你的PID
3. 验证是否关闭成功
ps aux | grep vllm | grep -v grep
无输出 = 关闭完成
pkill -f "vllm serve"
五、日常维护一键命令(汇总,直接用)
| 操作 | 命令 |
|---|---|
| 后台启动 | cd /root/Documents/code/python/scripts/ && CUDA_VISIBLE_DEVICES=0 PORT=8001 nohup ./serve_qwen3_32b.sh > llm_qwen3.log 2>&1 & |
| 实时看日志 | tail -f /root/Documents/code/python/scripts/llm_qwen3.log |
| 检查运行状态 | `ps aux |
| 检查端口 | `netstat -tuln |
| 安全关闭 | 先查PID → kill PID |
六、关键避坑提醒(针对你的容器环境)
- 绝对不要用
pkill -f vllm:暴力杀死会导致显卡占用不释放、模型缓存异常 - 启动后必须等日志出现
Uvicorn running on http://0.0.0.0:8001:才算完全就绪 - 日志是排查唯一依据:启动失败、同事连不上,第一时间看日志
- 和SSH服务完全隔离:这套操作只动LLM,不会影响你的SSH连接(再也不会把自己踢掉线)
七、快速故障排查
- 端口8001被占用:先关闭旧LLM服务,再重新启动
- 模型加载失败:看日志,大概率是显存不足/模型文件损坏
- 同事访问失败:确认你的LLM监听
0.0.0.0:8001+ SSH端口转发已开启
六、大模型内网转公网HTTPS安全接入 配置笔记
整体架构
内网容器 vLLM:8001
↓ Autossh 加密反向隧道
公网云服务器 127.0.0.1:18001
↓ 独立Nginx + HTTPS + 密钥鉴权
公网统一入口:https://llm.litearch.cn/v1
核心规则:
- 公网只开放 80、443、22,严禁放行 8001/18001
- 子域名
llm.litearch.cn独立Nginx配置,不与博客混用 - 博客GitHub Action自动构建不影响LLM接口配置
一、公网云服务器配置(ubuntu@VM-0-10-ubuntu)
1. 域名解析
域名:litearch.cn
新增A记录:
- 主机记录:
llm - 解析地址:云服务器公网IP
- 已备案子域名无需额外备案
2. SSL证书申请
sudo certbot --nginx -d llm.litearch.cn
证书自动续期,无需手动维护。
3. Nginx 独立站点配置
配置文件路径:/etc/nginx/sites-available/llm-service
server {
listen 443 ssl;
server_name llm.litearch.cn;
ssl_certificate /etc/letsencrypt/live/llm.litearch.cn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/llm.litearch.cn/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
# 接口访问鉴权密钥
if ($http_authorization != "Bearer LITEARCH_LLM_2026_SAFE_KEY") {
return 401;
}
location / {
proxy_pass http://127.0.0.1:18001;
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;
proxy_connect_timeout 60s;
proxy_read_timeout 120s;
}
}
server {
listen 80;
server_name llm.litearch.cn;
return 301 https://$host$request_uri;
}
启用配置:
sudo ln -s /etc/nginx/sites-available/llm-service /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
4. 解决Nginx域名冲突
清理 litearch.conf 中所有 llm.litearch.cn 多余server块,只保留主博客域名配置,避免端口域名冲突。
5. 安全组/防火墙规则
仅放行:
- 22 :SSH运维
- 80 :HTTP证书验证、自动跳转
- 443 :HTTPS公网接口
禁止放行:18001、8001
二、内网模型容器配置(root@d58125c354a4)
1. vLLM 启动命令(任意路径可执行)
CUDA_VISIBLE_DEVICES=0 PORT=8001 /root/Documents/code/python/scripts/serve_qwen3_32b.sh
服务监听:127.0.0.1:8001
2. 内网容器免密登录云服务器
# 生成密钥
ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519
# 推送公钥到云服务器免密
ssh-copy-id -i ~/.ssh/id_ed25519.pub ubuntu@llm.litearch.cn
3. 永久反向隧道(断线自动重连)
# 安装工具
apt install autossh -y
# 启动反向隧道:内网8001 → 云机本地18001
autossh -M 0 -N -R 127.0.0.1:18001:127.0.0.1:8001 ubuntu@llm.litearch.cn
关闭旧隧道:
pkill -f autossh
三、连通性测试命令
1. 云服务器本地测试隧道
curl http://127.0.0.1:18001/v1/models
2. 公网接口测试
curl -X POST https://llm.litearch.cn/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer LITEARCH_LLM_2026_SAFE_KEY" \
-d '{
"model": "Qwen/Qwen3-32B",
"messages": [{"role": "user", "content": "你好"}]
}'
四、接入调用配置
基础信息
- 接口地址:
https://llm.litearch.cn/v1 - 模型名称:
Qwen/Qwen3-32B - API Key:
EMPTY
Python 调用示例
from openai import OpenAI
client = OpenAI(
base_url="https://llm.litearch.cn/v1",
api_key="EMPTY"
)
response = client.chat.completions.create(
model="Qwen/Qwen3-32B",
messages=[{"role": "user", "content": "你好"}]
)
print(response.choices[0].message.content)
五、安全强制规范
- 绝不对外放行 18001/8001 端口,只走443 HTTPS
- 所有公网接口必须加
Bearer密钥鉴权 - 同事仅接口调用,无云服务器/内网服务器SSH账号权限
- 子域名独立Nginx配置,不混入博客配置,避免被GitHub Action覆盖
- SSH禁用密码登录、改端口、仅密钥登录,防爆破
六、日常运维常用命令
- 重启LLM服务(内网服务器端):
CUDA_VISIBLE_DEVICES=0 PORT=8001 /root/Documents/code/python/scripts/serve_qwen3_32b.sh - 重启隧道(云服务端):
pkill -f autossh && autossh -M 0 -N -R 127.0.0.1:18001:127.0.0.1:8001 ubuntu@llm.litearch.cn - Nginx检查重载(云服务端):
sudo nginx -t && sudo systemctl reload nginx - 查看隧道进程(云服务端):
ps aux | grep autossh
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 kipleyarch@gmail.com