爱意满满的作品展示区。
AlexaZhou

对人类友好并且强大的 VeryNginx

  AlexaZhou ·
alexazhou · Feb 3, 2016 · 30365 views
This topic created in 3933 days ago, the information mentioned may be changed or developed.

之前工作中经常在 Nginx 里面配置各种规则,感觉 Nginx 功能强大但并不是很易用。

于是就觉得可以写一个强大而且对人类友好的 Nginx

前前后后写了一个多月,总算是在过年之前完成了

逻辑通过 lua 实现,嵌入到 Nginx 中,自带前端界面

传送门: https://github.com/alexazhou/VeryNginx

VeryNginx = Very powerful and friendly nginx

功能上主要是实现了高级的防火墙,访问统计,和其他的一些功能,也就是对 Nginx 本身功能的一些强化。

并且:提供了更友好的 web 交互界面(这是重点)

在 web 界面里面修改配置后,保存后即刻生效,并不需要重启 Nginx 或者 reload 。

主要功能如下:

Nginx 运行状态分析

  • 每秒请求数
  • 响应时间
  • 网络流量
  • 网络连接数

请求过滤

VeryNginx 可以基于按照以下信息对请求进行过滤:

  • IP
  • UserAgent
  • 请求路径(URI)
  • 请求参数

通过配置过滤规则,可以阻止 SQL 注入, Git , SVN 文件泄露,拦截扫描工具等

访问统计

VeryNginx 可以统计网站每个 URI 的访问情况,包括每个 URI 的:

  • 总请求次数
  • 各状态码次数
  • 返回总字节数
  • 每请求平均字节数
  • 总响应时间
  • 平均响应时间

附一张 VeryNginx 的界面图

Nginx 运行状态

欢迎大家试用~

120 replies  •  2019-01-04 17:29:40 +08:00
1  2  
❮ ❯
Zohar
Zohar
Feb 3, 2016❤️1
1
link?
AlexaZhou
AlexaZhou
OP
Feb 3, 2016
2
@Zohar 😓,已经添加啦
la0wei
la0wei
Feb 3, 2016❤️1
3
plqws
plqws
Feb 3, 2016
4
一直都想做个类似的程序,苦于对 Nginx 不太熟悉,兹瓷一下!
Zohar
Zohar
Feb 3, 2016
5
@la0wei 貌似是刚刚添加的:)
AlexaZhou
AlexaZhou
OP
Feb 3, 2016
6
@Zohar
@la0wei
传送门确实是刚刚在 Zohar 的提醒下添加的~

ps: 我发现我在做其他事情的时候,显然没有写代码时那样的严谨
tSQghkfhTtQt9mtd
tSQghkfhTtQt9mtd
Feb 3, 2016
7
如果能有办法支持在现有 Nginx 上附加就好了, 233 ,不想重新装一次,但是看界面好棒的样子"o((>ω< ))o"
AlexaZhou
AlexaZhou
OP
Feb 3, 2016 via iPhone
8
@liwanglin12
如果之前安装的 Nginx 版本带有 lua_nginx_module ,和 http_sub_status_module 的话,把 readme 里面的那段配置加入进自己原来的 nginx 配置就好啦

后面我提供安装脚本吧,让安装更简单一些
popu111
popu111
Feb 3, 2016❤️1
9
已 star
crytis
crytis
Feb 3, 2016❤️1
10
不错 已 star
toono
toono
Feb 3, 2016❤️1
11
厉害,去加 star
mengskysama
mengskysama
Feb 3, 2016❤️1
12
star 一个,适合开发或者自己用用,统计以及日志在还是要并入运维系统。
AlexaZhou
AlexaZhou
OP
Feb 3, 2016
13
@popu111 @crytis @toono
Thanks ~
已发送我的感谢🙏
lhbc
lhbc
Feb 3, 2016
14
好强大,再扩展下能做不少事情了
顺便请教楼主,已经使用了 init_by_lua_file, access_by_lua_file, access_by_lua_file, log_by_lua_file 这 4 个 nginx 配置,如何使用 VeryNginx ?
AlexaZhou
AlexaZhou
OP
Feb 3, 2016
15
@mengskysama
对的,详细的统计和日志分析啥得,肯定还得靠专门的运维系统

