听一个前辈说,要成为一个好的程序员,就要养成写博客的习惯,所以我就来啦,这是我写的第一篇哦!
目前公司是做汽车电子研发的,还没有官网
于是我就抽空写了一个,也就普通的静态页面啦,不过是用Vue写的哦
整个资源有12M,然后就上传到服务器吧,于是就遇到一个问题:
一开始用的固定宽带,2M带宽,一天2.4元左右
好处是不限流量,缺点是很慢,这我就不能忍了
那就看看按流量计费,1GB是0.8元,再加0.02/h的一个费用,
然后我分析了一下,我的网页打开一次12M,打开100次都不超过2G流量
一个普通公司的官网一天打开100来次应该差不多了吧
也就是2G流量就是0.8*2+0.02*24=2.08元,有时也可能连1G都不会超过,
按流量计费最大的一个好处就是:带宽任意换,1M-500M,并且不会增加费用!
那么问题来了,要是有人恶意刷我网站,那我的流量岂不是分分钟爆表!
还好自己学了几天Python,别人去撸妹子,我在家撸代码,终于Python小有所成~
我的服务器是Ubuntu16.4的,听说专业的用红帽,我反正也不是专业后端,无所谓了
/proc/net/dev这个文件里面记录的就是网络的一些信息,打开可以看到
所以只要读取这个文件就能监控网络了,下面上代码:
#!/usr/local/bin/python
# coding=utf-8
import time
import os
import curses
import locale
import subprocess
# 最大流量值,单位MB
max_traffic = 1024
# 去除空字符串的函数
def not_empty(s):
return s and s.strip()
# 终端显示行数
def line_add():
global line_y
line_y += 1
return line_y
# 开启或者关闭服务器
def net_switch(cmd, msg):
global log
subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
log.addstr(line_add(), 0, time.strftime("%Y-%m-%d %H:%M:%S") + ":" + msg + "\n", curses.A_UNDERLINE)
log.refresh()
log.move(line_y, 0)
# 固定顶部的状态
def top_msg(val):
global log
global max_traffic
log.addstr(0, 0, time.strftime("%Y-%m-%d %H:%M:%S") + ":当前已使用流量:" + str(val) + "MB, 剩余流量:" + str(
max_traffic - val) + "MB \n", curses.A_REVERSE)
log.refresh()
log.move(line_y, 0)
# 返回流量值
def getTraffic():
netDev = open("/proc/net/dev", "r")
netDevData = netDev.readlines()
# 本地流量
netDevDataListLo = netDevData[2].split(" ")
trafficLo = int(filter(not_empty, netDevDataListLo)[1]) + int(filter(not_empty, netDevDataListLo)[9])
# print(trafficLo)
# 网卡流量
netDevDataListEnp = netDevData[3].split(" ")
trafficEnp = int(filter(not_empty, netDevDataListEnp)[1]) + int(filter(not_empty, netDevDataListEnp)[9])
# print(trafficEnp)
# 总流量,并换算成MB
traffic_MB = ((trafficLo + trafficEnp) / 1024) / 1024
# print(traffic_MB)
netDev.close()
return traffic_MB
locale.setlocale(locale.LC_ALL, '')
log = curses.initscr()
line_y = 1
# 暂时做了死循环,只能强制退出!
while True:
traffic_out = getTraffic()
day = int(time.strftime("%j"))
net_state = len(os.popen("ifconfig").readlines())
if net_state < 12:
net_switch("/etc/init.d/networking start", "网络服务已成功开启!")
while True:
time.sleep(3)
if day == int(time.strftime("%j")):
traffic = getTraffic() - traffic_out
top_msg(traffic)
if traffic > max_traffic:
net_state_out = len(os.popen("ifconfig").readlines())
if net_state_out > 8:
net_switch("/etc/init.d/networking stop", "网络服务已成功关闭!")
else:
break
终端需要切换到root用户!
逻辑就是读取网络信息,判断流量超了之后给终端发送指令关闭网络服务
终端显示上做了一些个性化的配置,
我把网卡流量和local流量加一起算了,谁知道阿里云的流量是怎么统计的呢
每3秒判断一次,当天超了就关闭流量,第二天又重新开始
关闭网络服务的指令有很多我这用了“/etc/init.d/networking start/stop”,你也可以关掉nginx,或者给某个端口开防火墙
max_traffic = ??,是设置流量的上限,因为3秒一次,可能会在下一次循环时超出了最大值,所以1GB流量可以设置为1000,或更小
感谢阅读我的博客,希望能给你有所帮助,以后写了有意思的东西还会贴出来分享的哦