之前工作中经常在 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 ![]() link? |
3 la0wei 2016-02-03 22:41:35 +08:00 ![]() |
![]() | 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 ![]() 已 star |
![]() | 10 crytis 2016-02-03 23:20:04 +08:00 ![]() 不错 已 star |
![]() | 11 toono 2016-02-03 23:20:34 +08:00 ![]() 厉害,去加 star |
![]() | 12 mengskysama 2016-02-03 23:25:27 +08:00 ![]() 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 ![]() 赞一个 |
17 DIYgod 2016-02-03 23:36:00 +08:00 ![]() 界面好看,赞,已 star |
![]() | 18 AlexaZhou OP @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 应该就可以了 不过需要小心处理好路径的问题 |
19 lightforce 2016-02-03 23:44:26 +08:00 流量大的站这日志分析是不是耗 cpu ? |
![]() | 20 hljjhb 2016-02-03 23:47:17 +08:00 ![]() 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 ![]() 支持,自己用会很爽 |
![]() | 24 lhbc 2016-02-03 23:56:35 +08:00 ![]() |
![]() | 25 kn007 2016-02-03 23:57:14 +08:00 不用 openrestry 的话,需要安装那些扩展? |
![]() | 26 wph95 2016-02-03 23:59:49 +08:00 ![]() 非常棒,已经 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 ![]() @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 ![]() @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 ![]() 支持楼主 |
![]() | 46 KenGe 2016-02-04 0846:21 +08:00 ![]() 提供下脚本自行安装配置蛮好 重新安装成本太高 噗 我已经去试用了~ |
![]() | 47 mjever 2016-02-04 09:18:49 +08:00 ![]() 支持楼主,很有实用价值! |
48 imria 2016-02-04 09:34:58 +08:00 ![]() 准备体验下,希望楼主继续做下去 |
49 ltye 2016-02-04 09:50:12 +08:00 ![]() 基于 openrestry ,提供 web 界面,赞!已经 star ,打算先在测试环境试试 |
![]() | 50 adeweb 2016-02-04 09:58:28 +08:00 ![]() 已 star ,很实用! 外行弱弱地问下,我理解的,如果改 nginx 配置是需要重启服务的,你是怎么做到热配置的? |
![]() | 51 sinux 2016-02-04 10:10:56 +08:00 ![]() 好东西,有实用性 |
![]() | 52 wudanyang 2016-02-04 10:34:36 +08:00 ![]() VeryNginx 预置了常用的过滤规则,可以一定程序上阻止常见的 SQL 注入, Git , SVN 文件泄露,目录遍历攻击,并拦截常见的扫描工具。 ============= 上面是楼主的原文,我觉得有个错别字,可以一定程度上组织常见的 SQL 注入 |
![]() |
![]() | 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 ![]() coooooooooool 希望有带宽限制这样的功能,注入过滤我觉得倒不是很必要,这种事情有专业的模块做了 |
![]() | 59 rrfeng 2016-02-04 11:45:32 +08:00 ![]() 用上了,但是感觉还有很大改进余地。 比如 tps 的曲线应该是 all 和 4xx 5xx , 2xx 没啥用嘛~ 访问统计里 uri 应该支持用正则过滤,不然好多没法区分的。(另外这部分是存在哪里的? shard dict ?还没仔细看代码) response time 是总和值而不是平均值…… |
![]() | 60 AlexaZhou |
![]() | 61 AlexaZhou OP |
63 zacard 2016-02-04 13:36:27 +08:00 ![]() 不错, 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 ![]() 赞, 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 ![]() 这个想法不错~ 希望坚持 |
![]() | 73 bidu 2016-02-04 16:37:46 +08:00 via Android ![]() 太赞了,已 star~ |
![]() | 74 isnowify 2016-02-04 16:58:17 +08:00 ![]() Awesome!! 献上 star |
75 laosb 2016-02-04 16:59:26 +08:00 ![]() 给楼主献上一个 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 ![]() 不错不错 |
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 ![]() 正好需要,已 star |
![]() | 88 MonkLuf 2016-02-05 01:35:41 +08:00 via Android 赞,没有介绍其中的防火墙功能? |
![]() | 89 lj0014 2016-02-05 15:09:31 +08:00 ![]() 正好需要,已 star 。现在支持多久的历史数据 |
![]() | 90 AlexaZhou OP |
91 hiroya 2016-02-09 23:11:57 +08:00 via iPad ![]() 赞,已 star |
![]() | 92 geeglo 2016-02-10 12:02:54 +08:00 via iPhone ![]() 可以! |
![]() | 93 Livid MOD PRO ![]() 流量统计的步骤是在 log 阶段,所以如果是大文件下载的话,要完成的时候才会有 log ,实时的流量统计目前应该是还不支持吧? |
![]() | 94 Yamade 2016-02-10 13:11:25 +08:00 ![]() 奇怪改了 默认的监听端口,web 交互界面 可以登录. http 里加了 include /etc/nginx/conf.d/*.conf; /opt/VeryNginx/nginx/sbin/nginx -t 正常,但是就是没反代成功. 楼主有测试么 |
![]() | 95 Yamade 2016-02-10 13:16:43 +08:00 ![]() 抱歉,我的失误,可以了 |
![]() | 96 AlexaZhou OP ![]() @Livid 对的,目前的看不到绝对意义上的实时流量。一个请求的流量需要到这个请求结束之后才会反映出来,也就是大文件下载的话,会在这个请求结束之后出现在图表上 |
![]() | 97 CrazySpiderMan 2016-02-10 16:18:52 +08:00 ![]() Good job! |
![]() | 98 xuhaoyangx 2016-02-10 20:45:02 +08:00 ![]() @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 ![]() 你搞的这个东西, exciting ! |