Day57-Nginx反向代理与负载均衡初步应用

Day57-Nginx反向代理与负载均衡初步应用

  • 1. Nginx代理介绍
  • 2. Nginx代理常见模式
    • 2.1 正向代理
    • 2.2 反向代理
    • 2.3 正向与反向代理区别
  • 3. Nginx代理支持协议
  • 4. Nginx反向代理场景实践
  • 5. lb01安装部署nginx

1. Nginx代理介绍

1)在没有代理的情况下,都是客户端直接请求服务端,服务端直接响应客户端。
在这里插入图片描述

2)租客租房,中介代理
在这里插入图片描述

3)在有代理模式的情况下,客户端往往无法直接向服务端发起请求,而是需要使用到中间代理服务,来实现客户端和服务通信。
在这里插入图片描述

4)为什么要使用代理功能?

  1. 提高访问效率。
  2. 承担单机无法处理的大并发流量请求。
  3. 满足7&24不宕机不丢数据需求。

2. Nginx代理常见模式

Nginx作为代理服务, 按照应用场景模式主要分为正向代理、反向代理两种模式

2.1 正向代理

*正向代理,早期的应用场景主要用于局域网内的电脑内部上网,主要解决的痛点是早期企业带宽有限,用户上网拥挤,速度慢,以及上网行为管理。目前带宽已不是问题,并且智能路由器等实现上网管理功能,因此正向代理应用已不那么流行了。
在这里插入图片描述

在这里插入图片描述

2.2 反向代理

反向代理的核心应用场景为用于公司后台网站集群架构中,客户端->代理<–>服务端,解决的主要痛点是单台机器无法承受大量并发用户的服务请求。需要有多台服务器同时处理请求。

在这里插入图片描述

在这里插入图片描述

2.3 正向与反向代理区别

1.服务的"对象"不同

正向代理代理的对象是局域网内的上网客户端,为其服务。

反向代理代理的对象是服务端,为上网的用户提供服务服务。

2.架设位置不同

正向代理架设在企业办公上网出口位置

反向代理架设在企业网站服务器的前端

3.代理作用不同

正向代理解决局域网上网提速、节约网站带宽、管控员工上网行为。

反向代理解决单台网站服务器撑不住流量并发问题,同时保障网站7X24不间断提供服务的需求。

3. Nginx代理支持协议

1.Nginx作为代理服务,可支持的代理协议非常的多,具体如下图
在这里插入图片描述

2.Nginx作为反向代理,常常会用到如下几种代理协议,如下图所示
在这里插入图片描述

Grpc:
链接: https://www.jianshu.com/p/9c947d98e192
链接: http://doc.oschina.net/grpc?t=58008

gRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。
websocket
链接: https://www.zhihu.com/question/20215561
链接: https://baike.baidu.com/item/WebSocket/1953845?fr=aladdin

3.最后我将企业常用反向代理模式与Nginx反向代理模块对应关系总结如下表格

反向代理模式Nginx反向代理模块
http、websocket、httpsngx_http_proxy_module
fastcgingx_http_fastcgi_module
uwsgingx_http_uwsgi_module
grpcngx_http_v2_module

4. Nginx反向代理场景实践

1)Nginx反向代理配置语法示例

Syntax: proxy_pass URL;
Default: —
Context: location, if in location, limit_except
#示例
proxy_pass http://localhost:8000/uri/
proxy_pass http://10.0.0.7:8000/uri/
proxy_pass http://unix:/tmp/backend.socket:/uri/

2)Nginx反向代理配置实例
在这里插入图片描述

角色外网IP(NAT)内网IP(LAN)主机名
反向代理eth0:10.0.0.5eth1:172.16.1.5lb01
Web服务eth1:172.16.1.7web01

3)web01、web02服务器, 分别配置虚拟主机

#web01服务器配置测试虚拟主机
[root@web01 ~]# cat /etc/nginx/conf.d/01_test.etiantian.org.conf
#server{
#    listen 80;
#    server_name _default;
#    return 404;
#}

server {
    listen 80;
    server_name test.etiantian.org;
    charset utf-8;
    location / {
        root /usr/share/nginx/html/test;
        index index.html index.htm;
    }
}

[root@web01 conf.d]# mkdir /usr/share/nginx/html/test
[root@web01 conf.d]# echo "web01" >/usr/share/nginx/html/test/index.html
[root@web01 conf.d]# systemctl restart nginx
[root@web01 conf.d]# curl -H "Host:test.etiantian.org" 10.0.0.7
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
[root@web01 conf.d]# curl -H "Host:test.etiantian.org" 10.0.0.7
web01

