V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
AlexaZhou
V2EX  ›  分享创造

对人类友好并且强大的 VeryNginx

  AlexaZhou ·
alexazhou · 2016-02-03 22:36:46 +08:00 · 27505 次点击
这是一个创建于 3253 天前的主题,其中的信息可能已经有所发展或是发生改变。

之前工作中经常在 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 条回复    2019-01-04 17:29:40 +08:00
1  2  
Zohar
    1
Zohar  
   2016-02-03 22:38:43 +08:00   ❤️ 1
link?
AlexaZhou
    2
AlexaZhou  
OP
   2016-02-03 22:40:57 +08:00
@Zohar 😓,已经添加啦
la0wei
    3
la0wei  
   2016-02-03 22:41:35 +08:00   ❤️ 1
plqws
    4
plqws  
   2016-02-03 22:42:37 +08:00
一直都想做个类似的程序,苦于对 Nginx 不太熟悉,兹瓷一下!
Zohar
    5
Zohar  
   2016-02-03 22:43:20 +08:00
@la0wei 貌似是刚刚添加的:)
AlexaZhou
    6
AlexaZhou  
OP
   2016-02-03 22:48:13 +08:00
@Zohar
@la0wei
传送门确实是刚刚在 Zohar 的提醒下添加的~

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

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

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

主要的功能还是在于自定义操作,目前支持了按照规则过滤和重定向,后面会加入更多有用的自定义行为
Strikeactor
    16
Strikeactor  
   2016-02-03 23:35:30 +08:00   ❤️ 1
赞一个
DIYgod
    17
DIYgod  
   2016-02-03 23:36:00 +08:00   ❤️ 1
界面好看,赞,已 star
AlexaZhou
    18
AlexaZhou  
OP
   2016-02-03 23:43:45 +08:00
@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
    19
lightforce  
   2016-02-03 23:44:26 +08:00
流量大的站这日志分析是不是耗 cpu ?
hljjhb
    20
hljjhb  
   2016-02-03 23:47:17 +08:00   ❤️ 1
Wonderful
AlexaZhou
    21
AlexaZhou  
OP
   2016-02-03 23:47:55 +08:00
@lhbc 另外 VeryNginx 运行需要有 http_sub_status_module 和 lua_nginx_module ,还有 lua cjson 模块,你需要检查一下这几个模块是不是都有,不然运行会有问题
popu111
    22
popu111  
   2016-02-03 23:49:20 +08:00   ❤️ 1
@AlexaZhou 支持对运维绳命有益的项目是应该的~
liuchen9586
    23
liuchen9586  
   2016-02-03 23:55:44 +08:00   ❤️ 1
支持,自己用会很爽
lhbc
    24
lhbc  
   2016-02-03 23:56:35 +08:00   ❤️ 1
@AlexaZhou 感谢,这些模块都有的
另外可以参考这个来规划 todo
http://demo.nginx.com/status.html
kn007
    25
kn007  
   2016-02-03 23:57:14 +08:00
不用 openrestry 的话,需要安装那些扩展?
wph95
    26
wph95  
   2016-02-03 23:59:49 +08:00   ❤️ 1
非常棒,已经 star
如果能优化安装流程,再傻瓜化一些就好了。
强力关注
AlexaZhou
    27
AlexaZhou  
OP
   2016-02-04 00:00:40 +08:00
@lightforce
额你是说对访问速度的影响,还是读取统计结果时候的影响?
对普通访问来说,日志统计的插入时间复杂度是 o(1),不怎么耗 cpu
读取统计结果的时候会需要生成 json ,数据很多的情况下(应该可以记录 10 万条以上的 url 统计结果),需要零点几秒,但是也还好
AlexaZhou
    28
AlexaZhou  
OP
   2016-02-04 00:04:26 +08:00
@kn007 目前需要有:

http_sub_status_module
lua_nginx_module
以及 lua cjson 模块

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

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

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

另外我感觉查看历史流量,是不是在通过 access.log 日志来分析会更好一些,因为那里面包含所有的原始信息,不光可以查看大概的指标例如每秒请求数,还可以查看单个请求的响应时间,返回值,等等,进行具体分析
AlexaZhou
    43
AlexaZhou  
OP
   2016-02-04 01:26:36 +08:00
@wph95
😊欢迎 PR ~
robinluoxx
    44
robinluoxx  
   2016-02-04 01:48:38 +08:00
已 star
znoodl
    45
znoodl  
   2016-02-04 08:10:47 +08:00 via iPhone   ❤️ 1
支持楼主
KenGe
    46
