Nginx反向代理实现与配置

目录

    • Nginx 反向代理
    • Nginx反向代理配置

Nginx 反向代理

Nginx 可以充当反向代理服务器,将客户端请求转发到后端的多个服务器上,并将响应返回给客户端。

Nginx作为反向代理服务器的工作原理如下:

  1. 客户端发送请求:当客户端(例如浏览器)需要访问某个Web服务时,它会向Nginx服务器发送HTTP请求。这个请求包括了要访问的URL和其他相关信息。
  2. Nginx接收请求:Nginx服务器接收到客户端发送的请求后,会解析请求中的URL和其他信息。
  3. 转发请求:Nginx根据配置规则,将接收到的客户端请求转发给后端的Web服务器(或称为应用服务器)。这个过程可能是基于轮询、加权轮询、IP hash等负载均衡策略来选择的。
  4. 后端服务器处理请求:后端的Web服务器接收到Nginx转发过来的请求后,会处理这个请求,并生成相应的响应。
  5. 返回响应:后端服务器将处理后的响应返回给Nginx服务器。Nginx服务器可能会对这个响应进行一些处理,例如缓存、压缩等。
  6. Nginx转发响应:Nginx将后端服务器返回的响应转发给客户端。这样,客户端就得到了它需要的数据。

在整个过程中,Nginx作为反向代理服务器,起到了一个中间人的角色。它接收客户端的请求,转发给后端服务器,再将后端服务器的响应返回给客户端。这样,客户端并不知道它实际上访问的是哪个后端服务器,从而实现了隐藏后端服务器、负载均衡、缓存加速等功能。同时,由于Nginx的高性能和稳定性,它可以处理大量的并发请求,提高整个Web服务的性能和可靠性。

Nginx反向代理配置

Nginx的配置文件主要有两个,/etc/nginx/nginx.conf和/etc/nginx/conf.d/default.conf

/etc/nginx/nginx.conf:这是Nginx的主配置文件,包含了全局的配置信息。在这个文件中,你可以配置Nginx的全局设置,如进程数、用户、日志格式等。此文件通常用于配置Nginx的全局行为,例如设置worker_processes参数、加载模块等。

/etc/nginx/conf.d/default.conf:这是一个子配置文件,位于/etc/nginx/conf.d/目录下。在Nginx的主配置文件中,通常会通过include指令来引入该目录下的所有子配置文件。default.conf文件是一个示例配置文件,用于演示和说明Nginx的基本用法。

在/etc/nginx/nginx.conf配置文件,通过include指令引入了conf.d目录下的所有配置文件,一般我们通过nginx.conf配置文件进行配置即可

Nginx 可以通过配置 Nginx 的 locationproxy_pass 指令来实现反向代理,location 用于指定处理哪些URL请求,proxy_pass 用于指定反向代理的服务器地址

以下是一个示例配置,用于将请求反向代理到本地的 8080 端口:

