fix: 降低 gthread 连接数防 MySQL 打满 + 最终一键修复脚本
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
81
deploy/final-fix-all.sh
Normal file
81
deploy/final-fix-all.sh
Normal 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 "=============================================="
|
||||||
@@ -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"
|
||||||
|
|
||||||
# 必须用 gthread:sync 模式下 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"
|
||||||
|
|||||||
Reference in New Issue
Block a user