KenGe  
   2016-02-04 08:46:21 +08:00   ❤️ 1
提供下脚本自行安装配置蛮好
重新安装成本太高

我已经去试用了~
mjever
    47
mjever  
   2016-02-04 09:18:49 +08:00   ❤️ 1
支持楼主,很有实用价值!
imria
    48
imria  
   2016-02-04 09:34:58 +08:00   ❤️ 1
准备体验下,希望楼主继续做下去
ltye
    49
ltye  
   2016-02-04 09:50:12 +08:00   ❤️ 1
基于 openrestry ,提供 web 界面,赞!已经 star ,打算先在测试环境试试
adeweb
    50
adeweb  
   2016-02-04 09:58:28 +08:00   ❤️ 1
已 star ,很实用!
外行弱弱地问下,我理解的,如果改 nginx 配置是需要重启服务的,你是怎么做到热配置的?
sinux
    51
sinux  
   2016-02-04 10:10:56 +08:00   ❤️ 1
好东西,有实用性
wudanyang
    52
wudanyang  
   2016-02-04 10:34:36 +08:00   ❤️ 1
VeryNginx 预置了常用的过滤规则,可以一定程序上阻止常见的 SQL 注入, Git , SVN 文件泄露,目录遍历攻击,并拦截常见的扫描工具。
=============
上面是楼主的原文,我觉得有个错别字,可以一定程度上组织常见的 SQL 注入
wudanyang
    53
wudanyang  
   2016-02-04 10:35:05 +08:00   ❤️ 1
不好意思,阻止
rrfeng
    54
rrfeng  
   2016-02-04 10:45:55 +08:00
赞!想写来着但是一直没机会(其实是不会)
AlexaZhou
    55
AlexaZhou  
OP
   2016-02-04 10:49:29 +08:00
@KenGe

试用的时候如果有建议,或者遇到问题记得提 issue 给我🐶
AlexaZhou
    56
AlexaZhou  
OP
   2016-02-04 10:51:18 +08:00
@imria

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

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

response time 是总和值而不是平均值……
AlexaZhou
    60
AlexaZhou  
OP
   2016-02-04 12:03:55 +08:00
@rrfeng

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

另外统计结果里面的 avg time 就是平均响应时间
AlexaZhou
    61
AlexaZhou  
OP
   2016-02-04 12:07:14 +08:00
@rrfeng

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

另外统计结果是存在 shard dict 里面
AlexaZhou
    62
AlexaZhou  
OP
   2016-02-04 12:11:48 +08:00
@fy
嗯 ,限速是很实用的功能,后续争取加上
zacard
    63
zacard  
   2016-02-04 13:36:27 +08:00   ❤️ 1
不错, star
anyforever
    64
anyforever  
   2016-02-04 14:24:59 +08:00
不需要-t ,不需要 reload ,如果改错了的话,有后补机制么?
wujunze
    65
wujunze  
   2016-02-04 14:34:17 +08:00 via Android   ❤️ 1
赞, star
AlexaZhou
    66
AlexaZhou  
OP
   2016-02-04 14:39:03 +08:00   ❤️ 1
@adeweb

VeryNginx 实现的逻辑依赖 Lua 内存里面的数据来执行,保存的时候即时更新内存里面的数据就可以啦
AlexaZhou
    67
AlexaZhou  
OP
   2016-02-04 14:40:40 +08:00
@anyforever

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

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

哈哈,已 Star
vvsun
    78
vvsun  
   2016-02-04 17:54:01 +08:00
已 Star 希望能进一步完善啊
saturnast
    79
saturnast  
   2016-02-04 18:17:39 +08:00
赞~
AlexaZhou
    80
AlexaZhou  
OP
   2016-02-04 18:30:19 +08:00
@laosb
Thanks ,已经 merge 啦
kenneth
    81
kenneth  
   2016-02-04 18:37:28 +08:00
已经用上,不知道是不是实用,但是确实学习 openresty 的好例子。
withrock
    82
withrock  
   2016-02-04 20:47:03 +08:00
barbery
    83
barbery  
   2016-02-04 21:58:13 +08:00   ❤️ 1
不错不错
guonning
    84
guonning  
   2016-02-04 22:34:53 +08:00 via Android
期待在现有 ngnix 上,傻瓜式添加
rrfeng
    85
rrfeng  
   2016-02-04 23:31:50 +08:00
其实 shared dict 里存不了太多的东西。
大流量下的 uri 统计根本没什么用的……
AlexaZhou
    86
AlexaZhou  
OP
   2016-02-04 23:43:20 +08:00
@rrfeng

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

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