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所在的目录下,那么该安装脚本就可以直接解压,无需再下载一次,运行如下:
在编译之前,我们还需要自己定义下编译选项,因为我的这个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来访问后台监控配置页面。