nginx配置ip_hash负载均衡策略

news2024/12/27 12:15:51

一、nginx配置ip_hash负载均衡策略

nginx默认的负载均衡策略为轮询,某些场景需要使用ip_hash负载策略,即:同一个ip地址,永远访问nginx后面同一台tomcat。配置示例如下,主要是设置ip_hash:

	upstream www.abc.com{
		ip_hash;
		server 202.119.11.23:8899;
		server 172.168.10.99:8899;
		server 202.119.11.121:8899;
	}

二、配置后如何验证ip_hash有没有生效

1、需要打开nginx的access log查看请求来自哪个ip、访问哪个负载。

(1)首先,配置access日志格式;

(2)其次,打开access日志;

(3)验证后注意关闭access日志。

2、完整示例如下


#表示使用几个nginx线程,一般取值为cpu个数-1
worker_processes  1;

#是否打开error日志,及error日志路径
error_log  logs/error.log;


#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


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


	#access日志格式
	##$remote_addr:表示客户端ip
	##$time_local:表示记录日志的本地时间
	##$upstream_addr:表示负载到后端的哪台tomcat
	##$request_time:从接收到客户端请求到发送完响应给客户端所经过的时间,单位为秒
	##$status:表示响应码
	log_format  log_custom  '$remote_addr -- [$time_local] -- "$upstream_addr" -- $request_time -- $status -- "$request"';
	
					  
	#开启access日志,log_custom表示指定日志格式。
	##注意:开始access日志方式是如下方式,并不是access_log on方式;关闭access日志方式是:access_log off;
    access_log  logs/access.log log_custom;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;


	upstream www.abc.com{
		ip_hash;
		server 202.119.11.23:8899;
		server 172.168.10.99:8899;
		server 202.119.11.121:8899;
	}
	
    server {
        listen       80;
        server_name  localhost;

        location ^~ /api-base {
            proxy_http_version 1.1;
            proxy_redirect off;
            proxy_set_header Connection "";
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://www.abc.com;
        }
    }
}

3、对应的日志效果

三、ip_hash算法对应的java代码示例

package com.nation.net;

import java.net.InetAddress;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * nginx ip_hash算法示例
 *
 */
public class IpHashLoadBalancer {
    private final List<String> servers;
    private final AtomicInteger currentIndex = new AtomicInteger(0);

    public IpHashLoadBalancer(List<String> servers) {
        this.servers = servers;
    }

