From 01ffbdf478875c098a8b861cd149fc38e605f2d9 Mon Sep 17 00:00:00 2001 From: XingQue Date: Thu, 9 Jul 2026 05:12:23 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=99=8D=E4=BD=8E=20gthread=20=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=E6=95=B0=E9=98=B2=20MySQL=20=E6=89=93=E6=BB=A1=20+=20?= =?UTF-8?q?=E6=9C=80=E7=BB=88=E4=B8=80=E9=94=AE=E4=BF=AE=E5=A4=8D=E8=84=9A?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- deploy/final-fix-all.sh | 81 +++++++++++++++++++++++++++++++++++++++++ gunicorn.conf.py | 12 ++---- 2 files changed, 85 insertions(+), 8 deletions(-) create mode 100644 deploy/final-fix-all.sh diff --git a/deploy/final-fix-all.sh b/deploy/final-fix-all.sh new file mode 100644 index 0000000..fe09949 --- /dev/null +++ b/deploy/final-fix-all.sh @@ -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 "==============================================" diff --git a/gunicorn.conf.py b/gunicorn.conf.py index ee5de2a..df43e3e 100644 --- a/gunicorn.conf.py +++ b/gunicorn.conf.py @@ -1,11 +1,10 @@ -# Gunicorn 生产配置(systemd 与 1Panel 共用此文件,勿再手写冲突参数) -# 安装后: systemctl restart gunicorn-dianjing.service +# Gunicorn 生产配置(systemd 与 1Panel 共用) +# 远程 MySQL 时 worker×threads 不宜过大,否则打满 DB 连接 → 全站挂起 bind = "127.0.0.1:8001" -# 必须用 gthread:sync 模式下 4 worker 同时只能处理 4 个请求,远程 MySQL 一慢就全站卡死 -workers = 6 -threads = 4 +workers = 4 +threads = 2 worker_class = "gthread" timeout = 120 @@ -15,12 +14,9 @@ keepalive = 2 max_requests = 2000 max_requests_jitter = 100 -# 禁止输出到 stdout/stderr(曾灌满 journal 导致整机卡) accesslog = None errorlog = "/tmp/gunicorn-error.log" loglevel = "warning" - -# gthread + MySQL 连接池:preload 易在 fork 后出连接问题 preload_app = False proc_name = "a_long_dianjing_gunicorn"