#web02服务器配置测试虚拟主机
[root@web02 ~]# cat /etc/nginx/conf.d/01_test.etiantian.org.conf
server{
    listen 80;
    server_name _default;
    return 404;
}

server {
    listen 80;
    server_name test.etiantian.org;
    charset utf-8;
    location / {
        root /usr/share/nginx/html/test;
        index index.html index.htm;
        }
}

[root@web02 conf.d]# mkdir /usr/share/nginx/html/test
[root@web02 conf.d]# echo "web02" >/usr/share/nginx/html/test/index.html
[root@web02 conf.d]# systemctl restart nginx
[root@web02 conf.d]# curl -H "Host:test.etiantian.org" 10.0.0.8
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
[root@web02 conf.d]# curl -H "Host:test.etiantian.org" 10.0.0.8
web02

在这里插入图片描述

4)proxy代理服务器, 配置监听eth0的80端口,使10.0.0.0网段的用户,能够通过代理服务器访问到后端的172.16.1.7的80端口站点内容

[root@lb01 conf.d]# cat /etc/nginx/conf.d/blog.etiantian.org.conf
server {
    listen 80;
    server_name test.etiantian.org;
    location / {
        proxy_pass http://172.16.1.7:80;
        proxy_set_header Host $http_host; #nginx代理携带请求头请求后端Web节点
        }
}
[root@lb01 conf.d]# systemctl enable nginx
[root@lb01 conf.d]# systemctl start nginx

在这里插入图片描述

更多见day57-oldboy最牛.txt
5)抓包分析Nginx代理处理整个请求的过程
扩展作业
6)添加发往后端服务器的请求头信息, 如图

Syntax: proxy_set_header field value;
Default: proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
Context: http, server, location
# 客户端请求Host的值是blog.etiantian.org, 那么代理服务会像后端请求时携带Host变量为blog.etiantian.org
proxy_set_header Host $http_host;
# 将$remote_addr的值放进变量X-Real-IP中,$remote_addr的值为客户端的ip
proxy_set_header X-Real-IP $remote_addr;
# 客户端通过代理服务访问后端服务,后端服务会通过该变量会记录真实客户端地址
proxy_set_header X-Forwarded-For
$proxy_add_x_forwarded_for;

7)代理的向后端请求时使用的HTTP协议版本。默认1.0版本。如果使用长连接,建议调整为1.1版本协议。

Syntax: proxy_http_version 1.0 | 1.1;
Default: proxy_http_version 1.0;
Context: http, server, location
This directive appeared in version 1.1.4.
# proxy_http_version 1.1;

8)代理到后端的TCP连接、响应、返回等超时时间, 如图

#nginx代理与后端服务器连接超时时间(代理连接超时)
Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s;
Context: http, server, location

#nginx代理等待后端服务器的响应时间
Syntax: proxy_read_timeout time;
Default: proxy_read_timeout 60s;
Context: http, server, location

#后端服务器数据回传给nginx代理超时时间
Syntax: proxy_send_timeout time;
Default: proxy_send_timeout 60s;
Context: http, server, location

5. lb01安装部署nginx

  1. 使用官方仓库安装Nginx
#yum install nginx -y 可能优先使用epel里的源,怎么确保我们配置的官方优先。
[root@web01 ~]# rpm -qa yum-plugin-priorities
[root@web02 ~]# yum install yum-plugin-priorities -y
[root@web01 ~]# cat /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
priority=1  #增加优先参数,使得官方源优先epel源。

#安装Nginx
[root@web01 ~]# yum install nginx -y
  1. 配置Nginx进程运行的用户
[root@web01 ~]# useradd -u1111 www -s /sbin/nologin -M
[root@web01 ~]# sed -i '/^user/c user www;' /etc/nginx/nginx.conf
[root@web01 ~]# grep "^user" /etc/nginx/nginx.conf
  1. 启动Nginx,并将Nginx加入开机自启
[root@web01 ~]# systemctl start nginx
[root@web01 ~]# systemctl enable nginx

[root@web01 ~]# lsof -i :80 #查看端口对应的服务
[root@web01 ~]# nginx -v    #查看版本
nginx version: nginx/1.20.1 
[root@web01 ~]# curl 10.0.0.5 #welcome to Nginx 表示正常。

实验1:

