高性能web服务器4——Nginx反向代理A

news2024/11/16 15:49:45

Nginx 反向代理

Nginx 的反向代理功能是其最强大的特性之一,它允许 Nginx 作为中间层来接收客户端的请求,并将这些请求转发到后端服务器。这种架构不仅可以提高安全性,还可以实现负载均衡、缓存和内容过滤等功能。本文将详细介绍 Nginx 反向代理的基本概念、配置方法以及一些高级用法。
在这里插入图片描述

1. 反向代理的基本概念

1.1 什么是反向代理?

  • 定义:反向代理是一种代理服务器类型,它代表一组后端服务器接受和转发客户端的请求。与正向代理不同,反向代理位于客户端看不见的位置。
  • 作用:提高安全性、负载均衡、缓存、内容过滤等。

1.2 反向代理的工作原理

  • 接收请求:客户端向反向代理服务器发送请求。
  • 转发请求:反向代理服务器根据配置将请求转发到一个或多个后端服务器。
  • 返回响应:后端服务器处理请求并返回响应,反向代理再将响应转发给客户端。

在这里插入图片描述

1.3 反向代理转发模块

Nginx 除了可以在企业提供高性能的web服务之外,另外还可以将 nginx 本身不具备的请求通过某种预
定义的协议转发至其它服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范,主
要在不同的场景使用以下模块实现不同的功能

  • ngx_http_proxy_module: #将客户端的请求以http协议转发至指定服务器进行处理
  • ngx_http_upstream_module #用于定义为proxy_pass,fastcgi_pass,uwsgi_pass
    #等指令引用的后端服务器分组
  • ngx_stream_proxy_module: #将客户端的请求以tcp协议转发至指定服务器处理
  • ngx_http_fastcgi_module: #将客户端对php的请求以fastcgi协议转发至指定服务器助理
  • ngx_http_uwsgi_module: #将客户端对Python的请求以uwsgi协议转发至指定服务器处理

在这里插入图片描述

同构代理:用户不需要其他程序的参与,直接通过http协议或者tcp协议访问后端服务器
异构代理:用户访问的资源时需要经过处理后才能返回的,比如php,python,等等,这种访问资源需
要经过处理才能被访问
在这里插入图片描述

2. 配置反向代理

2.1 定义后端服务器

在 Nginx 中,你可以定义一个或多个后端服务器,并将它们组合成一个上游组。

示例
upstream backend {
    server 192.168.1.10:8000;
    server 192.168.1.11:8000;
}

这里定义了一个名为 backend 的上游组,包含两个后端服务器。

2.2 配置反向代理

接下来,你需要在 location 块中配置反向代理规则。

