流量控制功能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. 96
      static/app/site.js

@ -65,6 +65,12 @@ class site_api:
return path[0:-1] return path[0:-1]
return path 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): def list(self):
_list = public.M('sites').where('', ()).field( _list = public.M('sites').where('', ()).field(
'id,name,path,status,ps,addtime,edate').limit('0,5').order('id desc').select() '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)) public.writeLog('TYPE_SITE', 'SITE_INDEX_SUCCESS', (siteName, index_l))
return public.returnJson(True, '设置成功!') return public.returnJson(True, '设置成功!')
def getHostConf(self, siteName): def getLimitNet(self, sid):
return public.getServerDir() + '/openresty/nginx/conf/vhost/' + siteName + '.conf' 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): def addDomain(self, domain, webname, pid):
pass pass

@ -53,6 +53,27 @@ def setIndex():
return site_api.site_api().setIndex(sid, index) 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']) @site.route('get_logs', methods=['POST'])
def getLogs(): def getLogs():
siteName = request.form.get('siteName', '').encode('utf-8') 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=\"Rewrite('"+website+"')\" title='"+lan.site.site_menu_4+"'>"+lan.site.site_menu_4+"</p>"
+"<p onclick='setIndexEdit("+id+")' title='默认文档'>默认文档</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=\"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=\"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=\"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>" +"<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){ 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':''; var status_selected = rdata.perserver != 0?'checked':'';
if(rdata.perserver == 0){ if(rdata.perserver == 0){
rdata.perserver = 300; 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='6' "+((rdata.perserver == 60)?'selected':'')+">"+lan.site.limit_net_6+"</option>"
+"<option value='7' "+((rdata.perserver == 150)?'selected':'')+">"+lan.site.limit_net_7+"</option>" +"<option value='7' "+((rdata.perserver == 150)?'selected':'')+">"+lan.site.limit_net_7+"</option>"
var body = "<div class='dirBinding flow c4'>" 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_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_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_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>" +"<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>" +"</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>" +"<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); $("#webedit-con").html(body);
@ -1259,28 +1259,28 @@ function limitNet(id){
$("input[name='perip']").val(perip); $("input[name='perip']").val(perip);
$("input[name='limit_rate']").val(limit_rate); $("input[name='limit_rate']").val(limit_rate);
}); });
}); },'json');
} }
//保存流量限制配置 //保存流量限制配置
function SaveLimitNet(id,type){ function saveLimitNet(id, type){
var isChecked = $("input[name='status']").attr('checked'); 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 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}) 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); layer.close(loadT);
limitNet(id); limitNet(id);
layer.msg(rdata.msg,{icon:rdata.status?1:2}); layer.msg(rdata.msg,{icon:rdata.status?1:2});
}); },'json');
}else{ }else{
var loadT = layer.msg(lan.public.config,{icon:16,time:10000}) 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); layer.close(loadT);
limitNet(id); limitNet(id);
layer.msg(rdata.msg,{icon:rdata.status?1:2}); layer.msg(rdata.msg,{icon:rdata.status?1:2});
}); },'json');
} }
} }
@ -1535,10 +1535,10 @@ function set_cert_ssl(certName,siteName){
} }
//宝塔ssl //宝塔ssl
function SetSSL(id,siteName){ function setSSL(id,siteName){
var mBody = '<div class="tab-nav">\ var mBody = '<div class="tab-nav">\
<span class="on" onclick="BTssl(\'a\','+id+',\''+siteName+'\')">'+lan.site.bt_ssl+'</span>\ <span onclick="BTssl(\'a\','+id+',\''+siteName+'\')">'+lan.site.bt_ssl+'</span>\
<span onclick="BTssl(\'lets\','+id+',\''+siteName+'\')">Let\'s Encrypt</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 onclick="BTssl(\'other\','+id+',\''+siteName+'\')">'+lan.site.other_ssl+'</span>\
<span class="sslclose" onclick="closeSSL(\''+siteName+'\')">'+lan.public.close+'</span>\ <span class="sslclose" onclick="closeSSL(\''+siteName+'\')">'+lan.public.close+'</span>\
<span id="ssl_admin" onclick="ssl_admin(\''+siteName+'\')">证书夹</span>' <span id="ssl_admin" onclick="ssl_admin(\''+siteName+'\')">证书夹</span>'
@ -1556,36 +1556,36 @@ function SetSSL(id,siteName){
$(".tab-nav span").click(function(){ $(".tab-nav span").click(function(){
$(this).addClass("on").siblings().removeClass("on"); $(this).addClass("on").siblings().removeClass("on");
}); });
var loadT = layer.msg(lan.site.the_msg,{icon:16,time:0,shade: [0.3, '#000']}); // var loadT = layer.msg(lan.site.the_msg,{icon:16,time:0,shade: [0.3, '#000']});
$.post('site?action=GetSSL','siteName='+siteName,function(rdata){ // $.post('/site?action=GetSSL','siteName='+siteName,function(rdata){
layer.close(loadT); // layer.close(loadT);
$("#toHttps").attr('checked',rdata.httpTohttps); // $("#toHttps").attr('checked',rdata.httpTohttps);
switch(rdata.type){ // switch(rdata.type){
case -1: // case -1:
$(".tab-nav span").eq(3).addClass("on").siblings().removeClass("on"); // $(".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>"; // var txt = "<div class='mtb15' style='line-height:30px'>"+lan.site.ssl_help_1+"</div>";
$(".tab-con").html(txt); // $(".tab-con").html(txt);
break; // break;
case 1: // case 1:
$(".tab-nav span").eq(1).addClass("on").siblings().removeClass("on"); // $(".tab-nav span").eq(1).addClass("on").siblings().removeClass("on");
setCookie('letssl',1); // 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>' // 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 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>' // + '</div>'
+ '<ul class="help-info-text c7 pull-left"><li>'+lan.site.ssl_help_2+'</li><li>'+lan.site.ssl_help_3+'</li></ul>' // + '<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); // $(".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>"); // $(".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; // break;
case 0: // case 0:
$(".tab-nav span").eq(2).addClass("on").siblings().removeClass("on"); // $(".tab-nav span").eq(2).addClass("on").siblings().removeClass("on");
BTssl('other',id,siteName); // BTssl('other',id,siteName);
break; // break;
case 2: // case 2:
$(".tab-nav span").eq(0).addClass("on").siblings().removeClass("on"); // $(".tab-nav span").eq(0).addClass("on").siblings().removeClass("on");
BTssl('a',id,siteName); // BTssl('a',id,siteName);
break; // break;
} // }
}) // });
} }
//关闭SSL //关闭SSL
function closeSSL(siteName){ function closeSSL(siteName){
@ -1919,7 +1919,7 @@ function VerifyDomain(partnerOrderId,siteName){
} }
//旧的设置SSL //旧的设置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']}); var loadT = layer.msg(lan.site.the_msg,{icon:16,time:0,shade: [0.3, '#000']});
$.post('site?action=GetSSL','siteName='+siteName,function(rdata){ $.post('site?action=GetSSL','siteName='+siteName,function(rdata){
layer.close(loadT); layer.close(loadT);
@ -1986,7 +1986,7 @@ function OcSSL(action,siteName){
if(!rdata.status){ if(!rdata.status){
if(!rdata.out){ if(!rdata.out){
layer.msg(rdata.msg,{icon:rdata.status?1:2}); layer.msg(rdata.msg,{icon:rdata.status?1:2});
//SetSSL(siteName); //setSSL(siteName);
return; return;
} }
@ -2004,7 +2004,7 @@ function OcSSL(action,siteName){
setCookie('letssl',0); setCookie('letssl',0);
$.post('/system?action=ServiceAdmin','name='+getCookie('serverType')+'&type=reload',function(result){ $.post('/system?action=ServiceAdmin','name='+getCookie('serverType')+'&type=reload',function(result){
//SetSSL(siteName); //setSSL(siteName);
if(!result.status) layer.msg(result.msg,{icon:2}); if(!result.status) layer.msg(result.msg,{icon:2});
}); });
layer.msg(rdata.msg,{icon:rdata.status?1:2}); layer.msg(rdata.msg,{icon:rdata.status?1:2});
@ -2036,7 +2036,7 @@ function newSSL(siteName,domains){
if(!rdata.out){ if(!rdata.out){
layer.msg(rdata.msg,{icon:rdata.status?1:2}); layer.msg(rdata.msg,{icon:rdata.status?1:2});
//SetSSL(siteName); //setSSL(siteName);
return; return;
} }
@ -2053,7 +2053,7 @@ function newSSL(siteName,domains){
function SaveSSL(siteName){ function SaveSSL(siteName){
var data = 'type=1&siteName='+siteName+'&key='+encodeURIComponent($("#key").val())+'&csr='+encodeURIComponent($("#csr").val()); 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']}) 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); layer.close(loadT);
if(rdata.status){ if(rdata.status){
layer.msg(rdata.msg,{icon:1}); layer.msg(rdata.msg,{icon:1});

Loading…
Cancel
Save