lua脚本 实现灰度发布 线上测试

大概逻辑是,先用redis 把测试人员的ip存入到一个集合中,然后用lua脚本判断当前客户端ip是否在这个集合,如果在,就做测试通道,否则就是正式环境。

如图:

把测试人员的ip地址存入 redis集合中

代码如下

首先要安装 ngxin lua 模块 我博客里有,就不在这里写了

首先是lua脚本

local redis = require "resty.redis" --导入redis包
local red = redis:new() --实例化redis
local headers = ngx.req.get_headers()--获取头部文件
local ok,err = red:connect("127.0.0.1",6379) --连接redis
local ip = headers["X-REAL-IP"] or headers["X_FORWARDED_FOR"] or ngx.var.remote_addr or "0.0.0.0" --获取ip
if not ok then
ngx.say("fail to connect 127.0.0.1:6379")
return
end
--red:sadd("hxr",ip)
local str = red:smembers("hxr") --获取hxr这个集合里的 ip
for k,v in pairs(str) do --遍历
if(v==ip)
then
ngx.exec("@here") --存在就跳转到这个节点
return
end
end
ngx.exec("@noHere") --否则 就跳转到 noHere这个节点

然后是 test_lua.conf 配置文件

server{
        listen 9090;
        server_name localhost;
        location / {
                default_type 'text/plain';
                charset utf-8;
                content_by_lua_file /soft/nginx/conf/conf/test_lua.lua;
        }

        location @here {
                root /web/testLua/one;
        }

        location @noHere{
                root /web/testLua/two;
        }

}

运行下 9090端口

打印的是 @noHere 这里的代码

然后我们把ip加进集合中

再次运行

这时显示的是@here 这里的代码

liunx png图片质量压缩

首先下载 sudo apt-get install pngquant

编写shell脚本

# !/bin/bash
#

lists=`find /uploads/ -name '*.png'`

for list in ${lists[@]}
do
        `pngquant -f $list -o $list` #-f 表示覆盖 -o 表示输出名
done

保存 test.sh

运行 /bin/bash test.sh

nginx 允许ip访问

location ^~/wp-login.php
        {
                 allow *****; #运行此ip访问 wp-login.php 路径
                 deny all;  #紧张所有ip访问
                 fastcgi_pass   127.0.0.1:9001;
                 fastcgi_index  index.php;
                 fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                 include        fastcgi_params;
        }

nginx编译 lua

转载 https://www.imooc.com/article/19597 lua模块 
wget http://luajit.org/download/LuaJIT-2.0.2.tar.gz
make install  PREFIX=/usr/local/LuaJIT 
export LUAJIT_LIB=/usr/local/LuaJIT/lib
export LUAJIT_INC=/usr/local/LuaJIT/include/luajit-2.0

wget https://github.com/simpl/ngx_devel_kit/archive/v0.3.0.tar.gz
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.9rc7.tar.gz

git clone https://github.com/arut/nginx-rtmp-module.git

nginx 前置查看 https://blog.csdn.net/sinat_34344123/article/details/79094003

cd /soft/nginx
./configure --prefix=/soft/nginx --with-http_ssl_module --add-module=/downSoft/nginx-rtmp-module --add-module=/downSoft/lua-nginx-module-0.10.9rc7 --add-module=/downSoft/ngx_devel_kit-0.3.0

make make install
echo "/usr/local/LuaJIT/lib" >> /etc/ld.so.conf
然后执行如下命令:
ldconfig

下载 openresty http://openresty.org/cn/linux-packages.html
修改nginx.conf

    http{
    	....
    	lua_package_path "/usr/local/openresty/lualib/?.lua;;"; //添加lua库
    	 server {
	        listen       80;
	        server_name  localhost;
	
	        #charset koi8-r;
	
	        #access_log  logs/host.access.log  main;
	
	        location / {
	            default_type 'text/html';
	            content_by_lua '
	
	                local redis = require "resty.redis"
	                ngx.say("Hello, Lua!")
	            ';
	            content_by_lua_file "/soft/nginx/conf/test.lua";
	            #root   html;
	            #index  index.html index.htm;
	        }
		}
    }

数据库备份 git 上传shell脚本

#!/bin/bash
#

echo `mysqldump --defaults-extra-file=/usr/local/mysql/my.cnf --all-databases > /db/all.sql`
today_date=`date +'%Y%m%d%H%M%S'`
cd /db
echo `git add all.sql`
echo `git commit -m $today_date`
echo `git push -f usdb master`

lua redis nginx 根据ip来做限制

lua 脚本
local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(1000) -- 1 sec
local ok,err = red:connect("127.0.0.1",6379)

local str = os.time()
local headers = ngx.req.get_headers()
local ip = headers["X-REAL-IP"] or headers["X_FORWARDED_FOR"] or ngx.var.remote_addr

local res = red:lrange(ip,0,-1)
local len = table.getn(res)

if not ip then
        ngx.say("ip地址不能为空!")
        return
end
if len < 30 then
        red:lpush(ip,str)
else
        local start_time = red:lindex(ip,0)
        if str-start_time < 30 then
                ngx.say("频繁访问!")
                return
        else
                ngx.say("重新开始!")
                red:del(ip)
        end
end

保存脚本为 test1.lua

nginx
lua_package_path "/usr/local/openresty/lualib/?.lua;;"; //redis.lua 路径 如果找不到 find / -name redis.lua 找一下

server{
	location / {
                #default_type 'text/plain';
                add_header Content-type 'text/html;charset=utf-8';
                content_by_lua_file conf/test1.lua;
        }
}