apple / bt-source /panel /mod /project /node /loadutil /load_check.py
GGSheng's picture
feat: deploy to hf space | model=claude-72604b
62f6d9a verified
Raw
History Blame Contribute Delete
5.16 kB
import os.path
from typing import Callable
import psutil
from mod.project.node.dbutil import HttpNode, LoadSite, TcpNode
from mod.project.node.nodeutil import ServerNode, LocalNode
from .nginx_utils import NginxUtils
from .request_check import RequestChecker
def check_http_node(node:HttpNode, main_domain, log_call:Callable[[str], None]) -> str:
srv = ServerNode.new_by_id(node.node_id)
if not srv:
return "无法连接到目标节点的机器"
if srv.is_local:
return _check_local_http_node(node, main_domain, log_call)
if node.node_site_id != -1:
if not node.node_site_id:
log_call("负载服务节点:{}不存在,即将在目标机器创建网站!".format(node.node_site_name))
site_id, err = srv.create_php_site(node.node_site_name, node.port)
if err:
return "无法在目标节点{}的机器创建网站:{}".format(srv.show_name(), err)
node.node_site_id = site_id
log_call("成功创建网站:{}".format(node.node_site_name))
if srv and node.node_site_name != main_domain and main_domain!="" and not srv.has_domain(node.node_site_id, main_domain):
log_call("负载服务节点:{}的域名与主域名不一致,即将把主域名添加至目标机器".format(node.node_site_name))
flag, msg = srv.add_domain(node.node_site_id, node.node_site_name, main_domain, node.port)
if not flag:
return "无法在目标节点{}的机器更新域名".format(srv.show_name())
log_call("成功更新域名:{}".format(node.node_site_name))
log_call("开始检查负载服务节点:{}访问情况".format(node.node_site_name))
if not RequestChecker.check_http_node(node):
if node.port in (80, 443):
return "无法访问负载服务节点:{}".format(node.node_site_name)
log_call("负载服务节点:{}访问失败,将尝试在目标机器放行防火墙端口".format(node.node_site_name))
flag, msg = srv.set_firewall_open(node.port, "tcp")
if not flag:
return "无法在目标节点{}的机器放行端口:{}".format(srv.show_name(), node.port)
if not RequestChecker.check_http_node(node):
return "无法访问负载服务节点:{}".format(node.node_site_name)
log_call("负载服务节点:{}访问成功".format(node.node_site_name))
return ""
def _check_local_http_node(node:HttpNode, main_domain, log_call:Callable[[str], None]) -> str:
srv = LocalNode()
if main_domain != "" and main_domain == node.node_site_name:
return "使用本机节点作为负载服务节点时,网站域名不能与主域名一致"
if node.port in (80, 443):
return "使用本机节点作为负载服务节点时,端口不能为80或443"
if not node.node_site_id:
log_call("负载服务节点:{}不存在,即将在本机创建网站!".format(node.node_site_name))
site_id, err = srv.create_php_site(node.node_site_name, node.port, ps="负载均衡:{}【子站点】".format(main_domain))
if err:
return "无法在目标节点{}的机器创建网站:{}".format(srv.show_name(), err)
node.node_site_id = site_id
log_call("成功创建网站:{}".format(node.node_site_name))
else:
srv.add_domain(node.node_site_id, node.node_site_name, node.node_site_name, node.port)
return ""
def check_http_load_data(load:LoadSite, log_call:Callable[[str], None]):
if not load.site_id:
log_call("主节点网站:{}不存在,即将在本机创建网站!".format(load.site_name))
site_id, err = LocalNode().create_php_site(site_name=load.site_name, ps="负载均衡:{}【主站点】".format(load.ps))
if err:
return "无法在本机创建网站:{}".format(err)
load.site_id = site_id
if LocalNode.site_proxy_list(load.site_name):
return "当前选择的主节点网站存在反向代理配置,无法为其设置负载均衡"
if load.http_config["http_alg"] == "sticky_cookie":
if not NginxUtils.has_sticky_module():
return "负载均衡的cookie会话跟随,需要Nginx安装sticky-module模块,您可以尝试在【软件商店】更新、重装或切换Nginx版本"
def check_tcp_load_data(load: LoadSite, log_call: Callable[[str], None]) -> str:
# 检查是否出现端口占用
for conn in psutil.net_connections():
if conn.status == 'LISTEN' and conn.laddr.port == load.tcp_config["port"]:
pid = conn.pid
if psutil.Process(pid).exe().find("nginx") == -1:
return "端口{}被占用,请注意是否影响nginx启动".format(load.tcp_config["port"])
return ""
def check_tcp_node(tcp_node: TcpNode, log_call: Callable[[str], None]):
log_call("开始检查负载服务节点:{}:{}访问情况".format(tcp_node.host, tcp_node.port))
if not RequestChecker.check_tcp_node(tcp_node):
return "无法访问负载服务节点:{}:{}".format(tcp_node.host, tcp_node.port)
return ""