对人类友好并且强大的 VeryNginx - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
AlexaZhou
V2EX    分享创造

对人类友好并且强大的 VeryNginx

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

之前工作中经常在 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 在这几个阶段执行的动作

你可以复制 eryNginx 文件夹到自己的 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 0846: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
PRO
   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     Solana     880 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 33ms UTC 21:17 PVG 05:17 LAX 14:17 JFK 17:17
Do have faith in what you're doing.
ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86