使用nginx-lua配置统一url自动跳转到hadoop-ha集群的active节点

下载安装nginx所用的依赖

yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

下载nginx

wget http://nginx.org/download/nginx-1.12.2.tar.gz 
tar -xvf nginx-1.12.2.tar.gz

稍后安装nginx

安装lua语言

yum install readline-develcurl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make linux test
make install

安装LuaJIT,安装路径/opt/luaJIT-2.1.0自行设置

wget http://luajit.org/download/LuaJIT-2.1.0-beta2.tar.gz
tar zxf LuaJIT-2.1.0-beta2.tar.gz
cd LuaJIT-2.1.0-beta2
make PREFIX=/opt/luaJIT-2.1.0
make install PREFIX=/opt/luaJIT-2.1.0

设置环境变量
打开:vi /etc/profile

export LUAJIT_LIB=/opt/luaJIT-2.1.0/lib 
export LUAJIT_INC=/opt/luaJIT-2.1.0/include/luajit-2.1

保存:. /etc/profile

下载ngx_devel_kit(NDK)模块 :https://github.com/simpl/ngx_devel_kit/tags,不需要安装,记住存放位置/opt/luaJIT-2.0.5/package/ngx_devel_kit-0.2.19路径

wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.19.tar.gz
tar -xzvf v0.2.19.tar.gz
cd /opt/luaJIT-2.1.0
mkdir package
mv ngx_devel_kit-0.2.19 /opt/luaJIT-2.0.5/package/

下载最新的lua-nginx-module 模块 :https://github.com/openresty/lua-nginx-module/tags,不需要安装,记住存放位置/opt/luaJIT-2.0.5/package/lua-nginx-module-0.10.13路径
注意:一定要下载0.10.13版本,其他版本可能会报错

wget https://github.com/openresty/lua-nginx-module/archive/v0.10.13.tar.gz
tar -xzvf v0.10.13.tar.gz
mv lua-nginx-module-0.10.13 /opt/luaJIT-2.0.5/package/
# 进入安装包目录
cd
cd nginx-1.12.2

在nginx中编译,/opt/nginx-1.12.2为安装路径,–add-module后面加上面下载的两个包的位置

./configure --prefix=/opt/nginx-1.12.2 --with-http_stub_status_module --with-http_ssl_module --add-module=/opt/luaJIT-2.0.5/package/lua-nginx-module-0.10.13 --add-module=/opt/luaJIT-2.0.5/package/ngx_devel_kit-0.2.19

修改Makefile文件,防治报错

cd /opt/nginx-1.12.2

找到当前目录下找到objs文件夹,并进入,打开文件Makefile,找到有一下内容的这行:

打开:vi objs/Makefile


CFLAGS =  -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g 

-Werror: gcc将所有的警告当成错误进行处理把这行内容中的 “-Werror”去掉

CFLAGS =  -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -g 

保存:Esc,ZZ

回到上一级目录,进行安装

cd /opt/nginx-1.12.2
make && make install

要在bash中执行
echo $SHELL 需要是/bin/bash如果是其他的,执行bash,切换到bash

配置nginx的环境变量
打开:vi /etc/profile

export NGINX_HOME=/opt/nginx-1.12.2
export PATH=$PATH:$NGINX_HOME/sbin

保存:. /etc/profile

查看结果

nginx -V
nginx version: nginx/1.12.2
built by gcc 8.3.1 20190311 (Red Hat 8.3.1-3) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/opt/nginx-1.12.2 --with-http_stub_status_module --with-http_ssl_modu
le --add-module=/opt/luaJIT-2.0.5/package/lua-nginx-module-0.10.13 --add-module=/opt/luaJIT-2.0.5/package/ngx_devel_kit-0.2.19

看看有没有断开的链接,如果有的话,自己连一下

ldd $(which /opt/nginx-1.12.2/sbin/nginx)

假如有 libluajit-5.1.so.2 => not found

通过观察,我们知道, libluajit-5.1.so.2 在/opt/luaJIT-2.0.5/lib/中
建立软链接

cd /lib64
ln -s /opt/luaJIT-2.0.5/lib/libluajit-5.1.so.2 libluajit-5.1.so.2

刷新lib库

ldconfig

配置服务

cd /usr/lib/systemd/system/

新建服务nginx.service

vi /usr/lib/systemd/system/nginx.service

输入以下内容,注意路径/opt/nginx-1.12.2为自己的安装nginx的路径

[Unit]
Description=nginx - high performance web server
After=network.target remote-fs.target nss-lookup.target[Service]
Type=forking
PIDFile=/opt/nginx-1.12.2/logs/nginx.pid
ExecStartPre=/opt/nginx-1.12.2/sbin/nginx -t -c /opt/nginx-1.12.2/conf/nginx.conf
ExecStart=/opt/nginx-1.12.2/sbin/nginx -c /opt/nginx-1.12.2/conf/nginx.conf
ExecReload=/opt/nginx-1.12.2/sbin/nginx -s reload
ExecStop=/opt/nginx-1.12.2/sbin/nginx -s stop
ExecQuit=/opt/nginx-1.12.2/sbin/nginx -s quit                                                        
PrivateTmp=true[Install]
WantedBy=multi-user.target

