离线安装开源WAF:VeryNginx

VeryNginx是github上很火的一个项目,地址为:https://github.com/alexazhou/VeryNginx,它基于OpenResty,具备一个功能强大的Web配置界面,可以在这个页面上查看当前服务器的负载量和网络流量,可以动态的配置URL路径的跳转规则,反向代理规则,而无需重启nginx。最重要的是,VeryNginx兼容普通的nginx配置,在本文的案例中,我使用VeryNginx作为网站流量的监控器和静态资源缓存服务器。

 

 作者已经在github上给出了安装方法,大体就是编译两次,一次是编译VeryNginx,一次是编译OpenResty。给了一个python文件,我使用python 2.7运行没有问题。这个文件名为install.py,位于git项目的根目录下。

在编译之前,我们要准备好nginx的基本编译环境,包括gcc,pcre-dev,openssl-dev,zlib-dev等,以ubuntu为例,安装方法如下

 

sudo apt-get install openssl libssl-dev
sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install zlib1g-dev

因为是离线安装,我们假设服务器不能连接互联网,但是还好,该脚本内只有一处需要下载,就是OpenResty的安装包,代码如下

#最新版openresty

openresty_pkg_url = 'https://openresty.org/download/openresty-1.15.8.1.tar.gz'
openresty_pkg = 'openresty-1.15.8.1.tar.gz'

work_path = os.getcwd()

def install_openresty( ):
......
    #download openresty
    down_flag = True
    if os.path.exists( './' + openresty_pkg ):
        ans = ''
        while ans not in ['y','n']:
            ans = common_input(' Found %s in current directory, use it?(y/n)'%openresty_pkg)
        if ans == 'y':
            down_flag = False

    if down_flag == True:
        print('### start download openresty package...')
        exec_sys_cmd('rm -rf ' + openresty_pkg)
        exec_sys_cmd( 'wget ' + openresty_pkg_url )
    else:
        print('### use local openresty package...')

我们可以看出 ,该脚本会使用wget自动到https://openresty.org/download/openresty-1.15.8.1.tar.gz下载OpenResty的源码包,而且还会在下载之前检测一下是否存在,所以我们只需手动下载这个源码包,然后放置到verynginx的根目录,也就是install.py所在的目录下,那么该安装脚本就可以直接解压,无需再下载一次,运行如下:

离线安装开源WAF:VeryNginx_第1张图片

 在编译之前,我们还需要自己定义下编译选项,因为我的这个VeryNginx不光用作WAF和负载情况观察,还需要作为静态资源服务器使用,以减少被反向代理服务器的压力,所以我还需要添加一个nginx模块ngx_chache_purge-master(VeryNginx使用的OpenResty1.15本身就可以实现缓存功能,但是添加ngx_chache_purge-master模块之后就可以动态的控制缓存文件的删除操作,在更新静态文件时比较有用)

首先看下原版的编译配置命令

    #configure && compile && install openresty
    print('### configure openresty ...')
    os.chdir( openresty_pkg.replace('.tar.gz','') )
    exec_sys_cmd( './configure --prefix=/opt/verynginx/openresty --user=nginx --group=nginx --with-http_v2_module --with-http_sub_module --with-http_stub_status_module --with-luajit' )
    
    print('### compile openresty ...')
    exec_sys_cmd( 'make' )

 然后我只是在configure语句里添加了--add-moudle,并把ngx_chache_purge-master的源码包放置在相应的目录下,另外还有一点需要注意,那就是需要指定--prefix,也就是nginx默认的log、conf存放路径和make install的bin文件放置路径。默认为/opt/verynginx目录,但是我这里没有root权限,所以放到了当前用户家目录下,并修改了--user和--group参数。注意,install.py中除了--prefix这里需要修改默认目录之外,这个文件中还有好多需要修改的位置,比如好多的chmod命令,建议搜索“/opt/verynginx”进行批量替换。

    #configure && compile && install openresty
    print('### configure openresty ...')
    os.chdir( openresty_pkg.replace('.tar.gz','') )
    exec_sys_cmd( './configure --prefix=/home/alex/verynginx/openresty --user=alex --group=alex --with-http_v2_module --with-http_sub_module --with-http_stub_status_module --with-luajit  --add-module=/home/alex/ngx_cache_purge-master' )
    
    print('### compile openresty ...')
    exec_sys_cmd( 'make' )
    
    print('### install openresty ...')
    exec_sys_cmd( 'make install' )

其实光改了--prefix参数还不够,verynginx默认的配置文件和include的文件也需要修改目录,这些文件再源码包的verynginx/nginx_conf 目录中后面会细说。

改好install.py文件之后,我们就可以直接运行了。

像编译普通nginx一样,只是需要编译两遍。

python install.py install

编译好之后,就可以看到成功标志:

*** All work finished successfully, enjoy it~
 

安装好之后,我们可以看到默认的nginx.conf配置文件

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 /opt/verynginx/verynginx/nginx_conf/in_external.conf;