http {server {listen 80;server_name localhost; # 你的域名location / {proxy_pass http://127.0.0.1:8080;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}
}

这个配置文件的含义是:当用户访问你的服务器(假设你的服务器 IP 是 your_server_ip)的 80 端口时,Nginx 会将请求转发到本地的 8080 端口。

listen 80:表示 Nginx 监听 80 端口。

location /:表示匹配所有 URI 的 location 块。就是说,这个 location 块会处理所有发送到 Nginx 服务器的请求,不管 URI 是什么。

location 是 Nginx 配置中的一个关键指令,用于根据请求的 URI 来进行相应的处理请求。

以下是一些常见的 location 使用示例:
1. location /: 匹配所有请求,包括根路径(例如 http://yourserver.com/)。
2. location /api/: 匹配以 /api/ 开头的所有请求,包括/api/(例如 http://yourserver.com/api/users)。
3. location /static/: 匹配以 /static/ 开头的所有请求(例如 http://yourserver.com/static/css/style.css)。
4. location ~* \.(jpg|jpeg|png)$: 匹配所有以 .jpg, .jpeg,.png 结尾的请求,无论它们位于哪个路径下。
5. location = /path 精准匹配,只匹配/path这个请求路径

当请求到达 Nginx 时,Nginx 会根据 location 块的配置顺序和匹配规则来决定使用哪个 location 块来处理请求。如果请求的 URI 与多个 location 块匹配,Nginx 会选择第一个最精确的匹配。如果没有找到匹配的 location 块,Nginx 会使用默认的 location / 块。

你可以使用多个 location 块来根据不同的路径进行不同的转发

以下是一个示例配置:

http {server {listen 80;location /api/ {proxy_pass http://127.0.0.1:8000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}location /static/ {proxy_pass http://127.0.0.1:8001;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}location / {proxy_pass http://127.0.0.1:8002;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}
}

在这个配置中,所有以 /api/ 开头的请求会被转发到 http://127.0.0.1:8000,所有以 /static/ 开头的请求会被转发到 http://127.0.0.1:8001,其他所有请求会被转发到 http://127.0.0.1:8002。

注意:Nginx 会按照配置文件中 location 块的顺序进行匹配,一旦找到匹配的 location,就会停止查找。因此,你应该将最特殊的 location(例如,以特定前缀开始的路径)放在最上面,将最通用的 location(例如,用于匹配所有其他请求的路径)放在最下面。

proxy_pass http://127.0.0.1:8080:表示将所有请求转发到本地的 8080 端口,proxy_pass 就是用来设置反向代理的目标服务器地址和端口

proxy_set_header 用于设置转发请求的 HTTP 头部信息。

proxy_set_header Host $host;:这个指令用于设置 HTTP 请求头部中的 Host 字段,将客户端请求中的 Host 头部信息传递给后端服务器。这样后端服务器就能知道客户端请求的原始 Host 信息。

proxy_set_header X-Real-IP $remote_addr;:这个指令用于设置 HTTP 头部 X-Real-IP字段,将客户端的真实 IP 地址传递给后端服务器。这有助于后端服务器获取客户端的真实 IP 地址(通过读取 “X-Real-IP” 字段来获取客户端的真实 IP 地址)。

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;:这个指令用于设置 HTTP 头部 X-Forwarded-For字段,将客户端的原始 IP 地址列表传递给后端服务器(简单来说就是将客户端的真实 IP 地址添加到 “X-Forwarded-For” 字段中。同时,它还会保留原有的 “X-Forwarded-For” 字段值,以便于追踪请求经过了哪些代理服务器)。这个头部通常用于记录经过的代理服务器的 IP 地址,以便后端服务器跟踪请求的来源。

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

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

相关文章

C++ 日期计算器

日期计算器 概要 Date类的规划Date类的实现Date 构造函数Date 拷贝构造函数~Date 析构函数GetMonthDay 求某年某月的天数operator 赋值操作符重载operator 加等操作符重载operator 加号操作符重载operator- 减等操作符重载operator- 减法操作符重载 (日期 - 天数&am…

2023年第四季度硬盘容量强势增长9%

在2023年第四季度(CQ4 23),硬盘驱动器(HDD)市场的总容量出货量环比增长9%,达到214EB,而单位出货量保持在2900万块不变。其中,近线存储(Nearline)硬盘的容量出…

Java基于微信小程序的驾校报名小程序,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

JVM双亲委派机制

双亲委派模型是一种组织类加载器之间关系的一种规范,他的工作原理是:如果一个类加载器收到了类加载的请求,它不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,这样层层递进,最终所有的加载请求都被传到最顶层的启动类加载器中,只有当父类加载器无法完成这个加载…

基于SSM的实习管理系统(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的实习管理系统(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring Spri…

Verilog刷题笔记19

题目: A common source of errors: How to avoid making latches When designing circuits, you must think first in terms of circuits: I want this logic gate I want a combinational blob of logic that has these inputs and produces these outputs I want…

【高阶数据结构】B-树详解

文章目录 1. 常见的搜索结构2. 问题提出使用平衡二叉树搜索树的缺陷使用哈希表的缺陷 3. B-树的概念4. B-树的插入分析插入过程分析插入过程总结 5. B-树的代码实现5.1 B-树的结点设计5.2 B-树的查找5.3 B-树的插入实现InsertKey插入和分裂测试 6. B-树的删除(思想&…

使用WPS制作三线表

点击边框和底纹点击1、2、3、4并且应用于表格点击确定 再次选中表格点击右键表格属性选择边框和底纹 选中表格第一行右键点击表格属性选择边框和底纹 如果表格中存在虚线

【Linux开发工具】gcc/g++的使用

📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 目录 1.前言2.gcc/g使用方…

如何快速入门深度学习

深度学习是人工智能领域的一个重要分支,它模拟人脑的神经网络结构,通过大量的数据训练模型,使计算机能够自动学习和理解数据。深度学习在图像识别、语音识别、自然语言处理等领域取得了显著的成果。如果你想快速入门深度学习,可以…

【自动化测试】---Selenium+Java

1.自动化测试分类 接口自动化测试UI自动化测试(移动端自动化测试、Web端自动化测试) 2.选择Selenium作为web自动化工具原因(面试题) 开源免费支持多个浏览器支持多个系统支持多语言Selenium包提供很多供测试使用的API 3.自动化是什…

C++内存模型的内存布局

C内存模型的内存布局 什么是内存模型内存布局及作用C程序的内存布局 本文章介绍了C程序的内存布局,并附有一段演示 数据区和 栈区存储不同类型变量的代码示例。 什么是内存模型 在计算机科学中,程序的内存模型是指程序在内存中的组织结构和存储方式的抽…

编译原理实验2——自上而下语法分析LL1(包含去消除左递归、消除回溯)

文章目录 实验目的实现流程代码运行结果测试1(含公共因子)测试2(经典的ii*i文法,且含左递归)测试3(识别部分标识符) 总结 实验目的 实现自上而下分析的LL1语法分析器,给出分析过程 …

[C#] 如何使用ScottPlot.WPF在WPF桌面程序中绘制图表

什么是ScottPlot.WPF? ScottPlot.WPF 是一个开源的数据可视化库,用于在 WPF 应用程序中创建高品质的绘图和图表。它是基于 ScottPlot 库的 WPF 版本,提供了简单易用的 API,使开发人员能够通过简单的代码创建各种类型的图表&#…

2、6作业

TCP和UDP的区别 TCP和UDP都是通信协议 TCP提供有连接的,稳定的,无误码无失真无乱序无丢失的通信 UDP提供无连接的,尽力的,可能误码可能乱序,可能丢失的通信 TCP每发一个数据包就需要对方回应一个应答包&#xff0c…

自定义npm包从vue2升级到vue3遇到的问题解决

1.执行npm run build时报错: (node:16724) UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token ‘??’ at Loader.moduleStrategy (internal/modules/esm/translators.js:149:18 解决:更新node版本 查看了我使用的node版本是14.21.3&…

RocketMQ消息队列(二)—— Go语言操作RocketMQ

上篇文章《RocketMQ消息队列(一)—— 基本概念和消息类型》记录了RocketMQ的一些基本的概念,本文主要写几个go语言操作RocketMQ的示例代码 一、发送普通消息 import ("context""fmt""github.com/apache/rocketmq-…

jvm垃圾收集器特性描述

在Java虚拟机(JVM)中,垃圾回收器(Garbage Collector, GC)是自动管理内存的重要组成部分,其主要职责是识别和删除不再被使用的对象,以释放和回收内存资源。随着技术的发展,为了适应不…

《合成孔径雷达成像算法与实现》Figure6.10

clc clear close all参数设置 距离向参数设置 R_eta_c 20e3; % 景中心斜距 Tr 2.5e-6; % 发射脉冲时宽 Kr 20e12; % 距离向调频率 alpha_os_r 1.2; % 距离过采样率 Nrg 320; % 距离线采样数 距离向…

水题中的稀奇古怪trick合集

状态转移问题,一个状态的改变还会牵涉到此状态之前的状态时,很难利用简单的动态规划解决,可以考虑利用BFS队列优化,把更新过的状态存进队列中,队列空时停止 例题:2024牛客寒假集训2D-Tokitsukaze and Slash…