在启动服务之前,需要先重载systemctl命令

systemctl daemon-reload

启动和开机自启

#启动服务或者使用systemctl start nginx
systemctl start nginx.service#运行以下命令设置Nginx服务开机自启动
systemctl enable nginx

获取当前hadoop-ha集群的状态,例如有两台namenode,ip地址分别是192.168.206.215和192.168.206.216,那么如果192.168.206.215是active,那么下面返回active,如果是192.168.206.216是active,那么返回standby

wget -qO- http://192.168.206.215:50070/jmx?qry=Hadoop:service=NameNode,name=NameNodeStatus | sed 's
/,/\n/g' | grep 'State' | sed 's/"State" : "//g' | sed 's/[" ]//g'

将上面代码放到一个文件中

cd
mkdir run_shell
cd /root/run_shell
vi hadoop-statusi ...Esc ZZ
chnod +x ./hadoop-status

尝试运行确定无误

./hadoop-status

到nginx的配置文件下,进行配置

cd /opt/nginx-1.12.2/conf/

配置nginx-conf,其中/root/run_shell/hadoop-status为脚本执行的路径,/tmp/hadoop-status.tmp是随便的一个文件,避免文件名冲突,注意是>不是追加>>,access_by_lua_block是lua脚本,需要要安装上面的带有lua脚本的nginx,ngx.log(ngx.ERR, result)是日志信息,调试的时候用,可以删掉,代码可以简化,懒得弄了,user root root;是用户名和组,一定要和hadoop-status脚本权限对应,否则会没有访问执行权限,proxy_pass http://node15:50070;是重定向的hadoop-web页面,自行设置,如果报错,执行lua进入命令行,一行一行的执行,看哪里出了问题,退出lua-shell直接Ctrl+C,或者看nginx下面的logs文件中的error报错日志
vi nginx.conf

