流量控制功能ok

pull/109/head
Mr Chen 6 years ago
parent 60f1b8a511
commit 4af48a519d
  1. 94
      class/core/site_api.py
  2. 21
      route/site.py
  3. 98
      static/app/site.js

@ -65,6 +65,12 @@ class site_api:
return path[0:-1]
return path
def getHostConf(self, siteName):
return public.getServerDir() + '/openresty/nginx/conf/vhost/' + siteName + '.conf'
def getIndexConf(self):
return public.getServerDir() + '/openresty/nginx/conf/nginx.conf'
def list(self):
_list = public.M('sites').where('', ()).field(
'id,name,path,status,ps,addtime,edate').limit('0,5').order('id desc').select()
@ -129,8 +135,92 @@ class site_api:
public.writeLog('TYPE_SITE', 'SITE_INDEX_SUCCESS', (siteName, index_l))
return public.returnJson(True, '设置成功!')
def getHostConf(self, siteName):
return public.getServerDir() + '/openresty/nginx/conf/vhost/' + siteName + '.conf'
def getLimitNet(self, sid):
siteName = public.M('sites').where("id=?", (sid,)).getField('name')
filename = self.getHostConf(siteName)
# 站点总并发
data = {}
conf = public.readFile(filename)
try:
rep = "\s+limit_conn\s+perserver\s+([0-9]+);"
tmp = re.search(rep, conf).groups()
data['perserver'] = int(tmp[0])
# IP并发限制
rep = "\s+limit_conn\s+perip\s+([0-9]+);"
tmp = re.search(rep, conf).groups()
data['perip'] = int(tmp[0])
# 请求并发限制
rep = "\s+limit_rate\s+([0-9]+)\w+;"
tmp = re.search(rep, conf).groups()
data['limit_rate'] = int(tmp[0])
except:
data['perserver'] = 0
data['perip'] = 0
data['limit_rate'] = 0
return public.getJson(data)
def checkIndexConf(self):
limit = self.getIndexConf()
nginxConf = public.readFile(limit)
limitConf = "limit_conn_zone $binary_remote_addr zone=perip:10m;\n\t\tlimit_conn_zone $server_name zone=perserver:10m;"
nginxConf = nginxConf.replace(
"#limit_conn_zone $binary_remote_addr zone=perip:10m;", limitConf)
public.writeFile(limit, nginxConf)
def saveLimitNet(self, sid, perserver, perip, limit_rate):
str_perserver = 'limit_conn perserver ' + perserver + ';'
str_perip = 'limit_conn perip ' + perip + ';'
str_limit_rate = 'limit_rate ' + limit_rate + 'k;'
siteName = public.M('sites').where("id=?", (sid,)).getField('name')
filename = self.getHostConf(siteName)
conf = public.readFile(filename)
if(conf.find('limit_conn perserver') != -1):
# 替换总并发
rep = "limit_conn\s+perserver\s+([0-9]+);"
conf = re.sub(rep, str_perserver, conf)
# 替换IP并发限制
rep = "limit_conn\s+perip\s+([0-9]+);"
conf = re.sub(rep, str_perip, conf)
# 替换请求流量限制
rep = "limit_rate\s+([0-9]+)\w+;"
conf = re.sub(rep, str_limit_rate, conf)
else:
conf = conf.replace('#error_page 404/404.html;', "#error_page 404/404.html;\n " +
str_perserver + "\n " + str_perip + "\n " + str_limit_rate)
public.writeFile(filename, conf)
public.restartWeb()
public.writeLog('TYPE_SITE', 'SITE_NETLIMIT_OPEN_SUCCESS', (siteName,))
return public.returnJson(True, '设置成功!')
def closeLimitNet(self, sid):
siteName = public.M('sites').where("id=?", (sid,)).getField('name')
filename = self.getHostConf(siteName)
conf = public.readFile(filename)
# 清理总并发
rep = "\s+limit_conn\s+perserver\s+([0-9]+);"
conf = re.sub(rep, '', conf)
# 清理IP并发限制
rep = "\s+limit_conn\s+perip\s+([0-9]+);"
conf = re.sub(rep, '', conf)
# 清理请求流量限制
rep = "\s+limit_rate\s+([0-9]+)\w+;"
conf = re.sub(rep, '', conf)
public.writeFile(filename, conf)
public.restartWeb()
public.writeLog(
'TYPE_SITE', 'SITE_NETLIMIT_CLOSE_SUCCESS', (siteName,))
return public.returnJson(True, '已关闭流量限制!')
def addDomain(self, domain, webname, pid):
pass

