中间件(22) : nginx通过http接口获取代理目标地址(win)|nginx自定义负载均衡算法

news/2024/9/18 12:35:38/ 标签: nginx, 运维, nginx自定义负载均衡算法

 参考 :

        Nginx12 openresty使用lua-resty-http模块 - 金天黑日 - 博客园 (cnblogs.com)

         windows openresty 死磕:安装和启动脚本 - 疯狂创客圈 - 博客园 (cnblogs.com)

        https://blog.csdn.net/wwppp987/article/details/122803662 

1.下载软件包

1.1.openresty

OpenResty - Download

Windows

All the releases are signed by the public PGP key A0E98066 of Yichun Zhang.

  • For 32-bit Windows: openresty-1.25.3.2-win32.zip   16MB   PGP - 19 Jul 2024
  • For 64-bit Windows: openresty-1.25.3.2-win64.zip   16MB   PGP - 19 Jul 2024

 根据计算机位数下载相应的即可, 然后放到D盘解压, 文件列表如下:

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         2024/8/22     13:56                conf
d-----         2024/8/22     13:56                html
d-----         2024/8/22     13:56                include
d-----         2024/7/18     23:25                logs
d-----         2024/8/22     13:56                lua
d-----         2024/8/22     13:56                lualib
d-----         2024/8/22     13:57                pod
-a----         2024/8/22     13:56          22924 COPYRIGHT
-a----         2024/8/22     13:56        4271109 lua51.dll
-a----         2024/8/22     13:56         389951 luajit.exe
-a----         2024/8/22     13:56       38689676 nginx.exe
-a----         2024/8/22     13:56           8974 README.txt
-a----         2024/8/22     13:56          38253 resty
-a----         2024/8/22     13:56          38671 resty.bat
-a----         2024/8/22     13:56          14957 restydoc
-a----         2024/8/22     13:56           8873 restydoc-index
-a----         2024/8/22     13:56           9669 restydoc-index.bat
-a----         2024/8/22     13:56          16003 restydoc.bat

1.2.lua-resty-http

GitHub - ledgetech/lua-resty-http: Lua HTTP client cosocket driver for OpenResty / ngx_lua.

下载解压, 文件列表如下:

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         2024/8/22     15:26                .github
d-----         2024/8/22     15:26                lib
d-----         2024/8/22     15:26                t
------         2024/2/29     11:43             26 .gitattributes
------         2024/2/29     11:43            101 .gitignore
------         2024/2/29     11:43             34 .luacheckrc
------         2024/2/29     11:43            157 .luacov
------         2024/2/29     11:43            240 dist.ini
------         2024/2/29     11:43           1293 LICENSE
------         2024/2/29     11:43            639 lua-resty-http-0.17.2-0.rockspec
------         2024/2/29     11:43            757 Makefile
------         2024/2/29     11:43          20903 README.md

将"lua-resty-http-master\lua-resty-http-master\lib\resty"里面的三个文件放到"D:\openresty-1.25.3.2-win64\lualib\resty"文件夹下面, 三个文件信息如下:

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
------         2024/2/29     11:43          33331 http.lua
------         2024/2/29     11:43          12496 http_connect.lua
------         2024/2/29     11:43           1152 http_headers.lua

2.修改"D:\openresty-1.25.3.2-win64\conf\nginx.conf"文件, 替换为如下内容


