type
Post
status
Published
date
slug
summary
tags
category
icon
password
Property
Jan 2, 2023 08:51 AM
Language

前言:

  • 关于lua的特性不再赘述;
  • lua在web上基于lua-nginx-module运作,目前还没有Apache的支持组件,所以妄图使用Apache的可以撤了;
本人环境供参考:
Distributor ID: Debian Description: Debian GNU/Linux 8.8 (jessie) Release: 8.8 Codename: jessie
注:不确定wheezy版本的Linux下luajit是否可用。

搭建步骤:

  • 首先确定自己的APT源是否可用,是否足够新. 本人最开始使用了一个较为老旧的dotdeb版本,导致apt-cache查询不到lua-nginx-module,甚至一度尝试手动加载该模块,由此浪费了许多时间;
本人使用的apt source list供参考:
sudo vi /etc/apt/sources.list > deb http://mirrors.aliyun.com/dotdeb jessie all deb http://mirrors.aliyun.com/debian jessie main contrib non-free deb http://mirrors.aliyun.com/debian jessie-updates main contrib non-free deb http://mirrors.aliyun.com/debian-security jessie/updates main contrib non-free
需要注意的是:添加源的时候需要注意完整性,本人最开始图省事,仅用了一个all,发现apt并不能找到luajit模块,又浪费了很多时间。
  • 没有nginx的先安装nginx;
不再赘述
sudo apt-get install nginx-full
  • 安装lua及相关组件
不再赘述
apt-get install lua5.2 lua5.2-doc liblua5.2-dev
  • 安装luajit
sudo apt-get install luajit
关于JIT :
通常,程序有两种运行方式:静态编译与动态直译。 静态编译的程序在执行前全部被翻译为机器码,而动态直译执行的则是一句一句边运行边翻译。 即时编译(Just-In-Time Compiler)则混合了这二者,一句一句编译源代码,但是会将翻译过的代码缓存起来以降低性能损耗。
此外,使用luajit可以大大提高lua的运行效率,由此也被官方钦定。
It is highly recommended to use OpenResty releases which integrate Nginx, ngx_lua, LuaJIT 2.1, as well as other powerful companion Nginx modules and Lua libraries.
  • 安装nginx的lua模块 lua-nginx-module
sudo apt-get install libnginx-mod-http-lua
需要注意的是:如果前面apt源不够新或不够全,很可能会在安装此模块的时候出现找不到luajit依赖项的情况,此时请寻找新的可靠的源并确保完整性,不要在这里浪费时间。
  • 配置nginx
nginx的配置中,核心在于content_by_lua_file
本人的配置代码供参考:
server { listen 80; server_name ebid.xxxx.com; root /home/separes/xxx; location / { lua_code_cache off; // 缓存 content_by_lua_file /home/separes/xxx/index.o; } }
需要注意的是:这里的nginx缓存是默认开启的,推荐调试及开发环境中手动关闭 lua_code_cache。
  • 7.其它
这里推荐几个组件
// cjson sudo apt-get install lua-cjson // lyaml sudo luarocks install lyaml // dbi sudo luarocks install luadbi-mysql MYSQL_INCDIR=/usr/include/mysql //实测后面必须指定MYSQL路径,指向系统中的mysql根目录,匹配mysql.c文件
需要注意的是,使用 luarocks/apt-get 安装或升级 lua-DBI 的时候,需要注意新版本的DBI并不完全向下兼容,其中dbi参数由全局变量改为了局部变量,如果在以前的代码中使用过,需要重新进行声明,否则该参数会报错。
文档:
环境搭建至此为止, 关于Lua的使用及细则另行描述。
 
接下来拉取verynginx的项目文件/安装:
git clone https://github.com/alexazhou/VeryNginx.git cd VeryNginx python install.py install verynginx
 
然后编辑Nginx的主配置文件:
nano /etc/nginx/nginx.conf
引用下面的配置:
include /opt/verynginx/verynginx/nginx_conf/in_external.conf; # http配置块外部 include /opt/verynginx/verynginx/nginx_conf/in_http_block.conf; # http配置块内部
编辑nginx默认站点配置文件:
nano /etc/nginx/sites-enabled/default
server配置块内部引用:
include /opt/verynginx/verynginx/nginx_conf/in_server_block.conf;
准确点说是每个server配置块内都需要引用in_server_block.conf,例如你在conf.d内还有几个vhost,那么这些都需要引用in_server_block.conf。
之后测试配置看有没有报错:
nginx -t
没有的话,重启一下Nginx就OK了:
systemctl restart nginx
访问服务器的公网IP+/verynginx/index.html (默认的管理员账号密码:verynginx)
接下来我自己测试下防护CC的能力,我测试的方法:
我临时开了一台小鸡并搭建了一个WordPress博客,并且没有开启verynginx的浏览器验证功能,接着我找了一堆代理IP+一个CC工具(支持UA随机变换)
然后我C我自己,从verynginx的WEB页面来看,TCP连接数700左右,每秒请求最高峰接近800r/s:
notion image
此时top看一下系统负载和进程使用资源的情况,33的负载,可以说这台小鸡已经挂逼了,网站肯定也是打不开的:
notion image
接下来我开启了verynginx的浏览器验证功能,使用JS的方式进行验证,因为有些高级点的CC工具支持Cookie:
notion image
配置好了之后别忘记了保存,要确保这里是Enable的状态:
notion image
接下来我再次C我自己(我C我自己),可以看到TCP连接数接近800:
notion image
但此时的系统负载呢?除了Nginx要处理大量的TCP连接占用了少量CPU外,系统运行依旧流畅,网站打开不受影响:
notion image
这样基本可以防护大部分的CC攻击,但同时也有一些弊端:
1.搜索引擎的蜘蛛无法通过这个验证就无法抓取你的网站,对收录有影响。
2.各种RSS订阅和机器人,例如Telegram的那些订阅频道,应该是不能正常收到推送了。
所以建议这个功能仅在被攻击的时候打开。
Git 保存用户名和密码Scaleway账号信息