@ -53,6 +53,27 @@ def setIndex():
return site_api.site_api().setIndex(sid, index)
@site.route('get_limit_net', methods=['POST'])
def getLimitNet():
sid = request.form.get('id', '').encode('utf-8')
return site_api.site_api().getLimitNet(sid)
@site.route('save_limit_net', methods=['POST'])
def saveLimitNet():
sid = request.form.get('id', '').encode('utf-8')
perserver = request.form.get('perserver', '').encode('utf-8')
perip = request.form.get('perip', '').encode('utf-8')
limit_rate = request.form.get('limit_rate', '').encode('utf-8')
return site_api.site_api().saveLimitNet(sid, perserver, perip, limit_rate)
@site.route('close_limit_net', methods=['POST'])
def closeLimitNet():
sid = request.form.get('id', '').encode('utf-8')
return site_api.site_api().closeLimitNet(sid)
@site.route('get_logs', methods=['POST'])
def getLogs():
siteName = request.form.get('siteName', '').encode('utf-8')

@ -1013,7 +1013,7 @@ function webEdit(id,website,endTime,addtime){
+"<p onclick=\"Rewrite('"+website+"')\" title='"+lan.site.site_menu_4+"'>"+lan.site.site_menu_4+"</p>"
+"<p onclick='setIndexEdit("+id+")' title='默认文档'>默认文档</p>"
+"<p onclick=\"configFile('"+website+"')\" title='"+lan.site.site_menu_6+"'>"+lan.site.site_menu_6+"</p>"
+"<p onclick=\"SetSSL("+id+",'"+website+"')\" title='"+lan.site.site_menu_7+"'>"+lan.site.site_menu_7+"</p>"
+"<p onclick=\"setSSL("+id+",'"+website+"')\" title='"+lan.site.site_menu_7+"'>"+lan.site.site_menu_7+"</p>"
+"<p onclick=\"phpVersion('"+website+"')\" title='"+lan.site.site_menu_8+"'>"+lan.site.site_menu_8+"</p>"
+"<p onclick=\"To301('"+website+"')\" title='"+lan.site.site_menu_10+"'>"+lan.site.site_menu_10+"</p>"
+"<p onclick=\"Proxy('"+website+"')\" title='"+lan.site.site_menu_12+"'>"+lan.site.site_menu_11+"</p>"
@ -1186,7 +1186,7 @@ function UpdateRulelist(){
//流量限制
function limitNet(id){
$.post('site?action=GetLimitNet&id='+id,function(rdata){
$.post('/site/get_limit_net','id='+id, function(rdata){
var status_selected = rdata.perserver != 0?'checked':'';
if(rdata.perserver == 0){
rdata.perserver = 300;
@ -1201,12 +1201,12 @@ function limitNet(id){
+"<option value='6' "+((rdata.perserver == 60)?'selected':'')+">"+lan.site.limit_net_6+"</option>"
+"<option value='7' "+((rdata.perserver == 150)?'selected':'')+">"+lan.site.limit_net_7+"</option>"
var body = "<div class='dirBinding flow c4'>"
+'<p class="label-input-group ptb10"><label style="font-weight:normal"><input type="checkbox" name="status" '+status_selected+' onclick="SaveLimitNet('+id+')" style="width:15px;height:15px;margin-right:5px" />'+lan.site.limit_net_8+'</label></p>'
+'<p class="label-input-group ptb10"><label style="font-weight:normal"><input type="checkbox" name="status" '+status_selected+' onclick="saveLimitNet('+id+')" style="width:15px;height:15px;margin-right:5px" />'+lan.site.limit_net_8+'</label></p>'
+"<p class='line' style='padding:10px 0'><span class='span_tit mr5'>"+lan.site.limit_net_9+":</span><select class='bt-input-text mr20' name='limit' style='width:90px'>"+limitList+"</select></p>"
+"<p class='line' style='padding:10px 0'><span class='span_tit mr5'>"+lan.site.limit_net_10+":</span><input class='bt-input-text mr20' style='width: 90px;' type='number' name='perserver' value='"+rdata.perserver+"' /></p>"
+"<p class='line' style='padding:10px 0'><span class='span_tit mr5'>"+lan.site.limit_net_12+":</span><input class='bt-input-text mr20' style='width: 90px;' type='number' name='perip' value='"+rdata.perip+"' /></p>"
+"<p class='line' style='padding:10px 0'><span class='span_tit mr5'>"+lan.site.limit_net_14+":</span><input class='bt-input-text mr20' style='width: 90px;' type='number' name='limit_rate' value='"+rdata.limit_rate+"' /></p>"
+"<button class='btn btn-success btn-sm mt10' onclick='SaveLimitNet("+id+",1)'>"+lan.public.save+"</button>"
+"<button class='btn btn-success btn-sm mt10' onclick='saveLimitNet("+id+",1)'>"+lan.public.save+"</button>"
+"</div>"
+"<ul class='help-info-text c7 mtb15'><li>"+lan.site.limit_net_11+"</li><li>"+lan.site.limit_net_13+"</li><li>"+lan.site.limit_net_15+"</li></ul>"
$("#webedit-con").html(body);
@ -1259,28 +1259,28 @@ function limitNet(id){
$("input[name='perip']").val(perip);
$("input[name='limit_rate']").val(limit_rate);
});
});
},'json');
}
//保存流量限制配置
function SaveLimitNet(id,type){
function saveLimitNet(id, type){
var isChecked = $("input[name='status']").attr('checked');
if(isChecked == undefined || type == 1){
if(isChecked == undefined || type == 1 ){
var data = 'id='+id+'&perserver='+$("input[name='perserver']").val()+'&perip='+$("input[name='perip']").val()+'&limit_rate='+$("input[name='limit_rate']").val();
var loadT = layer.msg(lan.public.config,{icon:16,time:10000})
$.post('site?action=SetLimitNet',data,function(rdata){
$.post('/site/save_limit_net',data,function(rdata){
layer.close(loadT);
limitNet(id);
layer.msg(rdata.msg,{icon:rdata.status?1:2});
});
},'json');
}else{
var loadT = layer.msg(lan.public.config,{icon:16,time:10000})
$.post('site?action=CloseLimitNet&id='+id,function(rdata){
$.post('/site/close_limit_net',{id:id},function(rdata){
layer.close(loadT);
limitNet(id);
layer.msg(rdata.msg,{icon:rdata.status?1:2});
});
},'json');
}
}
@ -1535,10 +1535,10 @@ function set_cert_ssl(certName,siteName){
}
//宝塔ssl
function SetSSL(id,siteName){
function setSSL(id,siteName){
var mBody = '<div class="tab-nav">\
<span class="on" onclick="BTssl(\'a\','+id+',\''+siteName+'\')">'+lan.site.bt_ssl+'</span>\
<span onclick="BTssl(\'lets\','+id+',\''+siteName+'\')">Let\'s Encrypt</span>\
<span onclick="BTssl(\'a\','+id+',\''+siteName+'\')">'+lan.site.bt_ssl+'</span>\
<span class="on" onclick="BTssl(\'lets\','+id+',\''+siteName+'\')">Let\'s Encrypt</span>\
<span onclick="BTssl(\'other\','+id+',\''+siteName+'\')">'+lan.site.other_ssl+'</span>\
<span class="sslclose" onclick="closeSSL(\''+siteName+'\')">'+lan.public.close+'</span>\
<span id="ssl_admin" onclick="ssl_admin(\''+siteName+'\')">证书夹</span>'
@ -1556,36 +1556,36 @@ function SetSSL(id,siteName){
$(".tab-nav span").click(function(){
$(this).addClass("on").siblings().removeClass("on");
});
var loadT = layer.msg(lan.site.the_msg,{icon:16,time:0,shade: [0.3, '#000']});
$.post('site?action=GetSSL','siteName='+siteName,function(rdata){
layer.close(loadT);
$("#toHttps").attr('checked',rdata.httpTohttps);
switch(rdata.type){
case -1:
$(".tab-nav span").eq(3).addClass("on").siblings().removeClass("on");
var txt = "<div class='mtb15' style='line-height:30px'>"+lan.site.ssl_help_1+"</div>";
$(".tab-con").html(txt);
break;
case 1:
$(".tab-nav span").eq(1).addClass("on").siblings().removeClass("on");
setCookie('letssl',1);
var lets = '<div class="myKeyCon ptb15"><div class="ssl-con-key pull-left mr20">'+lan.site.ssl_key+'<br><textarea id="key" class="bt-input-text" readonly="" style="background-color:#f6f6f6">'+rdata.key+'</textarea></div>'
+ '<div class="ssl-con-key pull-left">'+lan.site.ssl_crt+'<br><textarea id="csr" class="bt-input-text" readonly="" style="background-color:#f6f6f6">'+rdata.csr+'</textarea></div>'
+ '</div>'
+ '<ul class="help-info-text c7 pull-left"><li>'+lan.site.ssl_help_2+'</li><li>'+lan.site.ssl_help_3+'</li></ul>'
$(".tab-con").html(lets);
$(".help-info-text").after("<div class='line mtb15'><button class='btn btn-default btn-sm' onclick=\"OcSSL('CloseSSLConf','"+siteName+"')\" style='margin-left:10px'>"+lan.site.ssl_close+"</button></div>");
break;
case 0:
$(".tab-nav span").eq(2).addClass("on").siblings().removeClass("on");
BTssl('other',id,siteName);
break;
case 2:
$(".tab-nav span").eq(0).addClass("on").siblings().removeClass("on");
BTssl('a',id,siteName);
break;
}
})
// var loadT = layer.msg(lan.site.the_msg,{icon:16,time:0,shade: [0.3, '#000']});
// $.post('/site?action=GetSSL','siteName='+siteName,function(rdata){
// layer.close(loadT);
// $("#toHttps").attr('checked',rdata.httpTohttps);
// switch(rdata.type){
// case -1:
// $(".tab-nav span").eq(3).addClass("on").siblings().removeClass("on");
// var txt = "<div class='mtb15' style='line-height:30px'>"+lan.site.ssl_help_1+"</div>";
// $(".tab-con").html(txt);
// break;
// case 1:
// $(".tab-nav span").eq(1).addClass("on").siblings().removeClass("on");
// setCookie('letssl',1);
// var lets = '<div class="myKeyCon ptb15"><div class="ssl-con-key pull-left mr20">'+lan.site.ssl_key+'<br><textarea id="key" class="bt-input-text" readonly="" style="background-color:#f6f6f6">'+rdata.key+'</textarea></div>'
// + '<div class="ssl-con-key pull-left">'+lan.site.ssl_crt+'<br><textarea id="csr" class="bt-input-text" readonly="" style="background-color:#f6f6f6">'+rdata.csr+'</textarea></div>'
// + '</div>'
// + '<ul class="help-info-text c7 pull-left"><li>'+lan.site.ssl_help_2+'</li><li>'+lan.site.ssl_help_3+'</li></ul>'
// $(".tab-con").html(lets);
// $(".help-info-text").after("<div class='line mtb15'><button class='btn btn-default btn-sm' onclick=\"OcSSL('CloseSSLConf','"+siteName+"')\" style='margin-left:10px'>"+lan.site.ssl_close+"</button></div>");
// break;
// case 0:
// $(".tab-nav span").eq(2).addClass("on").siblings().removeClass("on");
// BTssl('other',id,siteName);
// break;
// case 2:
// $(".tab-nav span").eq(0).addClass("on").siblings().removeClass("on");
// BTssl('a',id,siteName);
// break;
// }
// });
}
//关闭SSL
function closeSSL(siteName){
@ -1919,7 +1919,7 @@ function VerifyDomain(partnerOrderId,siteName){
}
//旧的设置SSL
function SetSSL_old(siteName){
function setSSL_old(siteName){
var loadT = layer.msg(lan.site.the_msg,{icon:16,time:0,shade: [0.3, '#000']});
$.post('site?action=GetSSL','siteName='+siteName,function(rdata){
layer.close(loadT);
@ -1986,7 +1986,7 @@ function OcSSL(action,siteName){
if(!rdata.status){
if(!rdata.out){
layer.msg(rdata.msg,{icon:rdata.status?1:2});
//SetSSL(siteName);
//setSSL(siteName);
return;
}
@ -2004,7 +2004,7 @@ function OcSSL(action,siteName){
setCookie('letssl',0);
$.post('/system?action=ServiceAdmin','name='+getCookie('serverType')+'&type=reload',function(result){
//SetSSL(siteName);
//setSSL(siteName);
if(!result.status) layer.msg(result.msg,{icon:2});
});
layer.msg(rdata.msg,{icon:rdata.status?1:2});
@ -2036,7 +2036,7 @@ function newSSL(siteName,domains){
if(!rdata.out){
layer.msg(rdata.msg,{icon:rdata.status?1:2});
//SetSSL(siteName);
//setSSL(siteName);
return;
}
@ -2053,7 +2053,7 @@ function newSSL(siteName,domains){
function SaveSSL(siteName){
var data = 'type=1&siteName='+siteName+'&key='+encodeURIComponent($("#key").val())+'&csr='+encodeURIComponent($("#csr").val());
var loadT = layer.msg(lan.site.saving_txt,{icon:16,time:20000,shade: [0.3, '#000']})
$.post('site?action=SetSSL',data,function(rdata){
$.post('site?action=setSSL',data,function(rdata){
layer.close(loadT);
if(rdata.status){
layer.msg(rdata.msg,{icon:1});

Loading…
Cancel
Save