#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;
}http {lua_package_path "D:\openresty-1.25.3.2-win64\lualib\resty\?.lua;;"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;server {listen       80;server_name  localhost;#charset koi8-r;#access_log  logs/host.access.log  main;location / {root   html;index  index.html index.htm;}location /my_test {set $proxy_address '';access_by_lua_block {local http = require "resty.http"local httpc = http.new()local res, err = httpc:request_uri("http://127.0.0.1:8000/get_proxy_address")if not res thenngx.log(ngx.ERR, "failed to request: ", err)return ngx.exit(500)endngx.var.proxy_address = res.body}proxy_pass http://proxy_address;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade";proxy_set_header Host $host;}}}

需要修改的值:

  1. lua_package_path "D:\openresty-1.25.3.2-win64\lualib\resty\?.lua;;"
  2. location /my_test {
  3. http://127.0.0.1:8000/get_proxy_address

1=>改成自己电脑的路径

2=>改成代理的URI路径 

3=>改成获取代理地址http接口的地址

3.创建获取代理地址的http服务

http接口返回字符串即可

本次案例采用python实现, 代码如下

# -*- coding: utf-8 -*-# ====> nginx负载均衡算法服务 <==== #import time
from flask import Flask
from flask_cors import CORSapp = Flask(__name__)
CORS(app)
app_name = 'nginx负载均衡算法服务'def check_port(l_port):result = subprocess.run(('netstat', '-ano'), capture_output=True, text=True,creationflags=subprocess.CREATE_NO_WINDOW)output = result.stdoutlines = output.split('\n')for line in lines:if str(l_port) in line and 'LISTENING' in line:  # 注意,这里要确保状态是 LISTENING 才表示端口被占用return Truereturn False# 获取最佳的ws服务端地址
@app.route('/get_proxy_address', methods=['GET'])
def get_best_ws():print('请求进入')# 定制负载均衡算法...return '127.0.0.1:8001'if __name__ == '__main__':f_port = 8000f_debug = Falseprint(f'开始启动{app_name},端口为:{f_port}, 是否开启debug:{f_debug}')if check_port(f_port):lg.warn(f'端口{f_port}已被占用, 退出运行 !')time.sleep(2)else:# 启动web服务app.run(host='0.0.0.0', port=f_port , debug=f_debug)

4.启动nginx

powerShell进入"D:\openresty-1.25.3.2-win64"目录,执行一下命令

cd D:\openresty-1.25.3.2-win64
start nginx.exe

其他命令:

# 查看nginx进程
tasklist.exe /fi  "imagename eq nginx.exe"
# 停止nginx
.\nginx.exe  -s quit
# 重新加载nginx.conf配置
nginx.exe -s reload

5.说明

nginx启动的端口是80, 获取代理地址的http服务的端口是8000, 代理的目标端口是8001

访问"127.0.0.1/my_test"时会从8000端口的http服务获取代理目标地址为8001, 就会访问8001地址

自定义的负载均衡算法在获取代理地址的http服务里面实现即可


http://www.ppmy.cn/news/1516025.html

相关文章

探索Git:分布式版本控制系统的力量(二)

&#x1f600;前言 本篇博文是关于分布式版本控制系统Git的一些基本介绍&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我…

【STM32】驱动OLED屏

其实我没买OLED屏哈哈哈&#xff0c;这个只是学习了&#xff0c;没机会实践。 大部分图片来源&#xff1a;正点原子HAL库课程 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 目录 1 显示原理 2 读写方式&#xff1a;8080并口 2.1 支持的指令类型 2.2 …

亦菲喊你来学机器学习(12) --随机森林

文章目录 随机森林基本原理随机森林特点优点缺点 构建模型模型参数训练模型测试模型绘制重要特征 注意事项 总结 随机森林 随机森林&#xff08;Random Forest&#xff09;是一种集成学习方法&#xff0c;属于决策树模型的扩展。它通过构建多个决策树并将它们的预测结果进行汇…

英国政府停止使用人工智能

你是否注意到&#xff0c;每家公司都声称他们拥有一些新发现的人工智能技术&#xff0c;这些技术显然使他们更胜一筹&#xff0c;但这些人工智能却完全是空洞的&#xff0c;令人失望&#xff1f;我也是&#xff0c;这也是我对这项技术如此怀疑的一半原因。但在过去几年里&#…

Golang | Leetcode Golang题解之第374题猜数字大小

题目&#xff1a; 题解&#xff1a; func guessNumber(n int) int {return sort.Search(n, func(x int) bool { return guess(x) < 0 }) }

K8S对接Ceph分部署存储

文章目录 一、Ceph理论知识1、Ceph简介2、Ceph分布式存储的优点3、Ceph核心组件 二、部署Ceph高可用集群1、服务器环境信息2、部署前环境准备工作3、部署Ceph监控服务Monitor4、激活Ceph存储服务OSD 三、K8S对接Ceph存储1、K8S对接Ceph RBD实现数据持久化2、基于Ceph RBD生成PV…

在编程学习的道路上,面对Bug和复杂算法时,我们常常会感到挫折和困惑。以下是一些克服这些挑战的有效方法:

在编程学习的道路上&#xff0c;面对Bug和复杂算法时&#xff0c;我们常常会感到挫折和困惑。以下是一些克服这些挑战的有效方法&#xff1a; 系统化问题解决&#xff1a; 遇到Bug时&#xff0c;首先要从整体入手&#xff0c;系统地分析问题。例如&#xff0c;可以通过逐步调试…

2024年Intellij IDEA快捷键总结

目录 编辑与格式化&#xff1a; 导航与跳转&#xff1a; 重构&#xff1a; 查找与替换&#xff1a; 调试 其他常用&#xff1a; 使用快捷键的好处&#xff1a; 快捷键功能描述 编辑与格式化&#xff1a; CtrlX删除当前行或选中的文本CtrlD复制当前行或选中的文本到下一行…

iPhone13手机照片被误删,有什么方法可以恢复吗?

在日常使用手机时&#xff0c;我们可能因为误操作、手机崩溃、或者其他原因&#xff0c;导致iPhone13手机中的照片丢失。遇到这种情况&#xff0c;手机误删照片如何恢复&#xff1f;在本文中&#xff0c;我们将分享3个妙招&#xff0c;帮助您恢复iPhone13上误删的照片。 一、通…

Flask restful 前后端分离和 restful 定义

Flask restful 前后端分离和 restful 定义 前后端分离RESTful API总结在Web开发中,前后端分离(Frontend and Backend Separation)和RESTful API(Representational State Transfer 应用程序接口)是两个重要的概念,特别是在构建大型或复杂的Web应用程序时。Flask作为一个轻…

解锁C#性能监控:内置性能计数器全解析

标题&#xff1a;解锁C#性能监控&#xff1a;内置性能计数器全解析 摘要 性能计数器是衡量和监控应用程序性能的重要工具。在C#中&#xff0c;.NET框架提供了一套完整的性能计数器类库&#xff0c;使得开发者能够轻松地收集和分析应用程序的运行时数据。本文将详细介绍如何在…

【第一章概述—计算机中的数制】非十进制数到十进制数的转换,八进制转十进制,16进制转十进制。十进制转8进制,十进制转16进制

将非十进制数转换为十进制数或将十进制数转换为其他进制数&#xff0c;具体步骤如下&#xff1a; 八进制&#xff08;Octal&#xff09;转换为十进制&#xff08;Decimal&#xff09; 八进制转十进制&#xff1a; 每个八进制位乘以其对应的权重&#xff1a; 从右到左&#x…

Python爬虫—常用的网络爬虫工具推荐

以下列举几个常用的网络爬虫工具 1. 八爪鱼&#xff08;Bazhuayu&#xff09; 简介&#xff1a; 八爪鱼是一款面向非技术用户的桌面端爬虫软件&#xff0c;以其可视化操作和强大的模板库而受到青睐。它支持从各种网站上抓取数据&#xff0c;包括文本、图片、文档等&#xff…

MySQL对JSON数据类型的处理

MySQL从5.7版本开始提供了对JSON数据类型的支持&#xff0c;‌使得MySQL能够直接存储和管理JSON格式的数据。‌这使得在数据库中处理JSON数据变得更为方便和高效。‌以下是一些常用的处理JSON数据的函数和操作&#xff1a;‌ 1.‌创建JSON列 CREATE TABLE my_table (id INT A…

uniapp-:class内使用函数报错及解决方法

在开发时&#xff0c;需要根据状态动态的去渲染颜色&#xff0c;这个时候就用到了 :class :class"hColor(2,item, index)" 在vue内开发时&#xff0c;此代码片段可以正常使用 在uniapp内开发时&#xff0c;相同代码报错&#xff0c;因为在uniapp内 :class不支持直接…

优化学习管理:Moodle和ONLYOFFICE文档编辑器的完美结合

目录 前言 一、什么是 Moodle 1、简单快速插入表单字段 3、免费表单模板库 4、开启无缝协作 三、在Moodle中集成ONLYOFFICE文档 四、在Moodle安装使用ONLYOFFICE 1、下载安装 2、配置服务器 3、在Moodle中使用ONLYOFFICE 文档活动 五、未来展望 写在最后 前言 在当今教育科技飞…

启动kafka

启动 kafka 启动 kafka 使用 zookeeper # 启动 zookeeper ./zookeeper-server-start.sh ../config/zookeeper.properties & # 启动 kafka ./kafka-server-start.sh ../config/server.properties &# 关闭 kafka ./kafka-server-stop.sh ../config/server.properties# …

一款人性化的终端用户界面工具

A collection of human friendly terminal user interface. 截图 历史文件预览 注意: find file 依赖 fzf. file browser依赖 ranger / lf / … 安装 git clone https://github.com/StubbornVegeta/StartUp ~/.config/ cd ~/.config/StartUp ./install.sh用法 . $HOME/.…

人员离岗识别摄像机

一种通过摄像技术来监测和识别工作场所员工离开工作岗位的设备。该摄像机能够准确识别员工的面部特征&#xff0c;并通过算法识别出员工是否离开了工作岗位&#xff0c;从而提高工作场所的管理效率。摄像机采用高清摄像头和人脸识别技术&#xff0c;能够精准识别出员工的面部特…

自制电路图为何无法驱动ESP01S?

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…