[root@lb01 conf.d]# vim 01_test.etiantian.org.conf 
server {
	listen 80;
	server_name test.etiantian.org;
	location / {
		proxy_pass http://172.16.1.7:80;
                proxy_set_header Host $http_host;
	}
}

[root@lb01 conf.d]# curl -H "Host:test.etiantian.org" 10.0.0.5
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>

实验2:

[root@lb01 conf.d]# vim 01_test.etiantian.org.conf 
server {
	listen 80;
	server_name test.etiantian.org;
	location / {
	    proxy_pass http://172.16.1.7:80;
         proxy_set_header Host $http_host; #实现Nginx代理携带host字段请求节点。
	}
}

# 成功
[root@lb01 conf.d]# curl -H "Host:test.etiantian.org" 10.0.0.5
web01
  1. 拆分不同的后端服务器提供访问。
    1.动静分离。
    2.不同的动态业务分离。

网站集群:一个项目下的

www.etiantian.org                   #
www.etiantian.org/dynamic/xx//xxxx  #动态服务器集群
www.etiantian.org/regi/xx//xxxx     #注册登录服务器集群
www.etiantian.org/regi/xx//xxxx     #手机服务器集群
......

二级页面:

tongzhuang.etiantian.org  
neiyi.etiantian.org
image.etiantian.org

静态服务:独立域名
image.ett.com

[root@web01 conf.d]# cat location01.etiantian.org.conf 
server {
	listen 80;
	server_name www.etiantian.org;
    #www.etiantian.org
    location / {
	    proxy_pass http://172.16.1.7:80;
         proxy_set_header Host $http_host;
    }
    #www.etiantian.org/dynamic/xx//xxxx  #动态服务器集群
    location /dynamic/ {
	    proxy_pass http://172.16.1.8:80; ##动态
         proxy_set_header Host $http_host;
    }
    #www.etiantian.org/regi/xx//xxxx     #注册登录服务器
    location ^~ /regi/ {
	    proxy_pass http://172.16.1.9:80; #注册登录服务器集群
         proxy_set_header Host $http_host;
    }
    #www.etiantian.org/regi/xx//xxxx     #手机服务器集群
    #location ^~ $http_user_agent = 安卓英文 {
	     proxy_pass http://172.16.1.9:80; ##手机服务器集群
          proxy_set_header Host $http_host;
    }
    ##静态
    location ~* \.(gif|jpg|jpeg)$ {
	    proxy_pass http://172.16.1.10:80;
         proxy_set_header Host $http_host;
    }
}
  1. 负载均衡 backend服务器池
    1)基本负载均衡实验
[root@lb01 conf.d]# cat 01_test.etiantian.org.conf 
upstream backend {
    #server backend1.example.com       weight=5;
    #server backend2.example.com:8080;
    #server unix:/tmp/backend3;
    server 172.16.1.7        weight=2; #默认80端口
    server 172.16.1.8        weight=1; #默认80端口
    
    #server 8080.etiantian.org:8080     backup; #热备
    #server backup2.example.com:8080   backup; #热备
}

server {
	listen 80;
	server_name test.etiantian.org;
	location / {
		proxy_pass http://backend;
		#proxy_pass http://a.etiantian.org:80;
         proxy_set_header Host $http_host;
	}
}

配置web01:

[root@web01 conf.d]# cat 01_test.etiantian.org.conf 
server{
	listen 80;
	server_name _default;
	return 404;
}

server {
    listen       80;
    server_name  test.etiantian.org;
    charset        utf-8;
    location / {
        root   /usr/share/nginx/html/test;
        index  index.html index.htm;
    }
}
server {
    listen       8080;
    server_name  test.etiantian.org;
    charset        utf-8;
    location / {
        root   /usr/share/nginx/html/test8080;
        index  index.html index.htm;
    }
}

配置web02:

[root@web02 conf.d]# cat 01_test.etiantian.org.conf 
server{
	listen 80;
	server_name _default;
	return 404;
}

server {
    listen       80;
    server_name  test.etiantian.org;
    charset        utf-8;
    location / {
        root   /usr/share/nginx/html/test;
        index  index.html index.htm;
    }
}

systemctl restart nginx

# 实现效果:
[root@web02 conf.d]# curl -H "host:test.etiantian.org" 10.0.0.8
web02
[root@web02 conf.d]# curl -H "host:test.etiantian.org" 10.0.0.7
web01

结果:

[root@lb01 conf.d]# for n in {1..100}; do curl test.etiantian.org;sleep 1;done
web01
web02
web01
web01
web02
web01
web01
web02

2)测试backup功能