worker_processes  1;
user root root;events {worker_connections  1024;
}http {server {listen       80;server_name  localhost;location / {access_by_lua_block {os.execute("/bin/bash /root/run_shell/hadoop-status > /tmp/hadoop-status.tmp")handle = io.open("/tmp/hadoop-status.tmp", "r")result = handle:read("*a")handle:close()sentinel_result = result:match("active") and "active" or "standby"ngx.log(ngx.ERR, result)ngx.log(ngx.ERR, sentinel_result)ngx.log(ngx.ERR, "123")if sentinel_result == "active" thenngx.exec("@node1")elsengx.exec("@node2")end}}location @node1 {proxy_pass http://node15:50070;}location @node2 {proxy_pass http://node16:50070;}}
}

重启nginx

systemctl restart nginx.service

访问localhost:80即可直接跳转到active的hadoop-ha上
如果是虚拟机,则在主机上访问虚拟机的ip地址即可访问

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/65771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Rust】003-基础语法:流程控制

【Rust】003-基础语法:流程控制 文章目录 【Rust】003-基础语法:流程控制一、概述二、if 表达式1、语法格式2、多个3、获取表达式的值 三、循环1、loop:无限循环,可跳出无限循环跳出循环返回值 2、while:条件循环&…

Docker技术--Docker中的网络问题

1.docker中的网络通信 如果想要弄清楚docker中的网络通信问题,其实需要弄清楚这几个问题就可以:容器与容器之间的通信、容器与外部网络之间的通信、外部网络与容器之间的通信。 -a:容器与容器之间的通信,如下所示: 在默认情况下,docker使用网桥(Bridge模式)与NAT通信。这…

已解决module ‘pip‘ has no attribute ‘pep425tags‘报错问题(如何正确查看pip版本、支持、32位、64位方法汇总)

本文摘要:本文已解决module ‘pip‘ has no attribute ‘pep425tags‘的相关报错问题,并总结提出了几种可用解决方案。同时结合人工智能GPT排除可能得隐患及错误。并且最后说明了如何正确查看pip版本、支持、32位、64位方法汇总 😎 作者介绍&…

聊一下C#中的lock

在C#中,lock 是用于实现多线程同步的关键字。它用于创建一个互斥锁(Mutex),以确保在同一时间只有一个线程可以访问被锁定的代码块。这在多线程环境中是很重要的,因为如果多个线程同时访问共享资源,可能会导…

Lesson6---案例:人脸案例

学习目标 了解opencv进行人脸检测的流程了解Haar特征分类器的内容 1 基础 我们使用机器学习的方法完成人脸检测,首先需要大量的正样本图像(面部图像)和负样本图像(不含面部的图像)来训练分类器。我们需要从其中提取特…

清理docker镜像方法

首先stop ps -a里的容器,然后rm容器,最后再rmi镜像 先停止容器 rm容器 docker rmi 镜像 删除后可以发现已经不存在

编写一个这样的程序,满足五日均线,十日均线,二十日均线,六十天六日均线调头向上的选股代码

编写一个这样的程序,满足五日均线,十日均线,二十日均线,六十天六日均线调头向上的选股代码 以下是一个用C语言编写的程序,可以读取股票数据并筛选出满足条件的股票。程序使用了一个假设的股票数据文件格式&#xff0c…

深度优先遍历(Depth-First Search, DFS)和广度优先遍历(Breadth-First Search, BFS)

深度优先遍历(DFS) 问题1:什么是深度优先遍历(DFS)? 答案: 深度优先遍历是一种用于遍历树或图的算法,它从根节点(或其他起始节点)开始,首先探索…

基于RabbitMQ的模拟消息队列之四——内存管理

文章目录 一、设计数据结构二、管理集合1.交换机2.队列3.绑定4.消息5.队列上的消息6.待确认消息7.恢复数据 一、设计数据结构 针对交换机、队列、绑定、消息、待确认消息设计数据结构。 交换机集合 exchangeMap 数据结构:ConcurrentHashMap key:交换机name value:交…

中心差分法-学习笔记《结构动力学-陈政清》

激励分段解析法仅仅对外载荷进行了离散,但对运动方程还是严格满足的,体系的运动在时间轴上依然是满足运动微分方程。然而,一般的时域逐步积分法进一步放松要求,不仅仅对外荷载进行离散化处理,也对体系的运动进行离散化…

Linux —— 进程信号

一,信号概念 信号是进程之间事件异步通知的一种方式,属于软中断; 系统定义的信号 每个信号都有一个编号和一个宏定义名称(可在signal.h查看);编号34以上的为实时信号; [wz192 Desktop]$ kill -…

vue的 ECMAScript 6的学习

一 ECMAScript 6 1.1 ECMAScript 6 ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现(另外的 ECMAScript 方言还有 Jscript 和 ActionScript)。 因此,ES6 既是一个历史名词,也…

windows 搭建 swoole开发环境(官网已支持)

第一步下载:swoole官网下载 swoole-cli-v5.0.3-cygwin-x64.zip 只支持 64 位的系统 第二步解压到指定文件夹:E:\phpstudy_pro\WWW\swoole-cli-v5.0.3-cygwin-x64 第三步设置环境变量:把解压后的文件夹下的 bin 目录路径配置到系统的 Path 环境…

Spring中如何解决循环依赖问题的三种方法

什么是循环依赖问题 在 Spring 中,循环依赖问题指的是两个或多个 bean 之间相互依赖形成的闭环。具体而言,当 bean A 依赖于 bean B,同时 bean B 也依赖于 bean A,就形成了循环依赖。 循环依赖问题在 Spring 容器中是一个非常常…

Anycloud37D平台移植wirelesstools

0. 环境准备 下载 :https://www.linuxfromscratch.org/blfs/view/svn/basicnet/wireless_tools.html 1. 交叉编译wireless_tools tar xzf wireless_tools.29.tar.gz cd wireless_tools.29/打开Makefile,修改配置: ## Compiler to use (mo…

方法的引用第二版(method reference)

1、冗余的Lambda场景 在使用Lambda表达式的时候,我们实际上传递进去的代码就是一种解决方案:拿什么参数做什么操作。那么考虑一种情况:如果我们在Lambda中所指定的操作方案,已经有地方在相同方案,那是否还有必要再写重…

Swift的NSClassFromString转换

在swift 中使用NSClassFromString 从string 转换到 对象,报了Segmentation fault: 11 错误。 let ctrlClass: AnyClass NSClassFromString("HomeViewController")! let ctrl: UIViewController ctrlClass.init() as UIViewController 正确的写法&…

MATLAB制图代码【第二版】

MATLAB制图代码【第二版】 文档描述 Code describtion: This code is version 2 used for processing the data from the simulation and experiment. Time : 2023.9.3 Author: PEZHANG 这是在第一版基础上,迭代出的第二版MATLAB制图代码,第二版的特点是…

文献阅读:Semantic Communications for Speech Signals

目录 论文简介动机:为什么作者想要解决这个问题?贡献:作者在这篇论文中完成了什么工作(创新点)?规划:他们如何完成工作?自己的看法(作者如何得到的创新思路) 论文简介 作者 Zhenzi Weng Zhijin Qin Geoffre…

2023 AZ900备考

文章目录 如何学习最近准备考AZ900考试,找了一圈文档,结果发现看那么多文档,不如直接看官方的教程https://learn.microsoft.com/zh-cn/certifications/exams/az-900/ ,简单直接,突然想到纳瓦尔宝典中提到多花时间进行思…