安装 Nginx / OpenResty
VeryNginx 基于 OpenResty[^openresty],所以你需要先安装它:
OpenResty安装前准备
●Centos:yum install -y readline-devel pcre-devel openssl-devel gcc GeoIP-devel
●Debian|Ubuntu:apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl make build-essential libgeoip-dev
●紫色为geoip模块所需要的基础库
OpenResty安装
●wget https://openresty.org/download/openresty-1.11.2.1.tar.gz
●tar -zxvf openresty-1.11.2.1.tar.gz
●cd openresty-1.11.2.1
●./configure --with-luajit --with-pcre --with-http_gzip_static_module --with-http_realip_module --with-http_geoip_module --with-http_ssl_module --with-http_stub_status_module --prefix=/app/openresty
●make && make install
VeryNginx 实际使用到了 OpenResty 中的这些模块
lua-nginx-module
http_stub_status_module
lua-cjson library
如果你不想安装 OpenResty,或者你已经有了一个正在工作的 Nginx,你也可以自己手动为 Nginx 编译安装这些模块
部署 VeryNginx
克隆 VeryNginx 仓库到本地, 复制 nginx.conf 和 VeryNginx 文件夹到 Nginx 的工作目录.
cd ~
git clone https://github.com/alexazhou/VeryNginx.git
rm -f /app/openresty/nginx/conf/nginx.conf
cp ~/VeryNginx/nginx.conf /app/openresty/nginx/conf/nginx.conf
# 创建 /app/openresty/nginx/waf/verynginx 目录
mkdir -p /app/openresty/nginx/waf/verynginx
# 把 /VeryNginx/verynginx 拷贝到 /app/openresty/nginx/waf/verynginx
cp -r ~/VeryNginx/verynginx /app/openresty/nginx/waf/verynginx
编辑 Nginx 配置文件
VeryNginx 项目提供了一个配置模版
/app/openresty/nginx/conf。你需要把自己站点的 Nginx 配置加到这个模版里面。 但是记得不要修改配置 VeryNginx 的那部分代码(除非你知道自己在干啥 )。
接下来,说明配置文件有三点比较重要:
include /app/openresty/nginx/waf/verynginx/verynginx/nginx_conf/in_external.conf;
include /app/openresty/nginx/waf/verynginx/verynginx/nginx_conf/in_http_block.conf;
include /app/openresty/nginx/waf/verynginx/verynginx/nginx_conf/in_server_block.conf;
in_http_block.conf z合格配置文件需要修改
upstream vn_upstream{
server 127.0.0.1;
balancer_by_lua_file /app/openresty/nginx/waf/verynginx/verynginx/lua_script/on_banlance.lua;
keepalive 1024; #Connection pool
}
lua_package_path '/app/openresty/nginx/waf/verynginx/verynginx/lua_script/?.lua;;/app/openresty/nginx/waf/verynginx/verynginx/lua_script/module/?.lua;;';
lua_package_cpath '/app/openresty/nginx/waf/verynginx/verynginx/lua_script/?.so;;';
lua_code_cache on;
lua_shared_dict status 1m;
lua_shared_dict frequency_limit 10m;
lua_shared_dict summary_long 10m;
lua_shared_dict summary_short 10m;
init_by_lua_file /app/openresty/nginx/waf/verynginx/verynginx/lua_script/on_init.lua;
rewrite_by_lua_file /app/openresty/nginx/waf/verynginx/verynginx/lua_script/on_rewrite.lua;
access_by_lua_file /app/openresty/nginx/waf/verynginx/verynginx/lua_script/on_access.lua;
log_by_lua_file /app/openresty/nginx/waf/verynginx/verynginx/lua_script/on_log.lua;
其他2个文件不要改变
配置 VeryNginx 的代码是下面这部分:
#-----------------VeryNginx config code------------------
#user nginx;
worker_processes auto;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
include /app/openresty/nginx/waf/verynginx/verynginx/nginx_conf/in_external.conf;
#include /app/openresty/nginx/waf/verynginx/nginx_conf/in_http_block.conf;
http {
charset utf-8;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
server_tokens off;
types_hash_max_size 2048;
server_names_hash_bucket_size 128;
large_client_header_buffers 4 32k;
fastcgi_intercept_errors on;
proxy_intercept_errors on;
underscores_in_headers on;
client_header_timeout 15s;
client_body_timeout 15s;
client_max_body_size 100m;
client_body_buffer_size 2m;
client_header_buffer_size 256k;
#keepalive_timeout 0;
keepalive_timeout 90s;
keepalive_requests 2000;
# MIME
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
#tcp_nopush on;
#keepalive_timeout 0;
# gzip
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/plain text/css application/javascript application/x-javascript application/xml application/json;
gzip_vary on;
proxy_connect_timeout 5s;
proxy_read_timeout 1800s;
proxy_send_timeout 1800s;
proxy_buffer_size 128k;
proxy_buffers 100 128k;
#proxy_busy_buffers_size 1m;
#proxy_temp_file_write_size 512k;
#this line shoud be include in every http block
include /app/openresty/nginx/waf/verynginx/verynginx/nginx_conf/in_http_block.conf;
log_format main '$remote_addr -'
' $remote_user'
' [$time_local]'
' "$request"'
' $status'
' $body_bytes_sent'
' "$http_referer"'
' "$http_user_agent"'
' "$http_x_forwarded_for"'
' $upstream_response_time'
' $upstream_addr';
access_log logs/access.log main;
upstream gateway_pool {
# 网关的地址
server 106.12.129.14:9200;
}
server {
listen 80;
#this line shoud be include in every server block
include /app/openresty/nginx/waf/verynginx/verynginx/nginx_conf/in_server_block.conf;
#include /app/openresty/nginx/waf/verynginx/nginx_conf/in_http_block.conf;
location / {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
proxy_set_header Host $host;
proxy_pass http://gateway_pool;
}
}
}
#---------------VeryNginx config code end-----------------
如果不使用 VeryNginx 提供的配置模版,你也可以手动把这部分加入到自己的 Nginx 配置文件中. (如果安装路径不是/app/openresty ,需要对 lua_package_cpath 和 lua_package_path 的值进行修改)
启动服务
/app/openresty/nginx/sbin/nginx
停止服务
/app/openresty/nginx/sbin/nginx -s stop
对 VeryNginx 进行配置
打开浏览器访问 http://127.0.0.1/verynginx/index.html 。
默认用户名和密码是 verynginx / verynginx 。
登录之后就可以查看状态,并对配置进行修改了。修改配置后,记得到 「配置 > 系统 > 全部配置」去保存.
提示
通过 VeryNginx 控制面板保存新配置之后,会立刻生效,并不需要 restart/reload Nginx。
VeryNginx 把配置保存在 /app/openresty/nginx/waf/verynginx/configs/config.json 里面。
如果因为配错了什么选项,导致无法登录,可以手动删除 config.json 来清空配置。
VeryNginx WAF功能
支持IP白名单和黑名单功能,直接将黑名单的IP访问拒绝。
支持URL白名单,将不需要过滤的URL进行定义。
支持User-Agent的过滤,匹配自定义规则中的条目,然后进行处理(返回403)。
支持CC攻击防护,单个URL指定时间的访问次数,超过设定值,直接返回403。
支持Cookie过滤,匹配自定义规则中的条目,然后进行处理(返回403)。
支持URL过滤,匹配自定义规则中的条目,如果用户请求的URL包含这些,返回403。
支持URL参数过滤,原理同上。
支持日志记录,将所有拒绝的操作,记录到日志中去