fix: 降低 gthread 连接数防 MySQL 打满 + 最终一键修复脚本

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-09 05:12:23 +08:00
parent ad63b3f1ee
commit 01ffbdf478
2 changed files with 85 additions and 8 deletions

81
deploy/final-fix-all.sh Normal file
View File

@@ -0,0 +1,81 @@
#!/bin/bash
# 最终一次性修复(只跑这一个,不要其它脚本)
# 解决8001 双开、gunicorn sync、全局限流、DB 连接打满
set -e
DJANGO_DIR="/opt/1panel/apps/openresty/nginx/www/sites/43.142.166.152.443/django"
LOG="/opt/1panel/apps/openresty/nginx/log/access.log"
cd "$DJANGO_DIR"
echo "=============================================="
echo " 星阙最终修复 $(date '+%H:%M:%S')"
echo "=============================================="
echo ""
echo "[1/6] 拉最新代码"
git fetch origin
git reset --hard origin/main
echo " 当前: $(git log -1 --oneline)"
echo ""
echo "[2/6] 检查全局限流是否已移除"
if grep -q 'DEFAULT_THROTTLE_CLASSES' a_long_dianjing/settings.py; then
echo " 失败: 仍有限流配置"
exit 1
fi
echo " OK: 无全局限流"
echo ""
echo "[3/6] 清掉所有 gunicorn释放 8001"
systemctl stop gunicorn-dianjing.service 2>/dev/null || true
sleep 2
pkill -f 'gunicorn' 2>/dev/null || true
sleep 3
if ss -ltn 2>/dev/null | grep -q ':8001'; then
fuser -k 8001/tcp 2>/dev/null || true
sleep 2
fi
echo ""
echo "[4/6] 只启动 systemd 唯一一套 (gthread 4x2)"
cp deploy/systemd/gunicorn-dianjing.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable gunicorn-dianjing.service
systemctl start gunicorn-dianjing.service
sleep 4
echo ""
echo "[5/6] 验证"
NG=$(pgrep -cf 'gunicorn.*a_long_dianjing' 2>/dev/null || echo 0)
RT=$(curl -s -o /dev/null -w '%{time_total}' --max-time 5 http://127.0.0.1:8001/hqhd/ 2>/dev/null || echo FAIL)
echo " gunicorn 进程: $NG (正常=5: 1master+4worker)"
echo " curl 8001: ${RT}s"
grep -q 'worker_class = "gthread"' gunicorn.conf.py && echo " gunicorn.conf: gthread OK"
venv/bin/python -c "import app_secrets; print(' 数据库:', app_secrets.DATABASE_HOST, app_secrets.DATABASE_PORT)"
REC429=$(grep -a 'hqhd' "$LOG" 2>/dev/null | tail -200 | awk '$9==429' | wc -l)
echo " 最近200条429: $REC429 (部署后应趋近0)"
echo ""
echo "[6/6] 测本机 Docker 数据库(若 OK 可改 app_secrets 治本)"
venv/bin/python -c "
import pymysql, app_secrets as s
try:
c=pymysql.connect(host='172.17.0.15',port=3306,user=s.DATABASE_USER,password=s.DATABASE_PASSWORD,database=s.DATABASE_NAME,connect_timeout=3)
c.close()
print(' 172.17.0.15:3306 可连 → 改 app_secrets DATABASE_HOST=172.17.0.15 PORT=3306 后 bash deploy/safe-deploy.sh')
except Exception as e:
print(' 172.17.0.15 不可连:', e)
" 2>/dev/null || echo " 跳过 Docker 库测试"
echo ""
echo "=============================================="
if [ "$NG" -le 6 ] && [ "$RT" != "FAIL" ]; then
echo " 系统层: 通过"
else
echo " 系统层: 仍有问题,把本输出全部贴给开发者"
fi
echo ""
echo " 【必做】1Panel 关闭 Python 自动管理,否则还会抢 8001"
echo " 然后手机再试。还卡 = 远程库 gvsds.com:50030 慢,需改本机库"
echo "=============================================="

View File

@@ -1,11 +1,10 @@
# Gunicorn 生产配置systemd 与 1Panel 共用此文件,勿再手写冲突参数 # Gunicorn 生产配置systemd 与 1Panel 共用)
# 安装后: systemctl restart gunicorn-dianjing.service # 远程 MySQL 时 worker×threads 不宜过大,否则打满 DB 连接 → 全站挂起
bind = "127.0.0.1:8001" bind = "127.0.0.1:8001"
# 必须用 gthreadsync 模式下 4 worker 同时只能处理 4 个请求,远程 MySQL 一慢就全站卡死 workers = 4
workers = 6 threads = 2
threads = 4
worker_class = "gthread" worker_class = "gthread"
timeout = 120 timeout = 120
@@ -15,12 +14,9 @@ keepalive = 2
max_requests = 2000 max_requests = 2000
max_requests_jitter = 100 max_requests_jitter = 100
# 禁止输出到 stdout/stderr曾灌满 journal 导致整机卡)
accesslog = None accesslog = None
errorlog = "/tmp/gunicorn-error.log" errorlog = "/tmp/gunicorn-error.log"
loglevel = "warning" loglevel = "warning"
# gthread + MySQL 连接池preload 易在 fork 后出连接问题
preload_app = False preload_app = False
proc_name = "a_long_dianjing_gunicorn" proc_name = "a_long_dianjing_gunicorn"