http {
    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;
    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
	client_body_buffer_size 128k;

    #gzip  on;
	
	#this line shoud be include in every http block
    include /opt/verynginx/verynginx/nginx_conf/in_http_block.conf;

    server {
        listen       80;
        
        #this line shoud be include in every server block
        include /opt/verynginx/verynginx/nginx_conf/in_server_block.conf;

        location = / {
            root   html;
            index  index.html index.htm;
        }
    }

}

按照官方说明,配置文件的最外层要写

include /opt/verynginx/verynginx/nginx_conf/in_external.conf;

这个文件在起初是空的,没有内容。

但是别忘了,由于前面编译的时候修改了--prefix参数,所以/opt/verynginx这个目录是不存在的,需要改为--prefix参数中的地址。

然后在http{}模块中要写上

include /opt/verynginx/verynginx/nginx_conf/in_http_block.conf;

注意在这个文件中引用了几个lua文件,这些文件的路径也需要根据--prefix进行修改,不然默认是/opt/verynginx目录下。 

同样需要注意修改目录

最后,每个server{}段落都要添加上

include /opt/verynginx/verynginx/nginx_conf/in_server_block.conf;

只需这三行,就可以把VeryNginx引入普通的nginx配置文件当中了。

同时还需要注意user nginx;这一行,如果你的nginx不以root用户启动,则该行会报出Warn,所以不是root直接删掉这行就好。下面就是我把VeryNginx结合静态资源缓存的配置文件融合。

注意此处,根据我的--prefix参数,我的默认配置文件路径是/home/alex/verynginx/openresty/nginx/conf/nginx.conf,nginx程序路径是/home/alex/verynginx/openresty/nginx/sbin/nginx,而不修改prefix的话,nginx默认为/opt/verynginx/openresty/nginx/sbin/nginx

 

我的配置文件如下

#user  nobody;
worker_processes  1;

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 /home/alex/verynginx/verynginx/nginx_conf/in_external.conf;

http {
    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;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
	#this line shoud be include in every http block
    include /home/alex/verynginx/verynginx/nginx_conf/in_http_block.conf;
	
    proxy_cache_path /home/alex/nginx_cache levels=1:2 keys_zone=mycache:30m max_size=10g inactive=2m use_temp_path=off;
    server {
        listen       8080;
		
		#this line shoud be include in every server block
        include /home/alex/verynginx/verynginx/nginx_conf/in_server_block.conf;
		
        server_name  localhost;
        #charset koi8-r;
		proxy_intercept_errors on;
		fastcgi_intercept_errors on;
		server_tokens  off;
		proxy_hide_header X-Powered-By;
		client_max_body_size 100m;
		keepalive_timeout  60;
		proxy_http_version 1.1;  
        proxy_set_header Upgrade $http_upgrade;  
        proxy_set_header Connection "upgrade";
        access_log  logs/host.access.log  main;

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }


        location / {
            proxy_pass   http://192.168.1.2:8080;
            proxy_set_header Host $host;
			proxy_set_header X-Forwarded-For $remote_addr;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_connect_timeout 30s;
            proxy_send_timeout 30s;
            proxy_read_timeout 30s;
			
        }
		
		location ~ \.(gif|jpg|jpeg|png|bmp|ico|webp|mp3|svg)$ {
		    proxy_cache mycache;
			proxy_cache_valid 200 302 304 30m;
            proxy_cache_key $host$uri$is_args$args;
			expires 3d;
			
			proxy_pass   http://192.168.1.2:8080;
            proxy_set_header Host $host;
			proxy_set_header X-Forwarded-For $remote_addr;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_connect_timeout 30s;
            proxy_send_timeout 30s;
            proxy_read_timeout 30s;
			access_log logs/cache.log  main;
			error_log  logs/cache_err.log;
		}
		
		
		location ~ /purge(/.*) {
            allow 127.0.0.1;
            allow 192.168.0.0/16;
            deny all;
            proxy_cache_purge mycache $host$1$is_args$args;
        }


        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }

实际上,我是先写的反向代理和静态文件缓存的nginx配置文件,然后编译的VeryNginx并添加了上面的三个include,以实现URL过滤和负载监控的功能。

由于我再配置文件里面使用了nginx的文件缓存功能,所以建立了nginx缓存文件夹之后mkdir /home/alex/nginx_cache,就可以直接执行/home/alex/verynginx/openresty/nginx/sbin/nginx来启动nginx

启动nginx
/home/alex/verynginx/openresty/nginx/sbin/nginx
重启nginx
/home/alex/verynginx/openresty/nginx/sbin/nginx -s reload
停止nginx
/home/alex/verynginx/openresty/nginx/sbin/nginx -s stop 

 

此时,我们就可以访问http://127.0.0.1/verynginx/index.html  用户名verynginx 密码verynginx来访问后台监控配置页面。

 

你可能感兴趣的:(离线安装开源WAF:VeryNginx)