示例
location / {
    proxy_pass http://backend;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

这里,proxy_pass 指令将请求转发到前面定义的 backend 上游组。

2.3 配置负载均衡

Nginx 支持多种负载均衡算法,包括轮询、最少连接数、哈希等。

示例
upstream backend {
    least_conn;
    server 192.168.1.10:8000;
    server 192.168.1.11:8000;
}

这里,least_conn 指令使得请求被转发到当前连接数最少的后端服务器。

3. 高级配置

3.1 会话保持

会话保持确保来自同一客户端的请求总是被转发到同一个后端服务器。

示例
upstream backend {
    ip_hash;
    server 192.168.1.10:8000;
    server 192.168.1.11:8000;
}

这里,ip_hash 指令实现了基于客户端 IP 地址的会话保持。

3.2 健康检查

Nginx 支持对后端服务器进行健康检查,确保只转发请求到健康的服务器。

示例
upstream backend {
    server 192.168.1.10:8000;
    server 192.168.1.11:8000 down;
    server 192.168.1.12:8000 max_fails=3 fail_timeout=30s;
}

这里,down 表示服务器目前不可用,max_failsfail_timeout 用于配置健康检查。

3.3 缓存

Nginx 可以缓存后端服务器的响应,以减少对后端服务器的请求次数。

示例
location / {
    proxy_pass http://backend;
    proxy_cache my_cache;
    proxy_cache_valid 200 60m;
}

这里,proxy_cache 指令配置了缓存,proxy_cache_valid 指令定义了缓存的有效期。

3.4 SSL/TLS 终结

Nginx 可以作为 SSL/TLS 终结点,处理加密通信,减轻后端服务器的负担。

示例
server {
    listen 443 ssl;
    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;
    proxy_pass http://backend;
}

这里,ssl_certificatessl_certificate_key 指令配置了 SSL/TLS 证书。

4. 配置示例

4.1 简单的反向代理

假设你有一个简单的后端服务器,你需要配置 Nginx 作为反向代理来转发请求。

配置文件
server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://192.168.1.10:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

4.2 负载均衡

假设你有两个后端服务器,你需要配置 Nginx 来实现负载均衡。

配置文件
upstream backend {
    server 192.168.1.10:8000;
    server 192.168.1.11:8000;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

4.3 会话保持

假设你有两个后端服务器,你需要配置 Nginx 来实现基于客户端 IP 地址的会话保持。

配置文件
upstream backend {
    ip_hash;
    server 192.168.1.10:8000;
    server 192.168.1.11:8000;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

4.4 SSL/TLS 终结

假设你需要配置 Nginx 来处理 HTTPS 请求,并将请求转发到 HTTP 后端服务器。

配置文件
server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;

    location / {
        proxy_pass http://192.168.1.10:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

5. 注意事项

  • 确保正确配置 SSL/TLS 证书,以避免安全警告。
  • 监控后端服务器的健康状态,及时调整负载均衡策略。
  • 测试反向代理配置,确保所有功能按预期工作。
  • 考虑到安全性,不要暴露后端服务器的 IP 地址。

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

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

相关文章

【neo4j】neo4j-Desktop安装

Neo4j是一个高性能的图数据库,它使用图形结构来存储和处理数据。它是一个开源的、完全事务的数据库,专门设计用于大规模的图形数据。Neo4j使用一种名为Cypher的查询语言来处理图形数据,使用户能够方便地进行复杂的图形查询和分析。 Neo4j的主…

AIGC 大模型:实践与未来

一、AIGC 大模型的概念与发展 (一)AIGC 大模型的定义与特点 AIGC(AI Generated Content)大模型是一种基于大规模数据训练的人工智能模型,具备强大的内容生成能力和多模态交互能力。它能够理解和处理多种类型的信息&a…

找不到工作四处闲逛github,我发现了一个找工作的神器

前言 到底是谁把我那不值钱的班给上了,博主找不到工作,天天游荡。 终于在github上发现一个找工作的神器,那就是:get_gobs 该项目支持定时投递,自动编写打招呼语,妈妈,再也不用担心我打招呼的…

简易STL实现 | List的实现

基于双向链表的数据结构 1、list的特性 双向链表:允许在序列的两端和中间 执行高效的插入和删除操作 不支持随机访问:要访问list中的元素,必须通过迭代器进行 动态内存管理: list的内部实现使用节点,每个节点都包含…

Java 入门指南:Java IO 模型

UNIX I/O 模型 根据冯.诺依曼结构,计算机结构分为 5 大部分:运算器、控制器、存储器、输入设备、输出设备。 输入设备(比如键盘)和输出设备(比如显示器)都属于外部设备。网卡、硬盘这种既可以属于输入设备…

日期反向格式化之前导零

1.问题描述 2.问题分析 为什么用yyyy年MM月dd日会报错,原因是:"前导零" 2.1前导零 前导零指的是在单个数字前面添加一个零以确保数字位数相同的过程。在日期格式化中,前导零常用于确保月份或日期总是显示为两位数字。 例…

mac苹果电脑配置Docker最新国内源

如图: 具体配置如下: {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": ["https://docker.anyhub.us.kg", &…

单线程,多线程,异步,同步详解

关于异步与多线程,笔者在刚接触的时候一直存在诸多疑惑,甚至一度以为这俩概念是用来描述同一种技术在不同场景下的应用,进而导致对很多与它们相关的概念都一知半解,代码中的async/await关键词也是莫名其妙地在用。 但是在不断地接…

【解析几何笔记】8.向量的投影与内积

8. 向量的投影与内积 复习前面的知识:,若BCE三点共线,则 A E ⃗ ( 1 − s ) A B ⃗ s A C ⃗ , ( B , C , E ) μ ⇒ s μ 1 μ , 1 − s 1 1 μ \vec{AE}(1-s)\vec{AB}s\vec{AC},(B,C,E)\mu\Rightarrow s\frac{\mu}{1\mu},1-s\frac…

【案例59】WebSphere类加载跟踪开启方法

问题现象 WAS加载代码时,模块开发怀疑是WebSphere本身加载某个类的代码出现了问题。但不知道怎么排查。故寻求帮助。 问题分析 WebSphere本身是提供相关类加载跟踪的方法的。 解决方案 经过排查资料。如果实际诊断中,能够明确断定是某个类的加载出了…

MySQL集群技术详解

目录 一、MySQL在服务器中的部署方法 1.1 编译安装MySQL 1.2 部署MySQL 二、MySQL主从复制 2.1 配置master 2.2 配置slave 2.3 添加slave2 测试: 2.4 延迟复制 2.5 慢查询日志 2.6 MySQL的并行复制 2.7 MySQL主从复制原理剖析 2.8 架构缺陷 三、MySQL…

猫咪掉毛严重,新手铲屎官不知如何处理?推荐使用宠物空气净化器

把小猫接回来一起生活没几天,我就感觉好日子就到头了...猫咪掉毛怎么这么严重啊,我都不敢怎么撸它,一撸满天都是毛,轻轻一搓就是一大团。而且想到还要清理就很头疼,每天都要很多的时间搞卫生。尝试过把它的毛剪短&…

【时时三省】(C语言基础)指针进阶3

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 一级指针的传参 示例: 这就是一个一级指针传参 思考:当一个函数的参数部分为一级指针的时候,函数能接受什么参数? 二级指针的传参 二级指针示例: pa是一级指针 p…

K8S 1.31 新功能: 跨核分发CPU

​在Kubernetes的最新版本1.31中,一个超酷的新功能,叫做CPUManager的静态策略,里面有个选项叫做distribute-cpus-across-cores。虽然这个功能现在还在测试阶段,也就是alpha版,而且默认是藏起来的,但它的目的…

Backtrader 实现和理解海龟交易法

Backtrader 实现和理解海龟交易法 1. 海龟交易的理解 (1)资金管理 海龟将总资金分为N个交易单位,每个单位即称为头寸,划分的标准主要是参考标的的波动性。 波动性用一个指标量化即真实波动幅度均值(ATR)…

SSRF - 服务器端请求伪造

目录 SSRF dict协议 file协议 gopher协议 工具Gopherus 练习 练习1 练习2 docker镜像加速的方法 SSRF SSRF(Server-Side Request Forgery:服务器端请求伪造) 其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制&…

【物理学】什么是运动学和动力学?

Kinematics 和 Kinetics 是力学中的两个重要分支,它们虽然都涉及物体的运动,但关注的方面不同。 Kinematics(运动学) Kinematics 主要研究物体的运动,而不涉及导致运动的力。它关注的是运动的几何特性,比…

UE5学习笔记18-使用FABRIK确定骨骼的左手位置

一、在武器的骨骼资产中创建一个新的插槽 二、在动画类中添加代码 xxx.h UPROPERTY(BlueprintReadOnly, Category Character, meta (AllowPrivateAccess "true"))/** 蓝图只读 类型是Character 允许私有访问 */ FTransform LeftHandTransform;//拿武器时知道左手…

STL经典案例(三)——俺是歌手挑战赛管理系统(涉及的STL内容较多,篇幅有点长,耐心看完,相信我,一定会有收获的!)

一、需求:俺是歌手挑战赛比赛规则如下 目前共计12名选手报名参赛,选手编号为1-12号比赛分为A和B两组,每组6人,选手随机抽签进行分组比赛共两轮赛事,第一轮为淘汰赛,第二轮为决赛,淘汰赛中每组前…

Git —— 2、创建本地版本库

版本库 版本库又名仓库,英文名repository,这个仓库里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原“。   创建本地版本库…