实际上为了速度, VeryNginx 里实现的当前状态分析和统计,是很轻量级的,用途主要是用来分析 Nginx ( web 服务)当前的状态,如果有问题,可以很方便找到问题,

主要的功能还是在于自定义操作,目前支持了按照规则过滤和重定向,后面会加入更多有用的自定义行为
Strikeactor
Strikeactor
Feb 3, 2016❤️1
16
赞一个
DIYgod
DIYgod
Feb 3, 2016❤️1
17
界面好看,赞,已 star
AlexaZhou
AlexaZhou
OP
Feb 3, 2016
18
@lhbc 在 VeryNginx 的文件夹里面,有几个文件,名字是这样,

on_init.lua
on_access.lua
on_rewrite.lua
on_log.lua

里面写了 VeryNginx 在这几个阶段执行的动作

你可以复制 VeryNginx 文件夹到自己的 Nginx 目录里面,然后在自己的“ init_by_lua_file ”等文件里面调用 verynginx 的 on_init.lua 应该就可以了

不过需要小心处理好路径的问题
lightforce
lightforce
Feb 3, 2016
19
流量大的站这日志分析是不是耗 cpu ?
hljjhb
hljjhb
Feb 3, 2016❤️1
20
Wonderful
AlexaZhou
AlexaZhou
OP
Feb 3, 2016
21
@lhbc 另外 VeryNginx 运行需要有 http_sub_status_module 和 lua_nginx_module ,还有 lua cjson 模块,你需要检查一下这几个模块是不是都有,不然运行会有问题
popu111
popu111
Feb 3, 2016❤️1
22
@AlexaZhou 支持对运维绳命有益的项目是应该的~
liuchen9586
liuchen9586
Feb 3, 2016❤️1
23
支持,自己用会很爽
lhbc
lhbc
Feb 3, 2016❤️1
24
@AlexaZhou 感谢,这些模块都有的
另外可以参考这个来规划 todo
http://demo.nginx.com/status.html
kn007
kn007
Feb 3, 2016
25
不用 openrestry 的话,需要安装那些扩展?
wph95
wph95
Feb 3, 2016❤️1
26
非常棒,已经 star
如果能优化安装流程,再傻瓜化一些就好了。
强力关注
AlexaZhou
AlexaZhou
OP
Feb 4, 2016
27
@lightforce
额你是说对访问速度的影响,还是读取统计结果时候的影响?
对普通访问来说,日志统计的插入时间复杂度是 o(1),不怎么耗 cpu
读取统计结果的时候会需要生成 json ,数据很多的情况下(应该可以记录 10 万条以上的 url 统计结果),需要零点几秒,但是也还好
AlexaZhou
AlexaZhou
OP
Feb 4, 2016
28
@kn007 目前需要有:

http_sub_status_module
lua_nginx_module
以及 lua cjson 模块

