Nginx 配置记录-未完!

目的

Nginx和前端后端的关系都是密不可分的,但是它的配置又是很多的,我们有一些不常用的,所以我们要总结下来,这里我们提供一个样例,每次有新的配置,就先修改样例,让我们有迹可循,看着样例实地举例才可。

样例

http{server {listen 80;upstrem mgr{ip:port;}location / {proxy_pass http://mgr;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_http_version 1.1;proxy_redirect    off;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}
}
  • proxy_pass http://bsfitgateway-credit:表示将请求反向代理传递给 http://bsfitgateway-credit这个后端服务器

  • proxy_set_header Upgrade $http_upgrade:表示如果是upgrade的请求(下方有解释),如WebSocket,就将Upgrade头传递给后端服务器

  • proxy_set_header Connection “upgrade”: 同样表示将Connection头传递给后端服务器

  • proxy_http_version 1.1: 指定使用HTTP/1.1协议与后端服务器通信

  • proxy_redirect off:表示不需要重写Location和Refresh响应头。(详细解释看下面)

  • proxy_set_header X-Real-IP $remote_addr:将客户端真实IP传递给后端服务器,存入X-Real-IP头

  • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for:将客户端IP加入X-Forwarded-For头并传递给后端服务器

其中$remote_addr和$proxy_add_x_forwarded_for是Nginx的系统变量,分别表示客户端IP和记录了所有经过的客户端IP的X-Forwarded-For头值。

常见的Nginx系统变量还有:

参数名含义
$remote_addr客户端IP
$proxy_add_x_forwarded_for记录了所有经过的客户端IP的X-Forwarded-For头值。 下方详解
$http_upgrade表示请求是否为upgrade类型,如WebSocket
$upstream_addr后端服务器的IP地址和端口 ​
$upstream_status后端服务器返回的状态码
$request_method客户端请求方法,如GET、POST
$remote_port客户端端口
$remote_user客户端用户名,如果有进行认证
$scheme请求使用的协议,如http或https
$request_uri客户端原始请求的完整URI
$query_string请求中的参数字符串
$host请求头中的Host值
$server_port处理请求的服务器端口号
$server_name服务器名称,即nginx.conf中的server_name指令配置的值
$request_filename请求中的文件名,不带请求URI
$document_root与请求对应的根目录
$request_body请求的主体内容(body) ​
$content_type响应的Content-Type头字段值
$args请求中的参数,等同于$query_string
$content_length响应的Content-Length头字段值
$tcpinfo_rttTCP连接的往返时延
$pid工作进程的PID
$msec当前时间,单位为秒+毫秒 ​
$time_iso8601以ISO8601标准格式的当前时间
$nginx_versionnginx版本号 ​
$ssl_protocol如果为HTTPS,加密协议如TLSv1
$ssl_cipher如果为HTTPS,加密算法如AES128

​ 这些变量都可以获取各种请求、响应、服务器上下文信息,用于实现Nginx配置功能。

proxy_add_x_forwarded_for

在Nginx中,$proxy_add_x_forwarded_for是一个系统变量,它表示请求头中X-Forwarded-For字段的值。

X-Forwarded-For请求头用来表示代理或者负载均衡后面的客户端原始IP地址。

当请求通过多个代理或者负载均衡服务器时,每个服务器都会将自己收到的来源IP地址添加到X-Forwarded-For头信息中,格式如下:

X-Forwarded-For: client_ip, proxy_1_ip, proxy_2_ip

Nginx upstream模块会自动将来自客户端的IP地址追加到X-Forwarded-For头中。

$proxy_add_x_forwarded_for变量的值就是这个完整的X-Forwarded-For头字段的值。

remote_addr 和 proxy_add_x_forwarded_for的区别

$remote_addr:只包含客户端与Nginx直接建立连接时的IP,而不是经过代理或负载均衡后的IP

区别是:

  • $remote_addr - 直接连接的客户端IP
  • $proxy_add_x_forwarded_for - 通过代理或负载均衡后的原始客户端IP

如果没有使用代理或负载均衡,$remote_addr 和 $proxy_add_x_forwarded_for返回相同的值。

如果使用了代理或负载均衡,$proxy_add_x_forwarded_for包含原始客户端IP,而$remote_addr只包含代理服务器的IP。

$remote_addr通常用于访问控制、日志、统计等需要客户端真实IP的场景。也可以与proxy_set_header配合传递给上游服务器。

所以简单来说:

  • $remote_addr代表直接连接客户端的IP地址
  • $proxy_add_x_forwarded_for代表经过代理后的原始客户端IP地址。

upgrade 请求说明

upgrade请求是指客户端或服务器试图将与HTTP不同的其他协议用于通信的请求。

其中最常见的就是WebSocket(Web套接字)。WebSocket使用HTTP进行初始握手,但之后升级为WebSocket协议用于长连接的双向通信。

具体来说,upgrade请求必须发送Upgrade头字段表示要升级协议,并在Connection头字段中包含"upgrade"表示这是一个升级请求。

例如:

GET /chat HTTP/1.1

Host: example.com

Upgrade: websocket

Connection: Upgrade

服务器如果同意升级,会返回:

HTTP/1.1 101 Switching Protocols

Upgrade: websocket

Connection: Upgrade

之后通信就会切换到WebSocket协议。

除了WebSocket,upgrade还可以用于升级到其他应用层协议,如实现流媒体传输等。需要客户端和服务器都支持该协议。

在Nginx中,proxy_set_header Upgradeproxy_set_header Connection "upgrade"用于将upgrade请求透传给后端服务器,以实现协议的升级。

proxy_redirect 详解

proxy_redirect指令用于修改后端服务器响应中的Location、Refresh等重定向头字段

当Nginx进行反向代理时,后端服务器返回的重定向LOCATION可能是后端服务器的内部地址,而非可访问的外部地址。proxy_redirect可以重写这些地址,使重定向到外部可访问的地址。

例如:

上游服务器返回的LOCATION: http://internal.example.com/path 这是后端服务器的地址

可以用proxy_redirect重写为:

proxy_redirect http://internal.example.com/ http://external.example.com/ 后者是外部可以访问的地址

那么LOCATION会被重写为:http://external.example.com/path

这样就可以将后端服务器返回的内部域名重定向到外部可访问域名上。

proxy_redirect 默认为off,表示不重写。

可以通过正则表达式进行复杂重写:

proxy_redirect ~^(http://[^:]+):\d+(/.*)$ $1$2;

这个例子表示去掉内部重定向URL中的端口号。

proxy_redirect也可以设置为默认参数,表示重写为nginx.conf中设置的代理传递的服务器名称:

proxy_redirect default;

如果代理传递的是http://example.com,那么重定向会直接改写为这个域名。

注意

注意的是,proxy_redirect只会修改重定向的头部,而不会修改内容中的URL。

主要应用场景

  • 后端服务器内部使用私有域名,需要重定向到公网域名
  • 部署时后端服务器域名变更,但不方便修改后端配置
  • 需要将流量引导到外部特定域名
  • 后端服务器域名不稳定,需要灵活调整

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

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

相关文章

使用spring自带的发布订阅来实现发布订阅

背景 公司的项目以前代码里面有存在使用spring自带发布订阅的代码,因此稍微学习一下如何使用,并了解一下这种实现方式的优缺点。 优点 实现方便,代码方面基本只需要定义消息体和消费者,适用于小型应用程序。不依赖外部中间件&a…

1992-2022年全国31省市产业升级、产业结构高级化水平面板数据(含原始数据和计算过程)

1992-2022年全国31省市产业升级、产业结构高级化水平面板数据(含原始数据和计算过程) 1、时间:1992-2022年 2、指标:地区生产总值、第一产业增加值、第二产业增加值、第三产业增加值、第一产业占GDP比重、第二产业占GDP比重、第…

windows下docker compose方式挂载数据卷volume遇到的问题

例子一,windows 下docker desk top部署TDengine td-compose.yml version: 3 services:tdengine1:image: tdengine/tdengine:latestcontainer_name: tdengine1hostname: tdengine1ports:- 6030:6030- 6041:6041- 6043-6049:6043-6049- 6043-6049:6043-6049/udpresta…

Excel·VBA二维数组组合函数、组合求和

目录 1,二维数组组合函数举例 2,组合求和 之前的文章《ExcelVBA数组组合函数、组合求和》和《ExcelVBA数组排列函数》,都是针对一维数组的组合和排列 二维数组组合:对一个m行*n列的二维数组,每行抽取1个元素进行组合&a…

java.nio.ByteBuffer 学习笔记

目录 java 重复使用bytebuffer例子: java验证flip函数: flip讲解 以下内容转自: java.nio.ByteBuffer java 重复使用bytebuffer例子: import java.nio.ByteBuffer;public class ByteBufferExample {public static void main…

PyCharm切换虚拟环境

PyCharm切换虚拟环境 为了满足不同任务需要不同版本的包,可以在Anaconda或者Miniconda创建多个虚拟环境文件夹,并在PyCharm下切换虚拟环境。 解决方案 1、打开Ananconda Prompt 2、创建自己的虚拟环境 格式:conda create -n 虚拟环境名字…

部署你自己的导航站-dashy

现在每天要访问的网页都太多了,尽管chrome非常好用,有强大的标签系统。但是总觉的少了点什么。 今天我就来分享一个开源的导航网站系统 dashy。这是一个国外的大佬的开源项目 github地址如下:https://github.com/Lissy93/dashy 来简单说一下…

数据结构--树4.2.4(树、森林即二叉树的相互转换(仅供参考))

目录 一、树转换成二叉树步骤 二、森林转换成二叉树 三、二叉树到树、森林的转换 一、树转换成二叉树步骤 分两个步骤: 1、在树中所有的兄弟结点之间加一连线。 2、对每个结点,除了保留与其长子(最左边)的连线外,去…

机器学习和数据挖掘02-Gaussian Naive Bayes

概念 贝叶斯定理: 贝叶斯定理是概率中的基本定理,描述了如何根据更多证据或信息更新假设的概率。在分类的上下文中,它用于计算给定特征集的类别的后验概率。 特征独立性假设: 高斯朴素贝叶斯中的“朴素”假设是,给定…

西北大学计算机考研844经验分享(初试科目844-详细复习方法)

个人介绍 ​ 我本科就读于西安某双非一本计算机科学与技术专业,在2022年进行了半年的考研复习,从2022年6月开始陆陆续续复习,复习6个多月,上岸西北大学软件工程专业研究生,专业课分数129分。在读研一年来,…

android studio安装教程

1、android studio 下载 下载网址:Download Android Studio & App Tools - Android Developers 2、开始安装 因为不需要每次连接手机进行调试,android studio给我们提供了模拟器调试环境。 一般选择自定义安装,这样可选sdk以及下载路径…

安全移动设备TEE认证

安全之安全(security)博客目录导读 TEE之GP(Global Platform)认证汇总 目录

Rust 的四大类型的宏 (元编程)

文章目录 概念函数宏或声明宏(Function Macro)过程宏(Procedural Macro)类函数的过程宏(Function-like-procedural-macros)派生宏(Derive Macro)派生宏附加其他属性 属性宏&#xff…

@Async引发的循环依赖问题

这个以前分析过了,但是再看的时候感觉写的太乱了(流水账),这个是精简版本。 bug复现 先上bug,众所周知,spring通过实例化和属性注入分开解决了循环依赖,理论上也不会有问题。但是意外就那么来了,经过排查是…

CI/CD 持续集成 持续交付

CI(Continuous integration)持续集成 参考:https://www.jianshu.com/p/2132949ff84a 持续集成是指多名开发者在开发不同功能代码的过程当中,可以频繁的将代码行合并到一起并切相互不影响工作。 持续集成的目的,是让…

操作符算数转换题

目录 1.交换两个变量(不创建临时变量) 2.统计二进制中1的个数 3.打印整数二进制的奇数位和偶数位 4.求两个数二进制中不同位的个数 5.【一维数组】有序序列合并 6.获得月份天数 7.变种水仙花数 8.选择题总结tips 这篇博文主要分享操作符&算…

ChatGPT:引领人机交互的未来

前言 在信息技术飞速发展的时代,人机交互的方式也在不断演进。技术对人们生活和工作的影响。本文将带您深入探讨一款引领人机交互未来的人工智能模型——ChatGPT。 ChatGPT简介 ChatGPT 是一种由开放AI(OpenAI)开发的人工智能模型&#xf…

WIndows 配置多版本python环境,非常清晰明了

配置多个python环境 下面以配置三个python版本环境为例子 首先下载好三个环境的python,如:python2.7、python3.6、python3.10 给个官网链接自己下,想要几版本就下几:https://www.python.org/downloads/windows/ 下载完成后将pyth…

C语言控制语句——跳转关键字

循环和switch专属的跳转:break循环专属的跳转:continue无条件跳转:goto break 循环的break说明 某一条件满足时,不再执行循环体中后续重复的代码,并退出循环 需求:一共吃5碗饭, 吃到第3碗吃饱了, 结束吃饭…

Apache SeaTunnel 2.3.3 版本发布,CDC 支持 Schema Evolution!

时隔两个月, Apache SeaTunnel 终于迎来大版本更新。此次发布的 2.3.3 版本在功能和性能上均有较大优化改进,其中大家期待已久的 CDC Schema evolution(DDL 变更同步)、主键 Split 拆分、JDBC Sink 自动建表功能、SeaTunnel Zeta …