之前工作中经常在 Nginx 里面配置各种规则,感觉 Nginx 功能强大但并不是很易用。
于是就觉得可以写一个强大而且对人类友好的 Nginx
前前后后写了一个多月,总算是在过年之前完成了
逻辑通过 lua 实现,嵌入到 Nginx 中,自带前端界面
传送门: https://github.com/alexazhou/VeryNginx
功能上主要是实现了高级的防火墙,访问统计,和其他的一些功能,也就是对 Nginx 本身功能的一些强化。
并且:提供了更友好的 web 交互界面(这是重点)
在 web 界面里面修改配置后,保存后即刻生效,并不需要重启 Nginx 或者 reload 。
VeryNginx 可以基于按照以下信息对请求进行过滤:
通过配置过滤规则,可以阻止 SQL 注入, Git , SVN 文件泄露,拦截扫描工具等
VeryNginx 可以统计网站每个 URI 的访问情况,包括每个 URI 的:
附一张 VeryNginx 的界面图
欢迎大家试用~
1
Zohar 2016-02-03 22:38:43 +08:00 1
link?
|
3
la0wei 2016-02-03 22:41:35 +08:00 1
|
4
plqws 2016-02-03 22:42:37 +08:00
一直都想做个类似的程序,苦于对 Nginx 不太熟悉,兹瓷一下!
|
6
AlexaZhou OP |
7
tSQghkfhTtQt9mtd 2016-02-03 22:56:46 +08:00
如果能有办法支持在现有 Nginx 上附加就好了, 233 ,不想重新装一次,但是看界面好棒的样子"o((>ω< ))o"
|
8
AlexaZhou OP @liwanglin12
如果之前安装的 Nginx 版本带有 lua_nginx_module ,和 http_sub_status_module 的话,把 readme 里面的那段配置加入进自己原来的 nginx 配置就好啦 后面我提供安装脚本吧,让安装更简单一些 |
9
popu111 2016-02-03 23:15:51 +08:00 1
已 star
|
10
crytis 2016-02-03 23:20:04 +08:00 1
不错 已 star
|
11
toono 2016-02-03 23:20:34 +08:00 1
厉害,去加 star
|
12
mengskysama 2016-02-03 23:25:27 +08:00 1
star 一个,适合开发或者自己用用,统计以及日志在还是要并入运维系统。
|
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 ? |
15
AlexaZhou OP @mengskysama
对的,详细的统计和日志分析啥得,肯定还得靠专门的运维系统 实际上为了速度, VeryNginx 里实现的当前状态分析和统计,是很轻量级的,用途主要是用来分析 Nginx ( web 服务)当前的状态,如果有问题,可以很方便找到问题, 主要的功能还是在于自定义操作,目前支持了按照规则过滤和重定向,后面会加入更多有用的自定义行为 |
16
Strikeactor 2016-02-03 23:35:30 +08:00 1
赞一个
|
17
DIYgod 2016-02-03 23:36:00 +08:00 1
界面好看,赞,已 star
|
18
AlexaZhou OP @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 应该就可以了 不过需要小心处理好路径的问题 |
19
lightforce 2016-02-03 23:44:26 +08:00
流量大的站这日志分析是不是耗 cpu ?
|
20
hljjhb 2016-02-03 23:47:17 +08:00 1
Wonderful
|
21
AlexaZhou OP @lhbc 另外 VeryNginx 运行需要有 http_sub_status_module 和 lua_nginx_module ,还有 lua cjson 模块,你需要检查一下这几个模块是不是都有,不然运行会有问题
|
23
liuchen9586 2016-02-03 23:55:44 +08:00 1
支持,自己用会很爽
|
24
lhbc 2016-02-03 23:56:35 +08:00 1
|
25
kn007 2016-02-03 23:57:14 +08:00
不用 openrestry 的话,需要安装那些扩展?
|
26
wph95 2016-02-03 23:59:49 +08:00 1
非常棒,已经 star
如果能优化安装流程,再傻瓜化一些就好了。 强力关注 |
27
AlexaZhou OP @lightforce
额你是说对访问速度的影响,还是读取统计结果时候的影响? 对普通访问来说,日志统计的插入时间复杂度是 o(1),不怎么耗 cpu 读取统计结果的时候会需要生成 json ,数据很多的情况下(应该可以记录 10 万条以上的 url 统计结果),需要零点几秒,但是也还好 |
28
AlexaZhou OP @kn007 目前需要有:
http_sub_status_module lua_nginx_module 以及 lua cjson 模块 不过这里面的 lua cjson 模块并不是必须的,后面会改进成动态判断,如果有就使用 cjson ,如果不存在则使用 dkjson 来代替 |
29
jinwyp 2016-02-04 00:05:18 +08:00
没有反向代理的 和 虚拟主机的配置? 最主要的功能没有?
|
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/ 实现的功能都特别适用 |
35
wph95 2016-02-04 00:45:02 +08:00 1
@AlexaZhou &人比较大胆,直接扔到自己一个几千用户的项目的生产环境里, verynginx 的性能损耗有多大,这个还是需要测一下才放行。。。
|
36
lightforce 2016-02-04 00:46:25 +08:00
@AlexaZhou 对系统性能的影响,日志一直在滚的站对单点服务器 cpu 很考验。。。这方面有测试数据吗?
|
37
AlexaZhou OP @wph95
1 ,额,第一次用 vue.js ,我回头再研究一下 2 ,看来 Readme 很需要改进... 3 ,关于数据点时间间隔,其实在 status 页面点右边的齿轮,然后可以设置数据点的时间间隔,目前是只能在 1-15 s 内设置 4 ,正在加油中,陆续会加功能进来... |
39
AlexaZhou OP @lightforce
首页的曲线图,其实是前端本地拿两个时间点的累计信息,作差分计算得到的,对服务器可以说无压力 访问统计那一页读取 uri 的访问记录,会需要 nginx 计算一下生成 json ,但也还好 可能存在的性能压力是在配置了很多规则之后,正则表达式匹配可能会带来 cpu 压力 |
40
wph95 2016-02-04 01:07:02 +08:00 1
@AlexaZhou
怒赞,明天起来帮忙理下 vue 推个 PR :) 期待能早日看到 http://demo.nginx.com/ 里的功能都实现掉了的一天。 哦对了,数据能持久化(备份)吗,能查看历史记录就好了(估计得上个 时间序列数据库才行)。 |
41
lhbc 2016-02-04 01:16:34 +08:00 via Android
|
42
AlexaZhou OP @wph95
目前还不能呢,因为目前的实现主要是考虑了性能,目前的状态曲线是前端代码对不断获取 VeryNginx 的状态值(类似一个计数器),然后作差分计算得到的,查看历史纪录的话需要在 Nginx 里面做一个存储,也就是你说的时间序列数据库,会有一些难度(做的对性能基本无影响的情况下) 另外我感觉查看历史流量,是不是在通过 access.log 日志来分析会更好一些,因为那里面包含所有的原始信息,不光可以查看大概的指标例如每秒请求数,还可以查看单个请求的响应时间,返回值,等等,进行具体分析 |
44
robinluoxx 2016-02-04 01:48:38 +08:00
已 star
|
45
znoodl 2016-02-04 08:10:47 +08:00 via iPhone 1
支持楼主
|
46
KenGe 2016-02-04 08:46:21 +08:00 1
提供下脚本自行安装配置蛮好
重新安装成本太高 噗 我已经去试用了~ |
47
mjever 2016-02-04 09:18:49 +08:00 1
支持楼主,很有实用价值!
|
48
imria 2016-02-04 09:34:58 +08:00 1
准备体验下,希望楼主继续做下去
|
49
ltye 2016-02-04 09:50:12 +08:00 1
基于 openrestry ,提供 web 界面,赞!已经 star ,打算先在测试环境试试
|
50
adeweb 2016-02-04 09:58:28 +08:00 1
已 star ,很实用!
外行弱弱地问下,我理解的,如果改 nginx 配置是需要重启服务的,你是怎么做到热配置的? |
51
sinux 2016-02-04 10:10:56 +08:00 1
好东西,有实用性
|
52
wudanyang 2016-02-04 10:34:36 +08:00 1
VeryNginx 预置了常用的过滤规则,可以一定程序上阻止常见的 SQL 注入, Git , SVN 文件泄露,目录遍历攻击,并拦截常见的扫描工具。
============= 上面是楼主的原文,我觉得有个错别字,可以一定程度上组织常见的 SQL 注入 |
53
wudanyang 2016-02-04 10:35:05 +08:00 1
不好意思,阻止
|
54
rrfeng 2016-02-04 10:45:55 +08:00
赞!想写来着但是一直没机会(其实是不会)
|
56
AlexaZhou OP |
57
AlexaZhou OP 确实是,多谢提醒,已经修正啦
|
58
fy 2016-02-04 11:14:54 +08:00 1
coooooooooool 希望有带宽限制这样的功能,注入过滤我觉得倒不是很必要,这种事情有专业的模块做了
|
59
rrfeng 2016-02-04 11:45:32 +08:00 1
用上了,但是感觉还有很大改进余地。
比如 tps 的曲线应该是 all 和 4xx 5xx , 2xx 没啥用嘛~ 访问统计里 uri 应该支持用正则过滤,不然好多没法区分的。(另外这部分是存在哪里的? shard dict ?还没仔细看代码) response time 是总和值而不是平均值…… |
60
AlexaZhou OP |
61
AlexaZhou OP |
63
zacard 2016-02-04 13:36:27 +08:00 1
不错, star
|
64
anyforever 2016-02-04 14:24:59 +08:00
不需要-t ,不需要 reload ,如果改错了的话,有后补机制么?
|
65
wujunze 2016-02-04 14:34:17 +08:00 via Android 1
赞, star
|
66
AlexaZhou OP |
67
AlexaZhou OP |
69
cxshun 2016-02-04 15:12:32 +08:00
赞,已 star 。界面好好看
|
70
anyforever 2016-02-04 15:26:39 +08:00
@AlexaZhou 嗯。生产环境,这项还是非常必要的,线上功能稳定压倒一切啊。
|
71
dark456852 2016-02-04 15:35:11 +08:00
赞一下 LZ 的精神,可惜不敢用在用在生产环境上
|
72
otokaze 2016-02-04 15:51:06 +08:00 1
这个想法不错~ 希望坚持
|
73
bidu 2016-02-04 16:37:46 +08:00 via Android 1
太赞了,已 star~
|
74
isnowify 2016-02-04 16:58:17 +08:00 1
Awesome!! 献上 star
|
75
laosb 2016-02-04 16:59:26 +08:00 1
给楼主献上一个 PR 以修正一些 README 里的小错误 /w\
|
76
xi_lin 2016-02-04 17:16:14 +08:00
赞!
|
77
lijinma 2016-02-04 17:17:14 +08:00
如果你不想安装 OpenResty ,或者你已经有了一个正在工作的 Nginx ,你也可以自己手动为 Nginx 编译安装这些模块
手动编译安装这部分,如果能写的更详细就更好了。。。 哈哈,已 Star |
78
vvsun 2016-02-04 17:54:01 +08:00
已 Star 希望能进一步完善啊
|
79
saturnast 2016-02-04 18:17:39 +08:00
赞~
|
81
kenneth 2016-02-04 18:37:28 +08:00
已经用上,不知道是不是实用,但是确实学习 openresty 的好例子。
|
82
withrock 2016-02-04 20:47:03 +08:00
|
83
barbery 2016-02-04 21:58:13 +08:00 1
不错不错
|
84
guonning 2016-02-04 22:34:53 +08:00 via Android
期待在现有 ngnix 上,傻瓜式添加
|
85
rrfeng 2016-02-04 23:31:50 +08:00
其实 shared dict 里存不了太多的东西。
大流量下的 uri 统计根本没什么用的…… |
86
AlexaZhou OP |
87
huyinjie 2016-02-05 00:44:29 +08:00 1
正好需要,已 star
|
88
MonkLuf 2016-02-05 01:35:41 +08:00 via Android
赞,没有介绍其中的防火墙功能?
|
89
lj0014 2016-02-05 15:09:31 +08:00 1
正好需要,已 star 。现在支持多久的历史数据
|
90
AlexaZhou OP |
91
hiroya 2016-02-09 23:11:57 +08:00 via iPad 1
赞,已 star
|
92
geeglo 2016-02-10 12:02:54 +08:00 via iPhone 1
可以!
|
93
Livid MOD 流量统计的步骤是在 log 阶段,所以如果是大文件下载的话,要完成的时候才会有 log ,实时的流量统计目前应该是还不支持吧?
|
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 正常,但是就是没反代成功. 楼主有测试么 |
95
Yamade 2016-02-10 13:16:43 +08:00 1
抱歉,我的失误,可以了
|
96
AlexaZhou OP @Livid 对的,目前的看不到绝对意义上的实时流量。一个请求的流量需要到这个请求结束之后才会反映出来,也就是大文件下载的话,会在这个请求结束之后出现在图表上
|
97
CrazySpiderMan 2016-02-10 16:18:52 +08:00 1
Good job!
|
98
xuhaoyangx 2016-02-10 20:45:02 +08:00 1
@AlexaZhou 如果我编译的 nginx 的用户设定是 www ,相对应的把你的这个工程也设成 www 就可以了吧
|
99
Yamade 2016-02-10 21:02:35 +08:00
限制下 ip 请求的规则可以有不?
|
100
mornlight 2016-02-10 21:09:03 +08:00 1
你搞的这个东西, exciting !
|