不过这里面的 lua cjson 模块并不是必须的,后面会改进成动态判断,如果有就使用 cjson ,如果不存在则使用 dkjson 来代替
jinwyp
jinwyp
Feb 4, 2016
29
没有反向代理的 和 虚拟主机的配置? 最主要的功能没有?
AlexaZhou
AlexaZhou
OP
Feb 4, 2016
30
@lhbc 强力赞~ 这个很有参考价值
AlexaZhou
AlexaZhou
OP
Feb 4, 2016
31
@jinwyp
遇到了 Nginx 本身的一些限制,目前这两个还是需要通过 Nginx 本身的配置文件来写
AlexaZhou
AlexaZhou
OP
Feb 4, 2016
32
@wph95
多谢鼓励 ~
必须要做成方便部署的方式
kn007
kn007
Feb 4, 2016
33
@AlexaZhou 好的,谢谢。
期待后续版本。
wph95
wph95
Feb 4, 2016
34
@AlexaZhou
刚部署起来用 感觉非常的好,不过遇到几个问题。
1. vuejs 的用法有点怪怪的。。 可以参考 vue-cli
2. 刚开始没找到 默认账户密码,翻了源码后才找到。。
后来仔细的看 readme 才在最底下发现。。。
readme 用中英混写 看起来很不顺服,不如一个中文的 一个英文的
3. 要是每个数据点能设置成 每秒 每 15 秒 每 60 秒 etc 就好了,使用上像 grafana 就完美了
4. 期待能实现更多功能 http://demo.nginx.com/ 实现的功能都特别适用
wph95
wph95
Feb 4, 2016❤️1
35
@AlexaZhou &人比较大胆,直接扔到自己一个几千用户的项目的生产环境里, verynginx 的性能损耗有多大,这个还是需要测一下才放行。。。
lightforce
lightforce
Feb 4, 2016
36
@AlexaZhou 对系统性能的影响,日志一直在滚的站对单点服务器 cpu 很考验。。。这方面有测试数据吗?
AlexaZhou
AlexaZhou
OP
Feb 4, 2016
37
@wph95
1 ,额,第一次用 vue.js ,我回头再研究一下
2 ,看来 Readme 很需要改进...
3 ,关于数据点时间间隔,其实在 status 页面点右边的齿轮,然后可以设置数据点的时间间隔,目前是只能在 1-15 s 内设置
4 ,正在加油中,陆续会加功能进来...
AlexaZhou
AlexaZhou
OP
Feb 4, 2016
38
@wph95
赞大胆~
如果生产中使用时遇到任何问题,请反馈给我,我会尽快解决👿
AlexaZhou
AlexaZhou
OP
Feb 4, 2016
39
@lightforce

首页的曲线图,其实是前端本地拿两个时间点的累计信息,作差分计算得到的,对服务器可以说无压力
访问统计那一页读取 uri 的访问记录,会需要 nginx 计算一下生成 json ,但也还好

可能存在的性能压力是在配置了很多规则之后,正则表达式匹配可能会带来 cpu 压力
wph95
wph95
Feb 4, 2016❤️1
40
@AlexaZhou
怒赞,明天起来帮忙理下 vue 推个 PR :)
期待能早日看到 http://demo.nginx.com/ 里的功能都实现掉了的一天。
哦对了,数据能持久化(备份)吗,能查看历史记录就好了(估计得上个 时间序列数据库才行)。
lhbc
lhbc
Feb 4, 2016 via Android
41
@wph95 我觉得单节点数据持久化意义不大。
可以实现 demo.nginx.com 的功能后,把数据存储到 Redis ,然后 Redis 做同步,持久化由一个集中的 Redis 来实现。
AlexaZhou
AlexaZhou
OP
Feb 4, 2016
42
@wph95
目前还不能呢,因为目前的实现主要是考虑了性能,目前的状态曲线是前端代码对不断获取 VeryNginx 的状态值(类似一个计数器),然后作差分计算得到的,查看历史纪录的话需要在 Nginx 里面做一个存储,也就是你说的时间序列数据库,会有一些难度(做的对性能基本无影响的情况下)

另外我感觉查看历史流量,是不是在通过 access.log 日志来分析会更好一些,因为那里面包含所有的原始信息,不光可以查看大概的指标例如每秒请求数,还可以查看单个请求的响应时间,返回值,等等,进行具体分析
AlexaZhou
AlexaZhou
OP
Feb 4, 2016
43
@wph95
😊欢迎 PR ~
robinluoxx
robinluoxx
Feb 4, 2016
44
已 star
znoodl
znoodl
Feb 4, 2016 via iPhone❤️1
45
支持楼主
KenGe
KenGe
Feb 4, 2016❤️1
46
提供下脚本自行安装配置蛮好
重新安装成本太高
噗
我已经去试用了~
mjever
mjever
Feb 4, 2016❤️1
47
支持楼主,很有实用价值!
imria
imria
Feb 4, 2016❤️1
48
准备体验下,希望楼主继续做下去
ltye
ltye
Feb 4, 2016❤️1
49
基于 openrestry ,提供 web 界面,赞!已经 star ,打算先在测试环境试试
adeweb
adeweb
Feb 4, 2016❤️1
50
已 star ,很实用!
外行弱弱地问下,我理解的,如果改 nginx 配置是需要重启服务的,你是怎么做到热配置的?
sinux
sinux
PRO
Feb 4, 2016❤️1
51
好东西,有实用性
wudanyang
wudanyang
Feb 4, 2016❤️1
52
VeryNginx 预置了常用的过滤规则,可以一定程序上阻止常见的 SQL 注入, Git , SVN 文件泄露,目录遍历攻击,并拦截常见的扫描工具。
=============
上面是楼主的原文,我觉得有个错别字,可以一定程度上组织常见的 SQL 注入
wudanyang
wudanyang
Feb 4, 2016❤️1
53
不好意思,阻止
rrfeng
rrfeng
Feb 4, 2016
54
赞!想写来着但是一直没机会(其实是不会)
AlexaZhou
AlexaZhou
OP
Feb 4, 2016
55
@KenGe