[root@lb01 conf.d]# cat 01_test.etiantian.org.conf 
upstream backend {
    #server backend1.example.com       weight=5;
    #server backend2.example.com:8080;
    #server unix:/tmp/backend3;
    server 172.16.1.7        weight=2; #默认80端口
    server 172.16.1.8        weight=1; #默认80端口
    
    #server 8080.etiantian.org:8080     backup; #热备
    #server backup2.example.com:8080   backup; #热备
}
server {
	listen 80;
	server_name test.etiantian.org;
	location / {
		proxy_pass http://backend;
		#proxy_pass http://a.etiantian.org:80;
         proxy_set_header Host $http_host;
	}
}

#host解析

[root@lb01 conf.d]# grep 80 /etc/hosts
172.16.1.7 web01 8080.etiantian.org

关掉web02 nginx:pkill nginx,然后回到lb01访问
[root@lb01 conf.d]# for n in {1..100}; do curl test.etiantian.org;sleep 1;done
web02
web02
web02
web01-8080
web01-8080
web01-8080
web02
web02

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

苹果与百度合作,将在iPhone 16中使用生成式AI

3月25日&#xff0c;《科创板日报》消息&#xff0c;苹果将与百度进行技术合作&#xff0c;为今年即将发布的iPhone16、Mac系统和iOS 18提供生成式AI&#xff08;AIGC&#xff09;功能。 据悉&#xff0c;苹果曾与阿里巴巴以及另外一家国产大模型厂商进行了技术合作洽谈。最终…

信号处理--基于混合CNN和transfomer自注意力的多通道脑电信号的情绪分类的简单应用

