nginx的反向代理和负载均衡(seventeen day)
一、nginx的反向代理
新建一台虚拟机——static-server(静态服务器/前端服务器)
wget https://nginx.org/download/nginx-1.26.1.tar.gz #安装nginx包
ls安装依赖软件
yum -y install gcc gcc-c++
yum -y install pcre-devel
yum -y install openssl-devel
yum -y install lrzszyum -y install tree
tar -zxvf nginx-1.26.1.tar.gz #解压nginx安装包
ls
cd nginx-1.26.1
ls
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-stream #源码编译
make
make install
useradd -s /bin/nologin -M nginx
不要使用systemctl启动或者脚本启动/usr/local/nginx/sbin/nginx #启动nginx
配置属性监控
vim /usr/local/nginx/conf/nginx.conf #配置文件
location /status{
stub_status on;
access_log off;
}/usr/local/nginx/sbin/nginx -s reload #重启nginx
将static-server做为前端服务器,用于接受和响应客户端,代理另外一台主机
echo "this is java static server" > /usr/local/nginx/html/index.html
/usr/local/nginx/sbin/nginx
curl localhost
this is java static server
ps -aux|grep nginxroot 1197 0.0 0.1 46128 1156 ? Ss 10:15 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 1198 0.0 0.2 46580 2140 ? S 10:15 0:00 nginx: worker process
root 1202 0.0 0.0 112824 984 pts/0 S+ 10:16 0:00 grep --color=auto nginx
curl 192.168.1.12this is java web server
使用static-server代理dunamic-server主机;当用户访问11的时候,11不响应,而是由12响应
location proxy_pass 协议 域名 端口
使用static-server反向代理dynamic-server的服务器
vim /usr/local/nginx/conf/nginx.conf #修改配置文件
location / {
# root html; #注释
# index index.html index.htm; #注释
proxy_pass http://192.168.1.12:80;
}
curl 192.168.1.12
this is java web server
curl 192.168.1.11
this is java web server
此时静态服务器static-server为代理服务器,nginx代理其他服务时,不需要对方同意;方便了模块化操作(如果代理一个服务,双方都要同意,之前的依赖太高,不便于模块化操作)
将static-server虚拟机克隆,并且命名为dynamic-server(动态服务器/后端服务器)
修改index.html文件,并且发布web服务
echo "this is java web server" > /usr/local/nginx/html/index.html
/usr/local/nginx/sbin/nginx #启动nginx
使用curl访问当前项目
curl localhost
this is java web server
由于没有部署tomcat服务,所以使用nginx代替
nginx访问IP黑名单
克隆一台主机——allow-deny
wget https://nginx.org/download/nginx-1.26.1.tar.gz
yum -y install gcc gcc-c++
yum -y install openssl-devel
tar -zxvf nginx-1.26.1.tar.gz
cd nginx-1.26.1
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-stream
make && make install
useradd -s /bin/nologin -M nginxecho "you are luckly" > /usr/local/nginx/html/index.html
设置除12(dynamic-server)主机可以访问,其他主机都不可以访问(在配置文件中的server模块中设置)【allow 允许 deny 禁止】
vim /usr/local/nginx/conf/nginx.conf
charset utf-8;
allow 192.168.1.12;
deny 192.168.1.0/24;
deny all;
/usr/local/nginx/sbin/nginx -s reload
二、nginx负载均衡
| 主机名 | IP地址 |
| static-server | 192.168.1.10 |
| dynamic-server001 | 192.168.1.12 |
| dynamic-server002 | 192.168.1.13 |
| dynamic-server003 | 192.168.1.14 |
1、轮询
依次的将任务部署给不同的主机
dynamic-server001
[root@dynamic-server001 ~]# echo "i am dynamic server 001" > /usr/local/nginx/html/index.html
[root@dynamic-server001 ~]# /usr/local/nginx/sbin/nginx
dynamic-server002
[root@dynamic-server002 ~]# echo "i am dynamic server 002" > /usr/local/nginx/html/index.html
[root@dynamic-server002 ~]# /usr/local/nginx/sbin/nginx
dynamic-server003
[root@dynamic-server003 ~]# echo "i am dynamic server 003" > /usr/local/nginx/html/index.html
[root@dynamic-server003 ~]# /usr/local/nginx/sbin/nginx
static-server
[root@static-server ~]# echo "i am static server" > /usr/local/nginx/html/index.html
[root@static-server ~]# vim /usr/local/nginx/conf/nginx.conf
35 upstream server_group_name{
36 server 192.168.1.12:80;
37 server 192.168.1.13:80;
38 server 192.168.1.14:80;
39 }
49 location / {
50 # root html; #注释掉
51 # index index.html index.htm; #注释掉
52 proxy_pass http://server_group_name;
54 }[root@static-server ~]# /usr/local/nginx/sbin/nginx -s reload
物理机浏览器输入192.168.1.11,001,002,003的页面会轮流出现
2、加权轮询
可以在server指令中指定权重,权重越高,分配的请求越多。
[root@static-server ~]# vim /usr/local/nginx/conf/nginx.conf
upstream server_group_name{
server 192.168.1.12:80 weight=4;
server 192.168.1.13:80 weight=2;
server 192.168.1.14:80 weight=1;
}[root@static-server ~]# /usr/local/nginx/sbin/nginx -s reload
数字越大,所负担的任务越重
3、ip_hash
每个请求按访问ip的hash结果分配,使得同一客户端的请求总是定向到同一服务器,除非该服务器不可用。
[root@static-server ~]# vim /usr/local/nginx/conf/nginx.conf
upstream server_group_name{
ip_hash;
server 192.168.1.12:80 weight=4;
server 192.168.1.13:80 weight=2;
server 192.168.1.14:80 weight=1;
}
[root@static-server ~]# /usr/local/nginx/sbin/nginx -s reload
例:第一次访问到001,之后一直就是,不变
4、least_conn(最少连接)
把请求转发给连接数较少的后端服务器。轮询算法是把请求平均地转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,leastconn这种方式就可以达到更好的负载均衡效果。
[root@static-server ~]# vim /usr/local/nginx/conf/nginx.conf
upstream server_group_name{
ip_hash;
#least_conn; #将请求转发给连接数较少的后端服务器
server 192.168.1.12:80 weight=4;
server 192.168.1.13:80 weight=2;
server 192.168.1.14:80 weight=1;
}
[root@static-server ~]# /usr/local/nginx/sbin/nginx -s reload
5、url_hash
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用ur_hash,可以使得同一个url (也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再次收到请求,就可以从缓存中读取。
[root@static-server ~]# vim /usr/local/nginx/conf/nginx.conf
upstream server_group_name{
ip_hash;
#hash $request_uri;
#least_conn;
server 192.168.1.12:80 weight=4;
server 192.168.1.13:80 weight=2;
server 192.168.1.14:80 weight=1;
}
[root@static-server ~]# /usr/local/nginx/sbin/nginx -s reload
三、平滑升级
例:将nginx-1.26.1升级为nginx-1.27.0
服务开启的时候升级nginx
wget https://nginx.org/download/nginx-1.27.0.tar.gz
tar -zxvf nginx-1.27.0.tar.gz
cd nginx-1.27.0
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-stream
make && make install
ls /usr/local/nginx/sbin/nginx nginx.old
/usr/local/nginx/sbin/nginx -vnginx version: nginx/1.27.0
/usr/local/nginx/sbin/nginx.old -vnginx version: nginx/1.26.1
ps -aux|grep nginxroot 1194 0.0 0.2 46172 2040 ? Ss 15:03 0:00 nginx: master process /usr/local/nginx/sbin/nginx #主进程
nginx 1215 0.0 0.2 46620 2292 ? S 15:45 0:00 nginx: worker process #子进程
root 4216 0.0 0.0 112824 988 pts/0 R+ 16:33 0:00 grep --color=auto nginx
kill -USR2 1194 #启用新版本的nginx服务
kill -WINCH 1215
kill -QUIT 1194curl -I localhost #查看当前nginx版本
HTTP/1.1 200 OK
Server: nginx/1.27.0
Date: Tue, 30 Jul 2024 08:55:00 GMT
Content-Type: text/html
Content-Length: 24
Connection: keep-alive
Last-Modified: Tue, 30 Jul 2024 07:02:19 GMT
ETag: "66a88ffb-18"
Accept-Ranges: bytes该过程nginx服务一直能访问到
配置tomcat 10 运行环境 tomcat 可以在jdk8的环境运行;tomcat 10必须在jdk17以上的版本运行
dynamic-server001
wget https://download.oracle.com/java/22/latest/jdk-22_linux-x64_bin.tar.gz
tar -zxvf jdk-22_linux-x64_bin.tar.gz
ls
anaconda-ks.cfg jdk-22_linux-x64_bin.tar.gz nginx-1.26.1.tar.gz jdk-22.0.2 nginx-1.26.1
cd jdk-22.0.2/
ls
bin conf include jmods legal lib LICENSE man README release
cd bin/
ls
jar javap jdeps jlink jrunscript jwebserver jarsigner jcmd jfr jmap jshell keytool java jconsole jhsdb jmod jstack rmiregistry javac jdb jimage jpackage jstat serialver javadoc jdeprscan jinfo jps jstatd
./java
cd
mv jdk-22.0.2/ /usr/local/jdk22
ls /usr/local/jdk22/bin conf include jmods legal lib LICENSE man README release
cd /usr/local/jdk22/
sed -n '$p' /etc/profileunset -f pathmunge
sed -i '$aexport JAVA_HOME=/usr/local/jdk22/' /etc/profile
sed -n '$p' /etc/profileexport JAVA_HOME=/usr/local/jdk22/
source /etc/profile
$JAVA_HOME
sed -i '$aPATH=$JAVA_HOME/bin:$PATH' /etc/profile
sed -n '$p' /etc/profilePATH=$JAVA_HOME/bin:$PATH
source /etc/profile
java
java -version
cd
wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.26/bin/apache-tomcat-10.1.26.tar.gz
相关文章:
nginx的反向代理和负载均衡(seventeen day)
一、nginx的反向代理 新建一台虚拟机——static-server(静态服务器/前端服务器) wget https://nginx.org/download/nginx-1.26.1.tar.gz #安装nginx包 ls 安装依赖软件 yum -y install gcc gcc-c yum -y install pcre-devel yum -y install openss…...
BES编译SDK中遇到的perl问题
0 Preface/Foreword 1 问题清单 1.1 perl\r: No such file or directory 编译完成,通过perl,将elf文件转为bin文件,出现错误。 通过查看,项目源文件中,只有一个pl文件: 查看Linux distro使用的WSL版本&am…...
【康复学习--LeetCode每日一题】3111. 覆盖所有点的最少矩形数目
题目: 给你一个二维整数数组 point ,其中 points[i] [xi, yi] 表示二维平面内的一个点。同时给你一个整数 w 。你需要用矩形 覆盖所有 点。 每个矩形的左下角在某个点 (x1, 0) 处,且右上角在某个点 (x2, y2) 处,其中 x1 < x…...
Django实战:开启数字化任务管理的新纪元
🚀 Django实战:开启数字化任务管理的新纪元 🌐 📖 引言 在数字化转型的浪潮中,任务管理的智能化成为提升组织效能的关键。今天,我将带领大家深入了解我们最新开发的OFTS系统——一款创新的组织任务管理软…...
史上最全网络安全面试题+答案
1、什么是SQL注入攻击 前端代码未被解析被代入到数据库导致数据库报错 2、什么是XSS攻击 跨站脚本攻击 在网页中嵌入客户端恶意脚本,常用s语言,也会用其他脚本语言 属于客户端攻击,受害者是用户,网站管理员也属于用户…...
Python 爬虫入门(五):使用 lxml 解析网页
Python 爬虫入门(五):使用 lxml 解析网页 前言1. lxml 简介1.1 什么是 lxml?1.2 为什么选择 lxml?1.3 安装 lxml 2. lxml 基础2.1 解析 HTML/XML2.2 XPath 表达式2.3 使用 XPath 提取数据 3. 深入解析3.1 处理命名空间…...
阿里云RDS到亚马逊云RDS的实时数据同步方案详解
1. 需求背景 在当今的多云环境中,企业经常需要在不同云平台之间同步数据。本文将详细介绍如何实现从阿里云RDS MySQL数据库到亚马逊云RDS MySQL数据库的实时数据同步。这种同步对于数据备份、跨区域数据访问、数据分析等场景都非常有用。 2. 方案概述 我们将使用AWS Kinesis…...
《LeetCode热题100》---<滑动窗口篇两道>
本篇博客讲解LeetCode热题100道滑动窗口篇中的两道题 第一道:无重复字符的最长子串 第二道:找到字符当中的所有字母异位词 第一道:无重复字符的最长子串 哈希滑动窗口 class Solution {public int lengthOfLongestSubstring(String s0) {int…...
Python学习计划——9.1多线程编程
并发编程是一种在同一时间段内运行多个任务的方法,可以提高程序的效率和性能。Python中的多线程编程可以使用threading模块实现。以下是多线程编程的详细讲解和可运行的Python案例。 1. 什么是多线程 多线程是一种并发编程的方式,它允许在同一个进程中…...
借助 NGINX 对本地的 Kubernetes 服务进行自动化的 TCP 负载均衡
原文作者:Chris Akker - F5 技术解决方案架构师,Steve Wagner - F5 NGINX 解决方案架构师 原文链接:借助 NGINX 对本地的 Kubernetes 服务进行自动化的 TCP 负载均衡 转载来源:NGINX 中文官网 NGINX 唯一中文官方社区 ,…...
基于python的大学学生影响力分析系统设计与实现
博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…...
upload-labs靶场(1-19关)
upload-labs靶场 简介 upload-labs是一个使用php语言编写的,专门收集渗透测试过程中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共19关,每一关都包含着不同上传方式。 注意:能运行<?php phpinfo();?&…...
Python面向对象浅析
目录 面向对象基本概念 一、类和对象 类和对象是面向对象骗程的两个核心概念。 在程序开发中,要设计一个类,通常需要满足一下三个要素: self详解: 对象(Object) 魔法方法: 类里的一些特殊方法 __in…...
JS基本语法
JS代码写在body结束标签的上面 如点击按钮调用方法: 在浏览器的控制台打印测试数据 console.log() <body><button type"button" onclick"easymethod()">点击我</button><script>//JS代码,写在body标签的…...
LSTM详解总结
LSTM(Long Short-Term Memory)是一种用于处理和预测时间序列数据的递归神经网络(RNN)的改进版本。其设计初衷是为了解决普通RNN在长序列训练中出现的梯度消失和梯度爆炸问题。以下是对LSTM的详细解释,包括原理、公式、…...
制品库nexus
详见:Sonatype Nexus Repository搭建与使用(详细教程3.70.1)-CSDN博客 注意事项: 1.java8环境使用nexus-3.69.0-02-java8-unix.tar.gz包 2.java11环境使用nexus-3.70.1-02-java11-unix.tar.gz包 3.注意使用制品库/etc/yum.repos.…...
2022.11.17 阿里钉钉数据开发岗位一面
今天晚上和阿里钉钉面试官聊了一面,整个过程持续45分钟,还是相当持久的。前面先让我自我介绍,包括自身背景、工作经历和项目经验,在介绍的时候面试官几次打断,让我停下来,然后他提问,我很纳闷还…...
【无标题】Git(仓库,分支,分支冲突)
Git 一种分布式版本控制系统,用于跟踪和管理代码的变更 一.Git的主要功能: 二.准备git机器 修改静态ip,主机名 三.git仓库的建立: 1.安装git [rootgit ~]# yum -y install git 2.创建一个…...
访问控制列表(ACL)
文章目录 ACL原理与基本配置ACL分类ACL组成ACL规则的匹配与应用 ACL原理与基本配置 ACL(Access Control List,访问控制列表) 读取二层、三层、四层报文信息根据预先定义好的规则对报文进行过滤和分类实现网络访问控制、防止网络攻击和提高网络带宽利用率等目的提高…...
自用git命令(待完善)
----------------------------------------------------------------------------------------- ###基础 git config --global user.name "xxxxx" #设置提交人 name git config --global user.email "xxxxxx163.com" #设置提交人 email git …...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