试用的时候如果有建议,或者遇到问题记得提 issue 给我🐶
AlexaZhou
AlexaZhou
OP
Feb 4, 2016
56
@imria

会继续开发啦
VeryNginix 基于 lua ,比 Nginx 的 C 灵活很多,后续会加入很多新功能进来
AlexaZhou
AlexaZhou
OP
Feb 4, 2016
57
确实是,多谢提醒,已经修正啦
fy
fy
Feb 4, 2016❤️1
58
coooooooooool 希望有带宽限制这样的功能,注入过滤我觉得倒不是很必要,这种事情有专业的模块做了
rrfeng
rrfeng
Feb 4, 2016❤️1
59
用上了,但是感觉还有很大改进余地。
比如 tps 的曲线应该是 all 和 4xx 5xx , 2xx 没啥用嘛~

访问统计里 uri 应该支持用正则过滤,不然好多没法区分的。(另外这部分是存在哪里的? shard dict ?还没仔细看代码)

response time 是总和值而不是平均值……
AlexaZhou
AlexaZhou
OP
Feb 4, 2016
60
@rrfeng

后续 uri 访问统计里面会支持按照正则表达式进行归类,这样相似的 uri 就可以合并成一条了,你觉得这种实现怎样?

另外统计结果里面的 avg time 就是平均响应时间
AlexaZhou
AlexaZhou
OP
Feb 4, 2016
61
@rrfeng

确实是分成 all, 4XX, 5XX 更好一些,后续版本会改进 tps 曲线

另外统计结果是存在 shard dict 里面
AlexaZhou
AlexaZhou
OP
Feb 4, 2016
62
@fy
嗯 ,限速是很实用的功能,后续争取加上
zacard
zacard
Feb 4, 2016❤️1
63
不错, star
anyforever
anyforever
Feb 4, 2016
64
不需要-t ,不需要 reload ,如果改错了的话,有后补机制么?
jinfeng333
jinfeng333
Feb 4, 2016 via Android❤️1
65
赞, star
AlexaZhou
AlexaZhou
OP
Feb 4, 2016❤️1
66
@adeweb

VeryNginx 实现的逻辑依赖 Lua 内存里面的数据来执行,保存的时候即时更新内存里面的数据就可以啦
AlexaZhou
AlexaZhou
OP
Feb 4, 2016
67
@anyforever

呃,并没有,还是小心点吧
ps :保存之前可以使用页面上的测试功能来测一下,看规则是不是正确的匹配上
jinfeng333
jinfeng333
Feb 4, 2016 via Android
68
@AlexaZhou 现在在高铁上呢,等回家了,试试,
cxshun
cxshun
Feb 4, 2016
69
赞,已 star 。界面好好看
anyforever
anyforever
Feb 4, 2016
70
@AlexaZhou 嗯。生产环境,这项还是非常必要的,线上功能稳定压倒一切啊。
dark456852
dark456852
Feb 4, 2016
71
赞一下 LZ 的精神,可惜不敢用在用在生产环境上
otokaze
otokaze
Feb 4, 2016❤️1
72
这个想法不错~ 希望坚持
bidu
bidu
Feb 4, 2016 via Android❤️1
73
太赞了,已 star~
isnowify
isnowify
Feb 4, 2016❤️1
74
Awesome!! 献上 star
laosb
laosb
Feb 4, 2016❤️1
75
给楼主献上一个 PR 以修正一些 README 里的小错误 /w\
xi_lin
xi_lin
Feb 4, 2016
76
赞!
lijinma
lijinma
Feb 4, 2016
77
如果你不想安装 OpenResty ,或者你已经有了一个正在工作的 Nginx ,你也可以自己手动为 Nginx 编译安装这些模块

