Nginx添加Lua模块和优化配置

Nginx添加Lua模块和优化配置

参考文档:

https://github.com/openresty/luajit2

https://github.com/openresty/lua-nginx-module

https://github.com/vision5/ngx_devel_kit

Nginx添加Lua模块 | Applenice

NGINX Docs | NGINX Developer Kit

https://luajit.org/

http://mirrors.sohu.com/nginx/

https://blog.csdn.net/haijiaoqihao20160106/article/details/80904756

一、引子

最近在部署项目,测试安全扫描时发现需要在 cookie 设置为 httpOnly ;虽然网上有各种做法经过测试之后发现项目不是很好;

所以最后选择了 通过 NginxLua 脚本来进行解决,这里用来记录一下实现的过程。

二、安装LuaJIT2

Nginx 添加 Lua 模块的前提需要安装 LuaJIT,这里使用的是 Openrestyluajit2

2.1、关于 LuaJIT 和 Openresty的luajit2

This is the official OpenResty branch of LuaJIT. It is not to be considered a fork, since we still regularly synchronize changes from the upstream LuaJIT project (https://github.com/LuaJIT/LuaJIT).

这是 LuaJIT 的官方 Openresty 分支。 它不被视为分叉,因为我们仍然定期同步来自上游 LuaJIT 项目的更改。

Additionally to synchronizing upstream changes, we introduce our own changes which haven’t been merged yet (or never will be). This document describes those changes that are specific to this branch.

除了同步上游变更之外,我们还引入了尚未合并(或永远不会合并)的自己的变更。本文档描述了那些特定于此分支的更改。

2.2、安装

$ cd /usr/local/src

# 这里没有使用最新版本的,而是采用 v2.1-20201229 版本
$ wget https://github.com/openresty/luajit2/archive/refs/tags/v2.1-20201229.tar.gz

# 上面的地址如果下载不了,可以使用以下加速地址
$ wget https://github.91chifun.workers.dev/https://github.com//openresty/luajit2/archive/refs/tags/v2.1-20201229.tar.gz
# 解压缩文件夹
$ tar -zxvf v2.1-20201229.tar.gz

# 编译和安装
make PREFIX=/usr/local/luajit
make install PREFIX=/usr/local/luajit

完成后看到如下内容就代表安装成功了😃

==== Successfully built LuaJIT 2.1.0-beta3 ====
......
==== Successfully installed LuaJIT 2.1.0-beta3 to /usr/local ====

2.3、环境变量配置

# ======临时生效的可以执行如下脚本======
$ export LUAJIT_LIB=/usr/local/luajit/lib
$ export LUAJIT_INC=/usr/local/luajit/include/luajit-2.1

# ======永久生效的可以执行如下脚本======
$ cat >> /etc/profile <<END
export LUAJIT_LIB=/usr/local/luajit/lib
export LUAJIT_INC=/usr/local/luajit/include/luajit-2.1
END

# 使/etc/profile 立刻生效
$ source /etc/profile

注意: 此处使用的是luajit2,并不是luajit,网上很多文章用的是从 luajit 中下载的LuaJIT-2.0.5.tar.gz,我在用LuaJIT-2.0.5测试过程中,遇到了问题:

nginx: [alert] detected a LuaJIT version which is not OpenResty’s; many optimizations will be disabled and performance will be compromised (see https://github.com/openresty/luajit2 for OpenResty’s LuaJIT or, even better, consider using the OpenResty releases from https://openresty.org/en/download.html)

三、Nginx Module下载

3.1、ngx_devel_kit

NDK(nginx development kit)模块是一个拓展nginx服务器核心功能的模块,第三方模块开发可以基于它来快速实现。NDK提供函数和宏处理一些基本任务,减轻第三方模块开发的代码量。

$ mkdir -p /usr/local/src/nginx-modules
$ cd /usr/local/src/nginx-modules
$ wget https://github.com/vision5/ngx_devel_kit/archive/v0.3.1.tar.gz

# 上面的地址如果下载不了,可以使用以下加速地址
$ wget https://github.91chifun.workers.dev/https://github.com//vision5/ngx_devel_kit/archive/refs/tags/v0.3.1.tar.gz
$ tar -xvf v0.3.1.tar.gz

3.2、lua-nginx-module

将Lua的功能嵌入到Nginx HTTP服务器中。

$ cd /usr/local/src/nginx-modules
$ wget https://github.com/openresty/lua-nginx-module/archive/v0.10.14.tar.gz

# 上面的地址如果下载不了,可以使用以下加速地址
$ wget https://github.91chifun.workers.dev/https://github.com//openresty/lua-nginx-module/archive/refs/tags/v0.10.14.tar.gz
$ tar -xvf v0.10.14.tar.gz

注意:目前lua-nginx-module的最新release版本是 v0.10.19,使用该版本在测试过程中遇到报错如下:

ginx: [alert] failed to load the 'resty.core' module (https://github.com/openresty/lua-resty-core); ensure you are using an OpenResty release from https://openresty.org/en/download.html (reason: module 'resty.core' not found:
	no field package.preload['resty.core']
	no file './resty/core.lua'
	no file '/usr/local/share/luajit-2.1.0-beta3/resty/core.lua'
	no file '/usr/local/share/lua/5.1/resty/core.lua'
	no file '/usr/local/share/lua/5.1/resty/core/init.lua'
	no file './resty/core.so'
	no file '/usr/local/lib/lua/5.1/resty/core.so'
	no file '/usr/local/lib/lua/5.1/loadall.so'
	no file './resty.so'
	no file '/usr/local/lib/lua/5.1/resty.so'
	no file '/usr/local/lib/lua/5.1/loadall.so') in /usr/local/src/nginx/conf/nginx.conf:117

在下面的链接中找到了答案,使用 v0.10.14 版本即可:

$ https://github.com/openresty/lua-resty-core/issues/248

四、Nginx编译配置和测试

4.1、nginx编译安装

$ https://nginx.org/download/nginx-1.18.0.tar.gz
$ tar -xvf nginx-1.18.0.tar.gz && cd nginx-1.18.0
$ yum -y install libpcre3-dev zlib1g-dev libssl-dev make cmake gcc gcc-c++ pcre pcre-devel zlib zlib-devel vim-enhanced openssl openssl-devel libnl libnl-devel


# 编译nginx
$ ./configure \
--prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-file-aio \
--with-http_sub_module \
--with-http_gzip_static_module \
--with-http_v2_module \
--with-pcre \
--with-http_realip_module \
--with-stream \
--with-stream_ssl_module \
--with-ld-opt="-Wl,-rpath,/usr/local/luajit/lib" \
--add-module=/usr/local/src/nginx-modules/headers-more-nginx-module-0.33 \
--add-module=/usr/local/src/nginx-modules/ngx_devel_kit-0.3.1 \
--add-module=/usr/local/src/nginx-modules/lua-nginx-module-0.10.14

$ make
$ make install

4.2、配置nginx

nginx.confserver代码块里加入如下代码:

location /hello_lua {
    content_by_lua 'ngx.say("hello, lua!")';
}

4.3、启动nginx并测试

# 启动nginx
$ /usr/local/src/nginx/sbin/nginx

# 测试
$ curl http://127.0.0.1/hello_lua
hello, lua!

五、Nginx在reponse返回的cookie中设置HttpOnly

5.1、编写脚本

# 创建lua脚本的文件夹
$ mkdir -p /usr/local/nginx/conf/other

# 创建脚本文件,并写入脚本文件
$ cat >> /usr/local/nginx/conf/other/httponly.lua <<EOF
local cookies = ngx.header.set_cookie
if cookies then
    if type(cookies) == "table" then
        for k,v in pairs(cookies) do
            cookies[k] = v .. "; HttpOnly"
            ngx.header.set_cookie = cookies
        end
    else
        local cookiesStr = cookies .. "; HttpOnly"
        ngx.header.set_cookie = cookiesStr;
    end
end
EOF

以上脚本的含义:

  • 获取 nginx 响应信息中的cookie信息
  • 如果cookie信息为空,则直接跳过,如果不为空则判断是多个 cookie 还是单个 cookie 返回
  • 如果是多个 cookie 的话,则遍历数组,每个 cookie 字符串拼接 ‘; HttpOnly’ 的字符串
  • 如果是单个 cookie 的话,则直接拼接 ‘; HttpOnly’ 的字符串

5.2、导入脚本

        # 反向代理的配置
        location /hn-gateway-api/ {
             # 添加 referer 的配置
             include referer/*.conf;

			 # 这里导入我们编写的 lua脚本
             header_filter_by_lua_file conf/other/httponly.lua;
             proxy_pass        http://www.gateway.com/;
             proxy_set_header   Host             $host;
             proxy_set_header   X-Real-IP        $remote_addr;
             proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }

六、nginx日志切割

6.1、编写日志切割脚本

编写日期切割的sh文件,文件目录:/usr/local/nginx/sbin/cut_nginx_log_rotate.sh,并写入以下内容

#!/bin/bash

# 定义一个切割方法
file_cut_func () {
    # 获取原始文件的目录
    ORIGINAL_FILE_DIR=$1
    # 日志文件的名称
    LOG_FILE_NAME=$2

    # 拼接需要操作的文件
    CUT_LOG_FILE_PATH=${ORIGINAL_FILE_DIR}/${LOG_FILE_NAME}
    echo ${CUT_LOG_FILE_PATH} 

    # 先判断以下内容是否为空,不为空的话才进行操作
    if [ -s ${CUT_LOG_FILE_PATH} ]; then
        # 获取当前的年份
        YEAR=$(date -d "yesterday" +%Y)
        # 获取所属的月份
        MONTH=$(date -d "yesterday" +%m)
        # 获取年所属的文件夹名称
        YEAR_DIR=${ORIGINAL_FILE_DIR}/${YEAR}/

        # 判断年的文件夹是否存在
        if [ ! -d ${YEAR_DIR} ];then
            mkdir ${YEAR_DIR}
        fi

        # 获取年月的文件夹是否存在
        MONTH_DIR=${YEAR_DIR}${MONTH}/
        if [ ! -d ${MONTH_DIR} ];then
            mkdir ${MONTH_DIR}
        fi

        # 获取时间来作为文件的名称
        CURRENT_LOG_NAME=$(date -d "yesterday" +%Y-%m-%d)_${LOG_FILE_NAME}
        CURRENT_LOG_PATH=${MONTH_DIR}${CURRENT_LOG_NAME}
        # 移动日志文件
        mv -f ${CUT_LOG_FILE_PATH} ${CURRENT_LOG_PATH}
    fi
}

# 定义一个打包的方法(每年执行一次打包操作)
tar_files_func(){
    # 获取原始文件的目录
    ORIGINAL_FILE_DIR=$1

    # 获取当前的年份
    YEAR=$(date -d "yesterday" +%Y)
    MONTH=`date +%m`
    DAY=`date +%d`

    # 判断是不是每年的1月1号,如果是的话再进行操作
    if [[ $DAY -eq 1 ]] && [[ $MONTH -eq 1 ]] ;then
        # 获取年所属的文件夹名称
        YEAR_DIR=${ORIGINAL_FILE_DIR}/${YEAR}/

        # 判断年的文件夹是否存在
        if [ -d ${YEAR_DIR} ];then
            echo "先进入到当前目录: ${ORIGINAL_FILE_DIR}"
            cd ${ORIGINAL_FILE_DIR}

            # 打包文件
            echo "tar -zcvf ${YEAR}.tar.gz ./${YEAR}"
            tar -zcvf ${YEAR}.tar.gz ./${YEAR}

            # 删除源文件夹
            echo "rm -rf ./${YEAR}"
            rm -rf ./${YEAR}
        fi
    fi

}

# 配置的日志的存放目录
LOGS_DIR=/usr/local/nginx/logs
NGINX_PID_FILE=/usr/local/nginx/logs/nginx.pid


# 切割 access.log 、host.access.log 和 error.log 文件
file_cut_func ${LOGS_DIR} access.log
file_cut_func ${LOGS_DIR} error.log
file_cut_func ${LOGS_DIR} host.access.log

# 执行打包的操作
tar_files_func ${LOGS_DIR}

# 重启nginx
kill -USR1 `cat ${NGINX_PID_FILE}`

日志切割的优化版本

#!/bin/bash

# 备份日志的年份
YEAR=$(date -d "yesterday" +%Y)
# 备份日志的月份
MONTH=$(date -d "yesterday" +%m)
# 备份日志的日子
DAY=$(date -d "yesterday" +%d)

# 当前的日子
CURRENT_DAY=`date +%d`

# 备份文件的前缀目录
BACK_UP_PATH_PREFIX=/usr/local/nginx/logs

# pid文件的存放位置
NGINX_PID_FILE=/usr/local/nginx/logs/nginx.pid

# 完整的目录
FULL_BACK_UP_PATH=${BACK_UP_PATH_PREFIX}/${YEAR}/${MONTH}/${DAY}

# 创建用于存放目录的文件夹
mkdir -p ${FULL_BACK_UP_PATH}

# 将日志文件移动到指定的目录(判断一下内容是否为空)
if [ -s ${BACK_UP_PATH_PREFIX}/access.log ]; then
   mv -f ${BACK_UP_PATH_PREFIX}/access.log ${FULL_BACK_UP_PATH}/access.log
fi
if [ -s ${BACK_UP_PATH_PREFIX}/error.log ]; then
   mv -f ${BACK_UP_PATH_PREFIX}/error.log ${FULL_BACK_UP_PATH}/error.log
fi
if [ -s ${BACK_UP_PATH_PREFIX}/host.access.log ]; then
   mv -f ${BACK_UP_PATH_PREFIX}/host.access.log ${FULL_BACK_UP_PATH}/host.access.log
fi


# 将日志文件进行打包(每个月1号将上个月的文件打包)
if [[ $CURRENT_DAY -eq 1 ]] ;then
	# 获取年所属的文件夹名称
	TAR_FULL_DIR=${BACK_UP_PATH_PREFIX}/${YEAR}/${MONTH}
	TAR_YEAR_DIR=${BACK_UP_PATH_PREFIX}/${YEAR}
	TAR_BACK_UP_NAME=${YEAR}-${MONTH}-${DAY}_nginxLog.tar.gz
	

	# 判断需要压缩的目录是否存在
	if [ -d ${TAR_FULL_DIR} ];then
		echo "先进入到当前目录: ${TAR_YEAR_DIR}"
		cd ${TAR_YEAR_DIR}

		# 打包文件
		echo "tar -zcvf ${TAR_BACK_UP_NAME} ./${MONTH}"
		tar -zcvf ${TAR_BACK_UP_NAME} ./${MONTH}

		# 删除源文件夹
		echo "rm -rf ./${MONTH}"
		rm -rf ./${MONTH}
	fi
fi

# 重启nginx
kill -USR1 `cat ${NGINX_PID_FILE}`

# 搜索 /usr/local/nginx/logs 目录下 180 天之前修改的所有目录,并进行删除
find ${BACK_UP_PATH_PREFIX} -type d -mtime +180 -exec rm -rf {} \;

6.2、添加执行权限

$ chmod u+x /usr/local/nginx/sbin/cut_nginx_log_rotate.sh

6.3、添加系统的定时任务

设置Linux定时任务,0 0 * * * root /usr/local/nginx/sbin/cut_nginx_log_rotate.sh表示配置一个定时任务,定时每天00:00以root身份执行脚本/usr/local/nginx/sbin/cut_nginx_log_rotate.sh,实现定时自动分割Nginx日志(包括访问日志和错误日志)

# 每天的 00:01 分来执行脚本
$ cat >> /etc/crontab <<EOF
1 0 * * * root /usr/local/nginx/sbin/cut_nginx_log_rotate.sh
EOF

七、Nginx 配置 动态限制 referer

正常的 referer 限制只能限制固定的来源,例如:www.baidu.com, www.google.com 等,但是对于多个访问点的话就不能使用这种方式啦。

原理:判断 referer的来源是否为空,如果为空则表示(正常情况下)是用户直接输入url地址来进行访问的方式;如果不为空的话则限制当前请求的referer的来源和访问的url来源必须保持一致。

例如:访问的地址为:http://127.0.0.1/main/legislation-api,则referer的地址必须为:http://127.0.0.1/xxxx

注意:但是由于nginx的if判断中不需要 嵌套和多条件的 && 和 || ,那就只能分开写啦:

# 定义了变量用来获取当前用户访问的uri,例如:127.0.0.1:8888
set $custom_context_path "$scheme://$http_host";
# 设置一个初始的状态,最后通过这个状态来进行判断
set $access_flag "0";
set $custom_referer_resolve "";

# 由于通过tunnel的方式来访问的数据端口是会添加到$http_host变量变量中的,这里是为了截取,例如:http://tunnel.xxxx.com:11080/,$1表示:http或者https,$4表示tunnel.xxxx.com 
if ($custom_context_path ~ "^((http[s]?)?(://))?([A-Za-z0-9\-\.]+)(:[0-9]+)"){
 set $custom_context_path "$1$4";
}

# 获取referer来源的 host 和 port(如果不是默认端口的话),$1表示:http或者https,$4表示tunnel.xxxx.com 
if ($http_referer ~ "^((http[s]?)?(://))?([A-Za-z0-9\-\.]+)(:[0-9]+)?(.*)$"){
 set $custom_referer_resolve "$1$4";
}

if ($http_referer = ''){
 set $access_flag 1;
}

# 判断这两个 host 是否一致
if ($custom_context_path != $custom_referer_resolve){
 set $access_flag "${access_flag}2";
}

if ($access_flag = '02'){
 return 403;
}

八、配置限制访问点(cors)

由于前段采用了微服务,前段要求 子模块父模块 不能部署在同一个端口,之前在开发的时候直接使用 Access-Control-Allow-Origin:* 简单粗暴的让所有站点都可以访问,但是部署到正式环境就不能这样啦。

父模块端口为:80

子模块端口为:9996

添加配置 cors.conf的配置文件,创建在 conf/other 的配置文件下:

# 定义变量
set $custom_referer $http_referer;
if ($http_referer ~ "^(.*)/$") {
   set $custom_referer $1;
}
# 指定允许其他域名访问
add_header Access-Control-Allow-Origin $custom_referer;
# 是否允许后续请求携带认证信息(cookies),该值只能是true,否则不返回
add_header Access-Control-Allow-Credentials true;
# 允许的请求类型
add_header Access-Control-Allow-Methods GET,POST;
# 允许的请求头字段
add_header Access-Control-Allow-Headers x-requested-with,content-type;

主配置文件 conf/nginx.conf 的配置文件下:

    server {
        listen       9996;
        server_name  localhost;
        charset utf-8;

        # 添加 referer 的配置
        include other/referer.conf;

        # 关于安全扫描问题的解决
        add_header X-Content-Type-Options nosniff;
        add_header X-Frame-Options SAMEORIGIN;
        add_header X-Xss-Protection mod=block;

        # 引入cors的配置
        include other/cors.conf;        

        # 前端微服务模块存放位置
        location / {
            # 不限制的情况下
            # add_header Access-Control-Allow-Origin *;
            alias /opt/app/henan/childHtml/;
            index  index.html index.htm;
        }
    }

九、配置stream 模块(用于tcp和udp的转发)

由于正式环境项目的安全问题,我们需要先登录堡垒机,然后再堡垒机上登录到正式的服务器。

但是在传输大文件的时候就疯了;例如测试环境中的elk的备份数据,需要同步到正式环境中,文件大小为200G;

如果按照正常的流程的话,那就是先将备份文件从 测试环境导入到本地,然后本地上传到堡垒机, 然后再从堡垒机上传到服务器中;这个过程不仅繁琐,还耗时。。。。。

所以就可以直接在正式服务器中开通端口转发,然后可以直接上传。。。。

添加用于端口转发的配置文件conf/stream.conf

stream {
    server {
        listen 9990;
        proxy_pass 172.20.9.80:3306;
    }

    server {
        listen 9992;
        proxy_pass 172.20.9.76:22;
    }
}

在主配置文件中引入当前配置 conf/stream.conf

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 {
    # 使用epoll(linux2.6的高性能方式)
    use epoll;
    worker_connections  65535;
}

# 导入我们stream的模块配置
include other/stream.conf;

# 其他模块内容省略.........

十、完整的配置内容如下:

#user  nobody;
# nginx会自动根据核心数为生成对应数量的worker进程
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 {
    # 使用epoll(linux2.6的高性能方式)
    use epoll;
    worker_connections  65535;
}

# 导入我们特殊的模块配置
include other/stream.conf;

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;
    # 文件的最大上传大小为50m
    client_max_body_size 50m;
    
    # 隐藏响应头中的有关操作系统和web server(Nginx)版本号的信息
    server_tokens off;

    # sendfile()可以在磁盘和TCP socket之间互相拷贝数据(或任意两个文件描述符)
    sendfile on;

    # http连接超时时间,默认是60s
    keepalive_timeout 65;

    # 开启gzip压缩
    gzip  on;
    
    # 启用gzip压缩的最小文件,小于设置值的文件将不会压缩 
    gzip_min_length   1k;
    
    # 设置压缩所需要的缓冲区大小
    gzip_buffers     4 16k;
    
    # 设置gzip压缩针对的HTTP协议版本 
    gzip_http_version 1.1;
    
    # gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间,后面会有详细说明 
    gzip_comp_level 2;
    
    # 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。
    gzip_types       text/plain application/x-javascript text/css application/xml;
    
    # 是否在http header中添加Vary: Accept-Encoding,建议开启 
    gzip_vary on;

    # 反向代理配置,启用ip_hash模块
    upstream  www.gateway.com {
        server 172.20.9.72:9999;
        server 172.20.9.73:9999;
        server 172.20.9.74:9999;
    }
    
    server {
        listen       9996;
        server_name  localhost;
        charset utf-8;

        # 添加 referer 的配置
        include other/referer.conf;

        # 关于安全扫描问题的解决
        add_header X-Content-Type-Options nosniff;
        add_header X-Frame-Options SAMEORIGIN;
        add_header X-Xss-Protection mod=block;
        
        # 引入cors的配置
        #include other/cors.conf;        

        # 前端微服务模块存放位置
        location / {
            add_header Access-Control-Allow-Origin *;
            alias /opt/app/henan/childHtml/;
            index  index.html index.htm;
        }
#        error_page   500 502 503 504  /50x.html;
#        location = /50x.html {
#            root   html;
#        }
    }
    
    server {
        listen       80;
        server_name  localhost;
        charset utf-8;
        access_log  logs/host.access.log  main;
        
        root /opt/app/henan/html/dist;


        # 关于安全扫描问题的解决
        add_header X-Content-Type-Options nosniff;
        add_header X-Frame-Options SAMEORIGIN;
        add_header X-Xss-Protection mod=block;

        # 前端网关服务模块存放位置
        location / {
            try_files $uri $uri/ /index.html;
            index  index.html index.htm;
        }

        # 反向代理的配置
        location /hn-gateway-api/ {
             # 添加 referer 的配置
             include other/referer.conf;
             # 导入lua脚本
             header_filter_by_lua_file conf/other/httponly.lua;
             proxy_pass        http://www.gateway.com/;
             proxy_set_header   Host             $host;
             proxy_set_header   X-Real-IP        $remote_addr;
             proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }

        location /hn-gateway-ws/ {
             # 添加 referer 的配置
             include other/referer.conf;
             # 导入lua脚本
             header_filter_by_lua_file conf/other/httponly.lua;
             proxy_pass        http://www.gateway.com/;
             proxy_set_header   Host             $host;
             proxy_set_header   X-Real-IP        $remote_addr;
             proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
             # websocket suport(websocket的启用)
             proxy_set_header Upgrade $http_upgrade;
             proxy_set_header Connection "upgrade";
        }

#        error_page   500 502 503 504  /50x.html;
#        location = /50x.html {
#            root   html;
#        }    
   }
}

十一、保留180天备份文件的脚本

由于等保测评的要求需要保留备份6个月的数据,所以这里编写一个脚本用来清除和备份数据

#!/bin/bash

YEAR=$(date -d "yesterday" +%Y)
MONTH=`date +%m`
DAY=`date +%d`
BACK_UP_PREFIX=/data/backup/elk
FULL_BACK_UP_PATH=${BACK_UP_PREFIX}/${YEAR}/${MONTH}/${DAY}

# 创建备份的文件夹
mkdir -p ${FULL_BACK_UP_PATH}

elasticdump \
  --input=http://172.20.9.82:9200/oplog \
  --output=${FULL_BACK_UP_PATH}/oplog_mapping.json \
  --httpAuthFile=${BACK_UP_PREFIX}/httpAuthFile \
  --type=mapping

elasticdump \
  --input=http://172.20.9.82:9200/oplog \
  --output=${FULL_BACK_UP_PATH}/oplog_data.json \
  --httpAuthFile=${BACK_UP_PREFIX}/httpAuthFile \
  --type=data


# 搜索 /data/backup/elk 目录下 180 天之前修改的所有目录,并进行删除
find ${BACK_UP_PREFIX} -type d -mtime +180 -exec rm -rf {} \;
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在Nginx配置Lua模块,你需要遵循以下步骤: 1. 在安装Nginx之前,请确保你已经安装了LuaJIT或者Lua的开发库。你可以通过在终端中运行以下命令来安装它们: 对于Ubuntu/Debian系统: ``` sudo apt-get install libluajit-5.1-dev ``` 对于CentOS/RHEL系统: ``` sudo yum install lua-devel ``` 2. 下载Nginx的源码包,并解压缩它。 3. 在解压缩后的目录中,运行以下命令来配置编译选项,其中`--prefix`是安装目录的路径: ``` ./configure --prefix=/path/to/install --add-module=/path/to/nginx-lua-module ``` 请将`/path/to/nginx-lua-module`替换为你实际安装Lua模块的路径。 4. 运行以下命令编译和安装Nginx: ``` make sudo make install ``` 5. 配置Nginx以使用Lua模块。在Nginx配置文件(通常是`nginx.conf`)中添加以下内容: ``` http { lua_package_path "/path/to/lua-scripts/?.lua;;"; lua_package_cpath "/path/to/lua-modules/?.so;;"; server { ... location / { ... content_by_lua_file /path/to/lua-script.lua; } } } ``` 请将`/path/to/lua-scripts`替换为你实际存放Lua脚本的路径,将`/path/to/lua-modules`替换为你实际存放Lua模块的路径,将`/path/to/lua-script.lua`替换为你实际的Lua脚本文件路径。 6. 保存并关闭配置文件后,重新启动Nginx服务。你现在应该可以在浏览器中访问配置Lua脚本了。 这些步骤涵盖了在Nginx配置Lua模块的基本过程。请根据你自己的需求进行相应的调整和扩展。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值