    public String selectServer(String clientIp) {
        try {
            // 将客户端IP地址转换为字节数组
            byte[] ipBytes = InetAddress.getByName(clientIp).getAddress();

            // 使用MD5算法计算哈希值
            byte[] hashBytes = java.security.MessageDigest.getInstance("MD5").digest(ipBytes);

            // 将哈希值转换为正整数
            int hash = 0;
            for (byte b : hashBytes) {
                hash <<= 8;
                hash ^= (b & 0xFF);
            }

            // 使用哈希值选择服务器
            int serverIndex = Math.abs(hash) % servers.size();

            // 如果有必要,可以在这里实现一个轮询机制,使得下一次请求可能选择另一个服务器
            // currentIndex.incrementAndGet();
            // int serverIndex = currentIndex.getAndIncrement() % servers.size();

            return servers.get(serverIndex);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public static void main(String[] args) {
        //负载地址
        List<String> servers = Arrays.asList("202.119.11.23","172.168.10.99","202.119.11.121");
        IpHashLoadBalancer loadBalancer = new IpHashLoadBalancer(servers);

        // 假设客户端IP地址
        String clientIp = "172.168.10.187";

        // 选择服务器
        String selectedServer = loadBalancer.selectServer(clientIp);

        System.out.println("Selected server: " + selectedServer);
    }
}

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

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

相关文章

B站美化插件,支持自定义,太酷辣~

大公司的软件和网站通常具有优雅的默认界面设计。 以国内二次元聚集地B站为例&#xff0c;可以说它的UI设计非常吸引人。与其他视频网站繁复的设计相比&#xff0c;B站的界面设计可以说是遥遥领先 然而&#xff0c;总有些人对默认的用户界面感到不满意&#xff0c;他们渴望尝试…

Arm功耗管理精讲与实战

安全之安全(security)博客目录导读 思考 1、为什么要功耗管理&#xff1f;SOC架构中功耗管理示例&#xff1f;功耗管理挑战&#xff1f; 2、从单核->多核->big.LITTLE->DynamIQ&#xff0c;功耗管理架构演进? 3、什么是电压域&#xff1f;什么是电源域&#xff1f…

C#上位机与S7-200Smart通信注意事项

S7-200SMART连接 问题描述 我们使用C#开发上位机和S7-200Smart系列PLC交互数据时&#xff0c;大多会用到Sharp7、Snap7之类的通信类库。有些通信类库默认的使用的是PG连接资源&#xff0c;而对于S7-200Smart来说&#xff0c;它的PG连接资源只有1个。 官网200smart提到的连接数…

smart200 做client,modbus_tcp读取modbus_slave

这里还隐藏一个重要的设置&#xff0c;就是站地址。这个在库函数里。不同plc位置会不一样&#xff0c;我这里是vb1651对应modbus的地址为255&#xff0c;这个值我们可以自己更改&#xff0c;范围为1-247. 打开modbus_slave 软件&#xff0c;

MySQL recursive 递归

MySQL 从最内的select开始执行&#xff0c;但是同一个select clause可以在查询的结果上继续查询。 SELECT menu_id,parent_id,(SELECT m1.parent_id FROM sys_menu AS m1 WHERE m1.menu_idm.parent_id) FROM sys_menu AS m WHERE m.menu_id 89 方案1.通过recursive递归 使用…

Matlab 使用subplot绘制多个子图,一元拟合

实现效果&#xff1a; clc; clear;filename sri.xlsx; % 确认文件路径data readtable(filename); datavalue data{:,2:end}; datavalue datavalue;fig figure(Position, [0, 0, 1500, 900]); indexString ["(a)","(b)","(c)","(d)&qu…

科技感十足特效源码

源码介绍 科技感十足特效源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 源码截图 源码下载 科技感十足特效源码

十大常见B端管理系统,经常用,未必能叫上名字。

常见的B端管理系统有以下几种&#xff1a; 客户关系管理系统&#xff08;CRM&#xff09;&#xff1a; CRM系统帮助企业管理与客户相关的信息&#xff0c;包括客户联系信息、销售机会、市场活动等。它提供了客户数据整合、销售流程管理、客户沟通跟进等功能&#xff0c;帮助企…

【人工智能基础】逻辑回归实验分析

实验环境&#xff1a;anaconda、jutpyter Notebook 实验使用的库&#xff1a;numpy、matplotlib 一、逻辑回归 逻辑回归是一个常用于二分类的分类模型。本质是&#xff1a;假设数据服从这个分布&#xff0c;然后使用极大似然估计做参数的估计。 二、实验准备 引入库、预设值…

【三】Spring Cloud Ribbon 实战

Spring Cloud Ribbon 实战 概述 一直在构思写一个spring cloud系列文章&#xff0c;一方面是对自己实践经验进行一次完整的梳理&#xff0c;另一方面也是希望能够给初学者一些借鉴&#xff0c;让初学者少走些弯路&#xff0c;看到本系列博客就能够很好的把微服务系列组件用好。…

字符函数·字符串函数·C语言内存函数—使用和模拟实现

字符函数字符串函数C语言内存函数 1.字符分类函数2. 字符转换函数3. strlen的使用和模拟实现4.strcpy的使用和模拟实现5.strcat的使用和模拟实现6.strcmp的使用和模拟实现7.strncpy的模拟和实现8.strncat的实现和模拟实现9.strncmp函数使用10.strstr的使用和模拟实现11.strtok函…

【python技术】akshare爬取A股最新业绩预告保存进excel的简单示例

最近A股上市公司陆续在出年报和一季度报了&#xff0c; 心里寻思着要不用python把这些数据爬取下来分析下&#xff0c;说干就干。 数据来源网站东方财富&#xff1a;https://data.eastmoney.com/bbsj/ 我这个人比较懒&#xff0c;直接用akshare封装的方法来搞定 之前用aksha…

嵌入式单总线详解

单总线介绍 单总线&#xff0c;就像是电子世界里的“超级水管工”&#xff0c;它以一根线的简洁&#xff0c;完成了数据传输、设备供电乃至设备识别的多重任务&#xff0c;展现了极简主义的智慧与效率。想象一下&#xff0c;你住在一个高科技社区&#xff0c;所有的家电——冰…

【while循环】

目录 什么是循环 while语句的执行过程 编程求1*2*3*...*n 所有不超过1000的数中含有数字3的自然数 求数 求数II 编程求1平方2平方...n平方 什么是循环 循环就是重复做同样的事儿使用while语句循环输出1到100 int i 1; while( i < 100 ){cout <<…

C++各种排序算法详解及示例源码

1、排序算法 排序算法&#xff08;sorting algorithm&#xff09;用于对一组数据按照特定顺序进行排列。排序算法有着广泛的应用&#xff0c;因为有序数据通常能够被更高效地查找、分析和处理。 1.1 评价维度 运行效率&#xff1a;我们期望排序算法的时间复杂度尽量低&#xf…

opencv_17_翻转与旋转

一、图像翻转 1&#xff09;void flip_test(Mat& image); 2&#xff09;void ColorInvert::flip_test(Mat& image) { Mat dst; //flip(image, dst, 0); //上下翻转 flip(image, dst, 1); //左右翻转 // flip(image, dst, -1); //180度翻转 imsho…

软件测试笔记_习题_面经

软件测试------按测试阶段划分有几个阶段? 单元测试、集成测试、系统测试、验收测试 软件测试------按是否查看源代码划分有几种测试方法? 黑盒、白盒、灰盒 软件测试------按是否运行划分有几种测试方法? 静态测试、动态测试 软件测试------按是否自动化划分有几种测试方…

chrome 查看版本安装路径、cmd命令行启动浏览器

chrome 查看版本安装路径 浏览器输入 chrome://version/cmd命令行启动浏览器 "C:\Program Files\Google\Chrome\Application\chrome.exe" www.baidu.com

神经网络的反向传播

梯度下降算法 &#x1f525;我们来看一下神经网络中的梯度下降算法&#x1f525; 梯度下降法是一种优化算法&#xff0c;用于寻找目标函数的最小值。梯度是一个向量&#xff0c;表示某一函数在该点处的方向导数沿着该方向取得最大值&#xff0c;即函数在该点处变化最快的方向…

Sublime Vim模式配置:q关闭当前标签页

在Sublime安装目录下的->Packages文件夹下新建User文件夹创建文件Vintage.sublime-commands 路径为Sublime安装目录->Packages->User->Vintage.sublime-commands文件内容如下[{"caption": ":w - Save","command": "save"}…