手动编译安装这部分,如果能写的更详细就更好了。。。

哈哈,已 Star
vvsun
vvsun
Feb 4, 2016
78
已 Star 希望能进一步完善啊
saturnast
saturnast
Feb 4, 2016
79
赞~
AlexaZhou
AlexaZhou
OP
Feb 4, 2016
80
@laosb
Thanks ,已经 merge 啦
kenneth
kenneth
Feb 4, 2016
81
已经用上,不知道是不是实用,但是确实学习 openresty 的好例子。
barbery
barbery
Feb 4, 2016❤️1
83
不错不错
guonning
guonning
Feb 4, 2016 via Android
84
期待在现有 ngnix 上,傻瓜式添加
rrfeng
rrfeng
Feb 4, 2016
85
其实 shared dict 里存不了太多的东西。
大流量下的 uri 统计根本没什么用的……
AlexaZhou
AlexaZhou
OP
Feb 4, 2016
86
@rrfeng

这里其实并不需要记录每一次访问,只需要按 URI 归类进行累加就可以了,也就是说只需要为每个 URI 存储一组数据,所占用内存并不会那么多
huyinjie
huyinjie
Feb 5, 2016❤️1
87
正好需要,已 star
MonkLuf
MonkLuf
Feb 5, 2016 via Android
88
赞,没有介绍其中的防火墙功能?
lj0014
lj0014
Feb 5, 2016❤️1
89
正好需要,已 star 。现在支持多久的历史数据
AlexaZhou
AlexaZhou
OP
Feb 5, 2016
90
@lj0014

URI 统计有两组,一组是从 Nginx 启动之后的全部统计结果,一组是每分钟清空的统计结果
这部分我详细写一下,回头整理进 readme 吧
hiroya
hiroya
Feb 9, 2016 via iPad❤️1
91
赞,已 star
geeglo
geeglo
Feb 10, 2016 via iPhone❤️1
92
可以!
Livid
Livid
MOD
PRO
Feb 10, 2016❤️1
93
流量统计的步骤是在 log 阶段,所以如果是大文件下载的话,要完成的时候才会有 log ,实时的流量统计目前应该是还不支持吧?
Yamade
Yamade
Feb 10, 2016❤️1
94
奇怪改了 默认的监听端口,web 交互界面 可以登录.
http 里加了 include /etc/nginx/conf.d/*.conf;
/opt/VeryNginx/nginx/sbin/nginx -t 正常,但是就是没反代成功.
楼主有测试么
Yamade
Yamade
Feb 10, 2016❤️1
95
抱歉,我的失误,可以了
AlexaZhou
AlexaZhou
OP
Feb 10, 2016❤️1
96
@Livid 对的,目前的看不到绝对意义上的实时流量。一个请求的流量需要到这个请求结束之后才会反映出来,也就是大文件下载的话,会在这个请求结束之后出现在图表上
CrazySpiderMan
CrazySpiderMan
Feb 10, 2016❤️1
97
Good job!
xuhaoyangx
xuhaoyangx
Feb 10, 2016❤️1
98
@AlexaZhou 如果我编译的 nginx 的用户设定是 www ,相对应的把你的这个工程也设成 www 就可以了吧
Yamade
Yamade
Feb 10, 2016
99
限制下 ip 请求的规则可以有不?
mornlight
mornlight
Feb 10, 2016❤️1
100
你搞的这个东西, exciting !
1  2  
❮ ❯
About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4315 Online   Highest 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 388ms · UTC 08:24 · PVG 16:24 · LAX 00:24 · JFK 03:24
♥ Do have faith in what you're doing.