首页
关于道锋
工具
友情链接
公告栏
麟图图床
麟云文件
麟云KMS
Search
1
兽装曲腿制作文档
909 阅读
2
Frpc使用XTCP不通过服务器传输
782 阅读
3
CloudFront CDN配置教程
566 阅读
4
NTP放大反射攻击扫描列表教程
427 阅读
5
优化你的Typecho禁止F12和查看源码
289 阅读
默认
科学
热力学
Furry
小说
星河野望
手工制作
道具制作
音影
图像工具
计算机
渗透
硬件
编程
网络
记录
AI人工智能
CVE
软件工具
装机教程
C/C++
C#
Go
HTML5+JS+CSS
JAVA
Lua
Rust
PHP
Python2/3
Nodejs
编译
C/C++学习日志
Golang学习日志
Rust开发技巧
Rust学习日志
Rust开发教程
Nonebot2机器人框架
python开发教程
python开发技巧
Python学习日志
ai绘画
电子电路
电路设计
PCB打板
制作实战
无线电
摄影
运维
WEB
KVM云计算
docker
Ansible
代码管理
Kubernetes
Linux
MySQL
shell
集群
Zabbix
Prometheus
数据安全
Redis
istio
ELK
Nginx
Apache
Tomcat
Elasticsearch
Logstash
Kibana
测评
服务器
登录
Search
标签搜索
开源
源码
教程
服务器
环境搭建
摄影
rustlang
Rust
VS CODE
v2ray
bbr
加速
网络优化
拥塞控制
CloudFront教程
CF教程
AWS教程
CloudFront接入
Frpc
Frps
道锋潜鳞
累计撰写
446
篇文章
累计收到
67
条评论
首页
栏目
默认
科学
热力学
Furry
小说
星河野望
手工制作
道具制作
音影
图像工具
计算机
渗透
硬件
编程
网络
记录
AI人工智能
CVE
软件工具
装机教程
C/C++
C#
Go
HTML5+JS+CSS
JAVA
Lua
Rust
PHP
Python2/3
Nodejs
编译
C/C++学习日志
Golang学习日志
Rust开发技巧
Rust学习日志
Rust开发教程
Nonebot2机器人框架
python开发教程
python开发技巧
Python学习日志
ai绘画
电子电路
电路设计
PCB打板
制作实战
无线电
摄影
运维
WEB
KVM云计算
docker
Ansible
代码管理
Kubernetes
Linux
MySQL
shell
集群
Zabbix
Prometheus
数据安全
Redis
istio
ELK
Nginx
Apache
Tomcat
Elasticsearch
Logstash
Kibana
测评
服务器
页面
关于道锋
工具
友情链接
公告栏
友人
PCD-01’s Blog
iMin博客
特资啦!个人资源分享站
黎洛云综合门户网站
1mxy笔记
三石的记录
咬一口激动的鱼
温瞳's Blog
中二病晚期の物語
奇梦博客
布丁の小窝
道麟笔记
小林笔记
迷失的小K
koto's Site
Abyss-博客
西西のBlog
麟图图床
麟云文件
麟云KMS
搜索到
30
篇与
的结果
2023-03-11
nginx安装
nginx安装
2023年03月11日
61 阅读
0 评论
0 点赞
2023-03-11
Nginx url 重写
Nginx url 重写
2023年03月11日
32 阅读
0 评论
0 点赞
2023-03-11
NGINX 虚拟主机
NGINX 虚拟主机
2023年03月11日
22 阅读
0 评论
0 点赞
2023-03-11
nginx 下载限速
nginx 下载限速
2023年03月11日
34 阅读
0 评论
0 点赞
2023-03-11
nginx 默认网站
nginx 默认网站
2023年03月11日
22 阅读
0 评论
0 点赞
2023-03-11
nginx 反向代理
nginx 反向代理
2023年03月11日
23 阅读
0 评论
0 点赞
2021-07-05
Nginx+Lua实现Websocket实时网卡流量推送
首先我们先了解一下Linux系统获取网络流量的几种方法1.基于sysfs虚拟文件系统,这是由内核用来将设备或驱动相关的信息输出到用户空间的一种机制。网络接口的相关分析数据会通过“/sys/class/net/<ethX>/statistics”输出。加之Linux提供了LKM机制可以使我们在内核空间工作,在LKM机制中一个重要的组成部分就是proc伪文件系统,它为用户提供了动态操作Linux内核信息的接口,是除系统调用之外另一个重要的Linux内核空间与用户空间交换数据的途径。如:/sys/class/net/eth0/statistics/rx_packets: 收到的数据包数据/sys/class/net/eth0/statistics/tx_packets: 传输的数据包数量/sys/class/net/eth0/statistics/rx_bytes: 接收的字节数/sys/class/net/eth0/statistics/tx_bytes: 传输的字节数/sys/class/net/eth0/statistics/rx_dropped: 当收到包数据包下降的数据量/sys/class/net/eth0/statistics/tx_dropped: 传输包数据包下降的数据量2.sarsar命令包含在sysstat工具包中,提供系统的众多统计数据。其在不同的系统上命令有些差异,某些系统提供的sar支持基于网络接口的数据统计,也可以查看设备上每秒收发包的个数和流量。3./proc/net/dev本文使用的是方法1,即为通过定时读取/sys/class/net/eth0/statistics/xxx文件的内容,来进行计算,获取最终的网络带宽使用lua 的io库进行读文件操作file_rx = io. open ( "/sys/class/net/eth0/statistics/rx_bytes" , "r" ) file_tx = io. open ( "/sys/class/net/eth0/statistics/tx_bytes" , "r" ) local tx1 = file_tx : read ( "*l" ) local rx1 = file_rx : read ( "*l" )获得秒初的网络数据包数量进而通过ngx.sleep进行非阻塞的等待一秒后再次读取文件中的数据包数量ngx.sleep (1) file_rx :seek( "set" ) file_tx :seek( "set" ) local tx2 = file_tx : read ( "*l" ) local rx2 = file_rx : read ( "*l" )这样,获得了秒末的数据包数量将秒末的数据包数量减去秒初的数据包数量。即为秒内的网络流动数据包数量因为每个数据大小为8个字节,因此,得出的结果*8就是每秒字节数,进而可以通过多次除去1024得道千字节数,兆字节数等local tx = (tx2-tx1)*8 local rx = (rx2-rx1)*8 --and --tx = tx/1024/1024 --mbps --rx = rx/1024/1024 --mbps--核心代码实现 function read_network(types) file_rx = io. open ( "/sys/class/net/eth0/statistics/rx_bytes" , "r" ) file_tx = io. open ( "/sys/class/net/eth0/statistics/tx_bytes" , "r" ) local tx1 = file_tx : read ( "*l" ) local rx1 = file_rx : read ( "*l" ) ngx.sleep (1) file_rx :seek( "set" ) file_tx :seek( "set" ) local tx2 = file_tx : read ( "*l" ) local rx2 = file_rx : read ( "*l" ) local tx = (tx2-tx1)*8 local rx = (rx2-rx1)*8 mb = {time=ngx.now()} if (types == 1) then if (rx<10000) then mb["rx"]=rx mb["rx_mode"]="bps" elseif(rx<10000000) then rx = rx/1024 mb["rx"]=rx mb["rx_mode"]="Kbps" elseif(rx<10000000000) then rx = rx/1024/1024 mb["rx"]=rx mb["rx_mode"]="Mbps" elseif(rx<10000000000000) then rx = rx/1024/1024/1024 mb["rx"]=rx mb["rx_mode"]="Gbps" end if (tx<10000) then mb["tx"]=tx mb["tx_mode"]="bps" elseif(tx<10000000) then tx = tx/1024 mb["tx"]=tx mb["tx_mode"]="Kbps" elseif(tx<10000000000) then tx = tx/1024/1024 mb["tx"]=tx mb["tx_mode"]="Mbps" elseif(tx<10000000000000) then tx = tx/1024/1024/1024 mb["tx"]=tx mb["tx_mode"]="Gbps" end elseif(types == 2) then mb["tx"]=tx/1024/1024 mb["tx_mode"]="Mbps" mb["rx"]=rx/1024/1024 mb["rx_mode"]="Mbps" else mb["tx"]=tx mb["tx_mode"]="bps" mb["rx"]=rx mb["rx_mode"]="bps" end file_rx :close() file_tx :close() return mb end因为将要使用websocket进行实时的数据传输,我们需要安装支持resty.websocket的扩展库,openresty用户默认就有,非openresty用户可前往https://github.com/openresty/lua-resty-websocket安装库安装过程可参考https://www.cnblogs.com/scotoma/p/3330190.htmlwebsocket相关代码local server = require "resty.websocket.server" local wb, err = server:new{ timeout = 50000, -- in milliseconds max_payload_len = 6553500, } if not wb then ngx.log(ngx.ERR, "failed to new websocket: ", err) return ngx.exit(444) end bytes, err = wb:send_text(json.encode({Msg="Connect OK,Service will traceback the traffic data soon",code = "OK"})) if not bytes then ngx.log(ngx.ERR, "failed to send a text frame: ", err) end while (1) do bytes, err = wb:send_text(json.encode(read_network(types,pod))) if not bytes then ngx.log(ngx.ERR, "failed to send a text frame: ", err) end end全部完整代码json = require "cjson" ngx.update_time() local server = require "resty.websocket.server" local wb, err = server:new{ timeout = 50000, -- in milliseconds max_payload_len = 6553500, } if not wb then ngx.log(ngx.ERR, "failed to new websocket: ", err) return ngx.exit(444) end function read_network(types) file_rx = io. open ( "/sys/class/net/eth0/statistics/rx_bytes" , "r" ) file_tx = io. open ( "/sys/class/net/eth0/statistics/tx_bytes" , "r" ) local tx1 = file_tx : read ( "*l" ) local rx1 = file_rx : read ( "*l" ) ngx.sleep (1) file_rx :seek( "set" ) file_tx :seek( "set" ) local tx2 = file_tx : read ( "*l" ) local rx2 = file_rx : read ( "*l" ) local tx = (tx2-tx1)*8 local rx = (rx2-rx1)*8 mb = {time=ngx.now()} if (types == 1) then if (rx<10000) then mb["rx"]=rx mb["rx_mode"]="bps" elseif(rx<10000000) then rx = rx/1024 mb["rx"]=rx mb["rx_mode"]="Kbps" elseif(rx<10000000000) then rx = rx/1024/1024 mb["rx"]=rx mb["rx_mode"]="Mbps" elseif(rx<10000000000000) then rx = rx/1024/1024/1024 mb["rx"]=rx mb["rx_mode"]="Gbps" end if (tx<10000) then mb["tx"]=tx mb["tx_mode"]="bps" elseif(tx<10000000) then tx = tx/1024 mb["tx"]=tx mb["tx_mode"]="Kbps" elseif(tx<10000000000) then tx = tx/1024/1024 mb["tx"]=tx mb["tx_mode"]="Mbps" elseif(tx<10000000000000) then tx = tx/1024/1024/1024 mb["tx"]=tx mb["tx_mode"]="Gbps" end elseif(types == 2) then mb["tx"]=tx/1024/1024 mb["tx_mode"]="Mbps" mb["rx"]=rx/1024/1024 mb["rx_mode"]="Mbps" else mb["tx"]=tx mb["tx_mode"]="bps" mb["rx"]=rx mb["rx_mode"]="bps" end file_rx :close() file_tx :close() return mb end local types = tonumber(ngx.var.arg_types) or 0 local pod = ngx.var.arg_pod or "tx" bytes, err = wb:send_text(json.encode({Msg="Connect OK,Service will traceback the traffic data soon",code = "OK"})) if not bytes then ngx.log(ngx.ERR, "failed to send a text frame: ", err) end while (1) do bytes, err = wb:send_text(json.encode(read_network(types,pod))) if not bytes then ngx.log(ngx.ERR, "failed to send a text frame: ", err) end end详细项目地址https://gitee.com/daofengql/lua-websocket-real-time-network-traffic到此,lua部分已经编写完毕,接下来就要在nginx中配置配置文件来接入路由样例conflocation / { #路由名称具实际修改 #lua_code_cache off; default_type text/html; add_header 'Access-Control-Allow-Origin' *; content_by_lua_file /data/traffic.lua;#文件存放地址更具实际修改 } 配置完成后,如果不出意外,重载NGINX之后,可以使用在线websocket测试,测试服务推送出去,客户端收到的是json字符,可以再对其转化为字典对象等可以进一步将项目仓库内的html目录下的页面进行适当的修改和部署计数器核心功能代码<script language="JavaScript"> $(function () { var chart; var previous = null; var chart; // global var pointx = null; var ip = "180.188.16.147"; $(window).load(function () { initiateChart("L4dstat"); //parseFile(); }); var server = 'wss://ws.jcdpn.cn/?types=2'; var ws = new WebSocket(server); var temp_arr = [0.1]; var max_bps = 0.1; ws.onclose = function () { reconnect(service); }; ws.onmessage = function (evt) { data = JSON.parse(evt.data); temp_arr.push(data.rx); max_bps = Math.max.apply(null, temp_arr); temp_arr = [0.1]; var series = chart.series[0], shift = series.data.length > 20; chart.series[0].addPoint([Math.floor($.now()), max_bps], true, shift); max_bps = 0.1; }; function initiateChart(divid) { var options = { plotOptions: { series: { events: { legendItemClick: function (event) { event.preventDefault(); } } } }, chart: { zoomType: '', renderTo: divid, style: { fontFamily: "'Unica One', sans-serif" }, //plotBorderColor: '#606063' backgroundColor: '#e2e3e5', }, //title:{ // text: null // }, title: { text: '» '+ip+'核心流量计数器 «', }, xAxis: { type: 'datetime', dateTimeLabelFormats: { day: '%a' } }, yAxis: { minPadding: 0.2, maxPadding: 0.2, title: { text: 'Mb/秒', margin: 80 } }, credits: { enabled: false }, series: [{ type: 'area', //shadowSize: 0, name: 'Mbps/秒', color: '#164791', data: [] }] }; chart = new Highcharts.Chart(options); } }); </script>例如将默认的socket地址改成自己的流量计数器默认使用的单位为mbps,其他单位还需要自己修改和换算流量计数器使用highcharts.js来进行表格绘制效果
2021年07月05日
66 阅读
0 评论
0 点赞
2021-03-07
OpenResty-Lua之连接MySQL数据库
连接MySQL local mysql = require "resty.mysql" local db, err = mysql:new() if not db then ngx.say("failed to instantiate mysql: ", err) return end db:set_timeout(1000) --1 sec local ok, err, errno, sqlstate = db:connect{ host = "127.0.0.1", port = 3306, database = "test", user = "root", password = "vagrant", max_packet_size = 1024*1024 } if not ok then ngx.say("failed to connect: ",err, ":", errno, " ", sqlstate) return end res, err, errno, sqlstate = db:query("create table cats" .. "(id serial primary key, " .."name varchar(5))") if not res then ngx.say("bad result: ", err, ": ", errno, ":", sqlstate, ".") return end ngx.say("table cats created.") res, err, errno, sqlstate = db:query("insert into cats (name) " .. "values (\'Bob\'),(\'\'),(null)") if not res then ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".") return end样例2:local db, err = env:new() if not db then --错误处理 ngx.say(err) return end --设置超时 db:set_timeout(1000) --设置链接信息 local ok, err ,errcode ,sqlstate = db:connect{ database ="root",user = "root",password = "root",host = "127.0.0.1",port = 3306,charset = "utf8",max_packaget_size = 2048 * 2048 } --数据库命令主体 query = "select"; --数据库操作返回 local res, err ,errcode ,sqlstate = db:query(query) if not res then ngx.say(err) return end local ret = {} --数据库操作返回数据重构 for i,row in ipairs(res) do for key,raw in pairs(row) do ret[key] = raw end end --json编码进入 db:close()--关闭数据库连接需要安装Resty.mysql的库,非Openresty用户需要额外安装,resty.mysql库同时依赖resty.string库nginx配置文件部分:location /mysql_hello { content_by_lua_file XX.lua; }
2021年03月07日
71 阅读
0 评论
0 点赞
2021-02-25
Lua+Nginx 实现Wordpress外链跳转
Lua代码(保存为文件):p1 = [=[ <html><head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=Edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="referrer" content="always"> <title>道锋潜鳞 - 风控中心 - 跳转</title> <style> html,body{background:#F3F4F5;font-family: PingFang SC,Hiragino Sans GB,Arial,Microsoft YaHei,Verdana,Roboto,Noto,Helvetica Neue,sans-serif;padding:0;margin:0;} a{text-decoration:none;} .content{padding-top:220px;width:450px;margin:auto;word-break: break-all;} .content .logo-img img{display: block;width:175px;margin:auto;margin-bottom: 16px;} .content .loading-item{background:#fff;padding:24px;border-radius: 12px;border: 1px solid #E1E1E1;} .content .flex{display:flex;align-items:center;} .content .flex-end{display:flex;justify-content:flex-end} .content .tip1{background:#F0F9EA;} .content .tip2{background:#FDF5E6;} .content .tip3{background:#FEF0F0;} .content .loading-color1{color:#267DCC;} .content .loading-color2{color:#FC5531;} .content .loading-tip{padding:12px;margin-bottom:16px;border-radius:4px;} .content .loading-topic{font-size: 14px;color: #222226;line-height: 24px;margin-bottom:24px;} .content .loading-img{width:24px;height:24px;} .content .loading-btn{font-size: 14px;color: #FC5531;border: 1px solid #FC5531;display:inline-block;box-sizing: border-box;padding:6px 18px;border-radius: 18px;margin-left:8px;} .content .loading-btn2{font-size: 14px;color: #000000;border: 1px solid #000000;display:inline-block;box-sizing: border-box;padding:6px 18px;border-radius: 18px;margin-left:8px;} .content .loading-btn-github{width:121px;background:#FC5531;color:#fff;} .content .loading-text{font-size: 16px;font-weight: 600;color: #222226;line-height: 22px;margin-left:12px;overflow: hidden;text-overflow:ellipsis;white-space: nowrap;} @media (max-width: 450px){ .content{padding-top:120px;width:94%;} } #csdn-toolbar{width: 0;height: 0;display: none} </style></head> <body class="vsc-initialized"> <div id="linkPage" class="link-page"> <div class="content"> <div class="logo-img"><img src="//objectstorage.global.loongapi.com/loongapiSources/picbed/olddata2/2021/02/logo-full.png" alt=""></div> <div class="loading-item loading-others"> <div class="flex loading-tip tip2"> <img class="loading-img" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAADWUlEQVRoQ+2YvWsUQRiH33fmOMQiRQor7RQSweB9KAQEg1iYKFaZnJJ/wcTOMhLs7Ez8FwLebikasTGCoJDcHSoYQbHRyiKFhajczCu3SS73sbfzsXNJDnLV3s4y83vm3X12dhAG/IcDnh+OAHpVkITISvg2DYyQjwyVcXGt3o9q960CdZELAWC6ERoRn/CgentgAGimOCVJPmsNzJFfx2DjuW8I7xWg+xMZ9enXRwIaaQ2LgJ/Z2aFzvm8l7wBypjBPpB7FzTQiu8uDypLPKngFIDE+rODPFwIYjgUA2GJw7AyGb7d8QXgFkCK/TEB3ksIh4GMeVucOHQCV8qNKwQcCymgA6ozBGJarmz4gvFWgLvKrAHTNLBS+yITVSbNrk6/yAhCnTV04X1pNDdBLmzoAX1pNDZCkTS2EB62mAtBpUwvgQaupAEy0qYdIp1VnAFNtGgCk0qozgJ02tRjOWnUCoFJxUiqZuLJEgB+AbCWKTmqWAE4mYXDGp7C8sapD7Wy3BjDVJke8iUH1aZS/lL8hFUXHvX6uWrUGMNUmByxiWK1sAxTyUqnoOBHCQatWADbadAJw0KoVgJwpLBEpo5WkC0CjOohsmQeVeV21dtuNAWy16QwAaKVVYwBbbboCbM+s+WrVCMBEm50lTwcAYKpVLYCpNrsALDXa7XezTQAtgKk2Y14wVi+yuIfWZBMgEcBGm6bWsLkODbSaCGCjTZtgNtfqtNoTwFabMffwb0DYWQvBLAEdtwm+5/lkrfYEsNVmazgElIzxcSyvr0dLiVu5opL4joC4C0SSVmMBXLTZBoDwnge1863npMjVCKDtnA1ML612Abhqs70C8JPB6VMYhv+iCgiRVfD1OwGcsAndPim4yUaHxjr3VrsAZCk3RwpS718i4gpjdK8RQil8SESzruGbzwODeV6uLXdM1t7fg9amDjBOq20VOAza1EJ0rFabAGm1qRvYVzt2rFabAHWRa3zjetmv9BU2oZ/VTFibarRHACQuXJZQX9uHgb0NwZFdwaDyKgKQorBAoBa99b4PHSHCAx7UFnYqULikUL0mArYPY6ceInrTA05gWHmz9xCL4kWF6ioAZFOP0NcO8C8jerm746H9HuhrFg+dHwF4mMRUXQx8Bf4DeBHHQHvQneAAAAAASUVORK5CYII=" alt=""> <div class="loading-text">请注意您的账号和财产安全</div> </div> <div class="loading-topic"> <span>您即将离开,去往:</span> <a class="loading-color2"> ]=] p2 = [=[ </a> </p> <span>该链接不是我们的官方链接,风险不在我们的可控范围内</span> </div> <div class="flex-end"> <a class="loading-btn" href=" ]=] p3 = [=[ " target="_self" >继续</a> <a class="loading-btn2" href="#" onClick="javascript:history.back(-1);" target="_self">取消</a> </div> </div> </div> </div> </body> </html> ]=] resp = p1..ngx.var.arg_url..p2..ngx.var.arg_url..p3 ngx.say(resp)Nginx配置(部分):location ~ ^/goto/* { if ($request_method != GET) { return 403; } if ($arg_url = "") { return 403; } default_type text/html; content_by_lua_file /data/lua/link.lua; #前面lua代码的地址 }Wp:打开你的主题内的functions.php文件。在末尾添加如下php代码:function the_content_nofollow($content){ preg_match_all('/<a(.*?)href="(.*?)"(.*?)>/',$content,$matches); if($matches){ foreach($matches[2] as $val){ if(strpos($val,'://')!==false && strpos($val,home_url())===false && !preg_match('/\.(jpg|jepg|png|ico|bmp|gif|tiff)/i',$val)){ $content=str_replace("href=\"$val\"", "href=\"".home_url()."/goto?url=$val\" ",$content); } } } return $content; } add_filter('the_content','the_content_nofollow',999);实现效果:
2021年02月25日
34 阅读
0 评论
0 点赞
2021-01-09
宝塔nginx搭建rtmp推流服务器
环境Linux centos 7.6 + Nginx1.安装Nginx这一步就不用多说了吧我是宝塔用户,这边进入到/www/server/nginx/src目录里面使用nginx -V查看当前的编译选项。2.安装Nginx的rtmp拓展nginx的rtmp拓展包github地址:https://github.com/arut/nginx-rtmp-module,可以使用git clone下拉或者直接下载我这边直接下载解压放到:/root下。Nginx安装rtmp拓展:3.编译在刚刚-V操作所输出的 ./configure arguents:之后的内容复制然后在后头添加:--add-module=/opt/module/nginx-rtmp-module在前头添加./configure如:(我这里有编译云锁的安全模块,可以删除)./configure --user=www --group=www --prefix=/www/server/nginx --add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module --add-module=/www/server/nginx/src/ngx_cache_purge --add-module=/www/server/nginx/src/nginx-sticky-module --with-openssl=/www/server/nginx/src/openssl --with-pcre=pcre-8.43 --with-http_v2_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_stub_status_module --with-http_ssl_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-ld-opt=-Wl,-E --with-cc-opt=-Wno-error --with-ld-opt=-ljemalloc --with-http_dav_module --add-module=/www/server/nginx/src/nginx-dav-ext-module --add-module=/root/nginx-plugin-master --add-module=/root/nginx-rtmp-module运行后没有错误的话执行 make -j8 (我这里是8个线程编译,可以根据具体机器的配置选配)make完成后将系统中原有的nginx用重新编译生成的nginx文件替换,替换后重启nginx使新编译nginx生效rm -rf /www/server/nginx/sbin/nginx cp objs/nginx /www/server/nginx/sbin/ service nginx restart4.配置Nginx的rtmp服务站点# 在文件底部添加下面内容: rtmp { server { listen 1935; #监听的端口 chunk_size 4000; application tv_file { live on; #开启实时 hls on; #开启hls hls_path /www/hls; #rtmp推流请求路径,文件存放路径 hls_fragment 5s; #每个TS文件包含5秒的视频内容 } } }另外切记,此段配置文件需要和http配置块同级,即不能将此段内容放在http{}内,否则无法启动且报错重启Nginx:nginx -s reload开放端口(没防火墙忽略此部)iptables -I INPUT -p tcp --dport 1938 -j ACCEPT附属步骤1:使用http-hls流(m3u8)(不需要此功能跳过这步)首先新建一个站点,在配置文件中添加类似这样的代码:add_header 'Access-Control-Allow-Origin' *; add_header 'Access-Control-Allow-Methods' GET; location /live { #error_page 404 =200 /nosign.m3u8; #可以取消注释上面的代码,稍作修改即可配置默认视频流 types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } alias /www/hls/; }这段配置文件将前一步生成的m3u8和ts文件以http的形式推送。可以再添加CDN进行分发,但注意缓存时间需要匹配,否则会出现视频流异常。附属步骤2:读取http-hls流(m3u8)(不需要此功能跳过这步)完成上面附属一之后,可以使用如下html代码读取播放此m3u8视频源<script src="https://www.silverdragon.cn/wp-content/themes/hestia/assets/js/hls.min.js"></script> <video id="video" class="wrap" controls="" poster="封面图片"></video> <script> var url = "你的hls地址"; if(Hls.isSupported()) { var video = document.getElementById('video'); var hls = new Hls(); hls.loadSource(url); hls.attachMedia(video); hls.on(Hls.Events.MANIFEST_PARSED,function() { video.play(); }); } </script>5、推拉流测试推流。下载OBS Studio,官网下载太慢了,其他下载地址:https://pc.qq.com/detail/4/detail_23604.html安装完成,打开软件,在控件版块点击设置,左边的导航选择流,然后流类型选择自定义流媒体服务器,url输入rtmp://你的IP:1935/tv_file(就是刚刚配置的那个),流名称随便设置一个在场景里头随便添加个视频或者什么七七八八的设置完成点击推流。在服务器就看到m3u8文件的生成,推流成功。(然后挂到后台)这边强烈建议调整为动态码率或者其他什么的,毕竟自己的服务器带宽小,一不小心就跑满了6、拉流。测试拉流下载VLC,官方也是慢的要死,可以普通下载:https://pc.qq.com/detail/9/detail_569.html安装后打开url输入rtmp://你的IP:1935/tv_file/流名称(秘钥)或者使用刚刚配置的hls流,输入http://你的域名或IP/live/流名称.m3u8拉取正常根据本教程可以做出类似本站https://www.silverdragon.cn/?page_id=2339的功能。
2021年01月09日
115 阅读
1 评论
0 点赞
2021-01-03
Python获取NGINX连接数(ngx_stub_status)
最近在写网站的自动化运营平台,其中有一个CC攻击报警的系统,需要获取到网络服务器实时的连接数来判断是否遭受到攻击。因为服务器资源还是比较充裕,所以只需要获取当前的并发连接数即可。但有一个问题,ngx_stub_status插件是以http页面的形式输出的。而且内容还是非json格式。于是就用到urllib模块,对监控地址进行请求import urllib.parse import urllib.request def data_re(): url = "https://youdomain.com/your-url" headers = { # 存储任意的请求头信息 'User-Agent': 'Automated_blog_server_monitoring_platform version1.0.0', 'Referer':url } request = urllib.request.Request(url=url, headers=headers) response = urllib.request.urlopen(request) the_page = response.read().decode("unicode_escape").splitlines() #从http读取目标页面的数据分行存入List变量中 connect = int(str(the_page[0]).split(':')[1].strip()) #处理链接数为int类型的变量 print(connect)可以同理获取到队列等待数等。代码原理:首先请求页面获取页面内容,然后对页面内容进行拆行解析。每一行为一个元素。使用split()对字符串进行二次拆解分割。最终去除多余的空格,解析出ngx_stub_status的Active connections同理可以略微改动代码获取到总处理数,队列等待数等数据。
2021年01月03日
93 阅读
0 评论
0 点赞
2020-12-23
将Wordpress文章的外链转为内链(NGINX版)
我们在wordpress网站很多的文章需要跳转外链的资料、或者跳转外链的下载,所以在维护的时候,文章内编写的外链是不可避免的。一般来说,我们在除了友情链接之外的外部连接之外,大部分的外链都会多多少少的分散网站的权重你或许看见过类似https://www..com/goto.php?https://www.***.com形式的跳转链接,这样是为了站点的SEO能够对各种搜索引擎更友好,术语好像就是叫做外链跳转。更重要的是起到了保护自己域名权重的目的。一、给出NGINX跳转版的配置方法首先打开你站点的NGINX配置文件(仅限使用NGINXweb服务的道友)在location的配置块里面,添加一个新的location块代码如下location ~ ^/goto/* { if ($request_method != GET) { return 403; } rewrite ^ $arg_url? redirect; }这段配置文件就能实现将参数url后的地址读取后302跳转,并且抛弃除GET外的请求二、如果您用得是apache等类型的服务器可以在根目录下新建goto文件夹,在里面新建一个index.php文件(当然其他的的地址也是可以,需要在第三框的步骤中修改成你的地址)添加如下内容:<?php header("location:".$_GET["url"]); ?>美观一点也是可以的: <?php $url = $_GET['url']; ?> <html> <head> <meta charset=utf-8 /> <meta name="robots" content="nofollow"> <meta http-equiv="refresh" content="0.1;url=<?php echo $url; ?>"> <title>正在为您跳转……</title> <style> body{background:#000}.loading{-webkit-animation:fadein 2s;-moz-animation:fadein 2s;-o-animation:fadein 2s;animation:fadein 2s}@-moz-keyframes fadein{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@-o-keyframes fadein{from{opacity:0}to{opacity:1}}@keyframes fadein{from{opacity:0}to{opacity:1}}.spinner-wrapper{position:absolute;top:0;left:0;z-index:300;height:100%;min-width:100%;min-height:100%;background:rgba(255,255,255,0.93)}.spinner-text{position:absolute;top:41.5%;left:47%;margin:16px 0 0 35px;color:#BBB;letter-spacing:1px;font-weight:700;font-size:9px;font-family:Arial}.spinner{position:absolute;top:40%;left:45%;display:block;margin:0;width:1px;height:1px;border:25px solid rgba(100,100,100,0.2);-webkit-border-radius:50px;-moz-border-radius:50px;border-radius:50px;border-left-color:transparent;border-right-color:transparent;-webkit-animation:spin 1.5s infinite;-moz-animation:spin 1.5s infinite;animation:spin 1.5s infinite}@-webkit-keyframes spin{0%,100%{-webkit-transform:rotate(0deg) scale(1)}50%{-webkit-transform:rotate(720deg) scale(0.6)}}@-moz-keyframes spin{0%,100%{-moz-transform:rotate(0deg) scale(1)}50%{-moz-transform:rotate(720deg) scale(0.6)}}@-o-keyframes spin{0%,100%{-o-transform:rotate(0deg) scale(1)}50%{-o-transform:rotate(720deg) scale(0.6)}}@keyframes spin{0%,100%{transform:rotate(0deg) scale(1)}50%{transform:rotate(720deg) scale(0.6)}} </style> </head> <body> <div class="loading"> <div class="spinner-wrapper"> <span class="spinner-text">加载中...</span> <span class="spinner"></span> </div </div> </body> </html>三、主题文件配置随后打开你的主题内的functions.php文件。在末尾添加如下php代码:function the_content_nofollow($content){ preg_match_all('/<a(.*?)href="(.*?)"(.*?)>/',$content,$matches); if($matches){ foreach($matches[2] as $val){ if(strpos($val,'://')!==false && strpos($val,home_url())===false && !preg_match('/\.(jpg|jepg|png|ico|bmp|gif|tiff)/i',$val)){ $content=str_replace("href=\"$val\"", "href=\"".home_url()."/goto?url=$val\" ",$content); } } } return $content; } add_filter('the_content','the_content_nofollow',999);这段代码将捕获页面链接标签内的url地址,然后进行替换操作至此,配置完成,不出意外的话,文章内的站外链接会变成这样:
2020年12月23日
52 阅读
0 评论
0 点赞
1
2
3