目录 关于 工具 数据集 数据集简述 方法实现 数据读取 ​编辑数据预处理 传统机器学习模型(逻辑回归&#xff0c;支持向量机&#xff0c;随机森林) 多层感知机模型 CNNtransfomer模型 代码获取 关于 本实验利用结合了卷积神经网络 (CNN) 和 Transformer 组件的混合…

Qt 作业 24/3/26

1、实现闹钟 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTime> #include <QLineEdit>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent …

FPGA之状态机学习

作为一名逻辑工程师&#xff0c;掌握和应用状态机设计是必不可少的。能够灵活的应用状态机是对逻辑工程师最基本的要求&#xff0c;状态机设计的好坏能够直接影响到设计系统的稳定性&#xff0c;所以学会状态机是非常的重要。 1.状态机的概念 状态机通过不同的状态迁移来完成特…

STM32之HAL开发——串口配置(源码)

串口收发原理框图&#xff08;F1系列&#xff09; 注意&#xff1a;数据寄存器有俩个一个是收一个是发&#xff0c;但是在标准库或者HAL库中没有特别区分开来是俩个寄存器&#xff01; USART 初始化结构体详解 HAL 库函数对每个外设都建立了一个初始化结构体&#xff0c;比如 …

如何快速在ESXi中嵌套部署一台ESXi服务器?

正文共&#xff1a;1234 字 26 图&#xff0c;预估阅读时间&#xff1a;2 分钟 我们之前介绍过VMWare ESXi服务器镜像的定制&#xff08;VMware ESXi部署镜像定制&#xff09;和部署&#xff08;惠普VMware ESXI 6.7定制版部署&#xff09;&#xff0c;但是还没有介绍过ESXi版本…

YOLOv8改进 | 主干篇 | 修复官方去除掉PP-HGNetV2的通道缩放功能(轻量又涨点,全网独家整理)

一、本文介绍 本文给大家带来的改进机制是大家在跑RT-DETR提供的HGNetV2时的一个通道缩放功能&#xff08;官方在前几个版本去除掉的一个功能&#xff09;&#xff0c;其中HGNetV2当我们将其集成在YOLOv8n的模型上作为特征提取主干的时候参数量仅为230W 计算量为6.7GFLOPs该网…

【机器学习之---数学】随机游走

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 随机游走 1. 概念 1.1 例1 在你的饮食俱乐部度过了一个富有成效的晚上后&#xff0c;你在不太清醒的状态下离开了。因此&#xff0c;你会醉醺醺地在展…

【opencv】实时位姿估计(real_time_pose_estimation)—3D模型注册

相机成像原理图 物体网格、关键点&#xff08;局内点、局外点&#xff09;图像 box.ply resized_IMG_3875.JPG 主程序main_registration.cpp 主要实现了利用OpenCV库进行3D模型的注册。主要步骤包括加载3D网格模型、使用鼠标事件选择对应的3D点进行2D到3D的注册、利用solvePnP算…

在django中使用kindeditor出现转圈问题

在django中使用kindeditor出现转圈问题 【一】基础检查 【1】前端检查 确保修改了uploadJson的默认地址 该地址需要在路由层有映射关系 确认有加载官方文件 kindeditor-all-min.js确保有传递csrfmiddlewaretoken 或者后端关闭了csrf验证 <textarea name"content&qu…

无人驾驶矿卡整体解决方案(5g物联网通信方案)

​无人驾驶矿卡是智能矿山的重要组成部分,通过远程操控替代人工驾驶,可以显著提高采矿效率和作业安全性。但要实现无人驾驶矿卡,需要依赖于可靠高效的通信网络,来传输现场视频、控制指令和运行数据。以下是某大型煤矿在部署无人驾驶矿卡时,所采用的星创易联物联网整体解决方案。…

如何区分模型文件是稳定扩散模型和LORA模型

区分模型文件是否为稳定扩散模型&#xff08;Stable Diffusion Models&#xff09;或LORA模型&#xff08;LowRank Adaptation&#xff09;通常需要对模型的结构和内容有一定的了解。以下是一些方法来区分这两种模型文件&#xff1a; 1. 文件格式和结构 稳定扩散模型&#xff1…

词根词缀基础

一&#xff0e;词根词缀方法&#xff1a; 1. 类似中文的偏旁部首&#xff08;比如“休”单人旁木→一个人靠木头上休息&#xff09; 2. 把单词拆分后&#xff0c;每一个部分都有它自己的意思&#xff0c;拼凑在一起就构成了这个单词的意思 3. 一个规律&#xff0c;适用大部分…

基于nodejs+vue多媒体素材管理系统python-flask-django-php

该系统采用了nodejs技术、express 框架&#xff0c;连接MySQL数据库&#xff0c;具有较高的信息传输速率与较强的数据处理能力。包含管理员、教师和用户三个层级的用户角色&#xff0c;系统管理员可以对个人中心、用户管理、教师管理、资源类型管理、资源信息管理、素材类型管理…

论文阅读-《Lite Pose: Efficient Architecture Design for 2D Human Pose Estimation》

摘要 这篇论文主要研究了2D人体姿态估计的高效架构设计。姿态估计在以人为中心的视觉应用中发挥着关键作用&#xff0c;但由于基于HRNet的先进姿态估计模型计算成本高昂&#xff08;每帧超过150 GMACs&#xff09;&#xff0c;难以在资源受限的边缘设备上部署。因此&#xff0…

(三)Ribbon负载均衡

1.1.负载均衡原理 SpringCloud底层其实是利用了一个名为Ribbon的组件&#xff0c;来实现负载均衡功能的。 1.2.源码跟踪 为什么我们只输入了service名称就可以访问了呢&#xff1f;之前还要获取ip和端口。 显然有人帮我们根据service名称&#xff0c;获取到了服务实例的ip和…

GitLab更新失败(Ubuntu)

在Ubuntu下使用apt更新gitlab报错如下&#xff1a; An error occurred during the signature verification.The repository is not updated and the previous index files will be used.GPG error: ... Failed to fetch https://packages.gitlab.com/gitlab/gitlab-ee/ubuntu/d…

Leetcode 3.26

Leetcode Hot 100 一级目录1.每日温度 堆1.数组中的第K个最大元素知识点&#xff1a;排序复杂度知识点&#xff1a;堆的实现 2.前 K 个高频元素知识点&#xff1a;优先队列 一级目录 1.每日温度 每日温度 思路是维护一个递减栈&#xff0c;存储的是当前元素的位置。 遍历整个…

web学习笔记(四十五)Node.js

目录 1. Node.js 1.1 什么是Node.js 1.2 为什么要学node.js 1.3 node.js的使用场景 1.4 Node.js 环境的安装 1.5 如何查看自己安装的node.js的版本 1.6 常用终端命令 2. fs 文件系统模块 2.1引入fs核心模块 2.2 读取指定文件的内容 2.3 向文件写入指定内容 2.4 创…

app自动化-Appium学习笔记

使用Appium&#xff0c;优点&#xff1a; 1、支持语言比较多&#xff0c;例如&#xff1a;Java、Python、Javascript、PHP、C#等语言 2、支持跨应用&#xff08;windows、mac、linux&#xff09; 3、适用平台Android、iOS 4、支持Native App(原生app)、Web App、Hybird App…