用HTTP proxy module配置一个简单反向代理服务器

news2024/11/24 23:07:34

预备知识

反向代理

反向代理(reverse proxy)方式是指用代理服务器来接受 Internet 上的连接请求,然后将
请求转发给内部网络中的上游服务器,并将从上游服务器上得到的结果返回给 Internet 上请求
连接的客户端,此时代理服务器对外的表现就是一个 Web 服务器。充当反向代理服务器也是
Nginx的一种常见用法(反向代理服务器必须能够处理大量并发请求)
由于Nginx具有“强悍”的高并发高负载能力,因此一般会作为前端的服务器直接向客户提供静态文件服务。但也有一些复杂、多变的业务不适合放到Nginx服务器上,这时会用pache、Tomcat等服务器来处理。于是,Nginx通常会被配置为既是静态Web服务器也是反向理服务器,不适合Nginx处理的请求就会直接转发到上游服务器中处理。
图片:

 

当客户端发来 HTTP 请求时, Nginx 并不会立刻转发到上游服务器,而是先把用户的请求
(包括 HTTP 包体)完整地接收到 Nginx所在服务器的硬盘或者内存中,然后再向上游服务器
发起连接,把缓存的客户端请求转发到上游服务器。

 

 

Nginx 的这种工作方式为什么会降低上游服务器的负载呢?
通常,客户端与代理服务器 之间的网络环境会比较复杂,多半是“ 公网,网速平均下来可能较慢,因此,一个请求可 能要持续很久才能完成。而代理服务器与上游服务器之间一般是“ 内网,或者有专线连 接,传输速度较快

ip_hash

在有些场景下,我们可能会希望来自某一个用户的请求始终落到固定的一台上游服务器
。例如,假设上游服务器会缓存一些信息,如果同一个用户的请求任意地转发到集群中的
任一台上游服务器中,那么每一台上游服务器都有可能会缓存同一份信息,这既会造成资源
的浪费,也会难以有效地管理缓存信息。 ip_hash 就是用以解决上述问题的,它首先根据客户
端的 IP 地址计算出一个 key ,将 key 按照 upstream 集群里的上游服务器数量进行取模,然后以取
模后的结果把请求转发到相应的上游服务器中。这样就确保了同一个客户端的请求只会转发
到指定的上游服务器中

负载均衡的基本配置

1upstream


语法: upstream name{...}
配置块: http

 upstream块定义了一个上游服务器的集群,便于反向代理中的proxy_pass使用

upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
location / {
proxy_pass http://backend;
      }
}

(2)server

语法: server name[parameters];
配置块: upstream
server 配置项指定了一台上游服务器的名字:
参数解析:
weight=number:设置向这台上游服务器转发的权重,默认为1。
max_fails=number:该选项与fail_timeout配合使用,指在fail_timeout时间段内,如果向
当前的上游服务器转发失败次数超过number,则认为在当前的fail_timeout时间段内这台上游
服务器不可用。max_fails默认为1,如果设置为0,则表示不检查失败次数
fail_timeout=time:fail_timeout表示该时间段内转发失败多少次后就认为上游服务器暂
时不可用,用于优化反向代理功能。它与向上游服务器建立连接的超时时间、读取上游服务
器的响应超时时间等完全无关。fail_timeout默认为10秒
down: 表示所在的上游服务器永久下线,只在使用ip_hash配置项时才有用。
backup:在使用ip_hash配置项时它是无效的。它表示所在的上游服务器只是备份服务
器,只有在所有的非备份上游服务器都失效后,才会向所在的上游服务器转发请求

(3)ip_hash

语法: ip_hash;
配置块  upstream
ip_hash weight (权重)配置不可同时使用。如果 upstream 集群中有一台上游服务器暂
时不可用,不能直接删除该配置,而是要 down 参数标识,确保转发策略的一贯性。例如
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
server backend4.example.com;
}

4)记录日志时支持的变量

如果需要将负载均衡时的一些信息记录到 access_log 日志中,那么在定义日志格式时可
以使用负载均衡功能提供的变量
变量名意义
$upstream_addr处理请求的上游服务器地址
$upstream_cache_statues表示是否命中缓存,取值范围:MISS、EXPIRED、UPDATING、STALE、HIT
$upstream_statues上游服务器返回的响应中的HTTP响应码
$upstream_response_time上游服务器的响应时间,精度到毫秒
$upstream_http_$HEADERHTTP的头部,如upstream http host

反向代理的基本配置

1proxy_pass

语法: proxy_pass URL;
配置块: location、if
此配置项将当前请求反向代理到 URL 参数指定的服务器上, URL 可以是主机名或 IP 地址
加端口的形式,例如:
proxy_pass http://localhost:8000/uri/
也可以是 UNIX 句柄:
proxy_pass http://unix:/path/to/backend.socket:/uri/
还可以如上节负载均衡中所示,直接使用 upstream
upstream backend {
…
}
server {
location / {
proxy_pass http://backend
;
}
}

(2)proxy_method

语法: proxy_method method;
配置块: http、server、location
此配置项表示转发时的协议方法名。例如设置为:
proxy_method POST;

(3)proxy_hide_head

语法: proxy_hide_header the_header;
配置块: http、server、location

Nginx会将上游服务器的响应转发给客户端,但默认不会转发以下HTTP头部字段:Date、ServerX-Pad和X-Accel-* 

使用 proxy_hide_header 后可以任意地指定哪些 HTTP 头部
字段不能被转发。例如:
proxy_hide_header Cache-Control;
proxy_hide_header MicrosoftOfficeWebServer;

4)proxy_pass_header


语法: proxy_pass_header the_header;
配置块: http、server、location
proxy_hide_header 功能相反, proxy_pass_header 会将原来禁止转发的 header 设置为允许
转发

(5)proxy_pass_request_body proxy_pass_request_headers

语法: proxy_pass_request_body on|off;
默认: proxy_pass_request_body on;
配置块: http、server、location

语法: proxy_pass_request_headers on|off;
默认: proxy_pass_request_headers on;
配置块: http、server、location

作用为确定是否转发HTTP头部和包体

(6)proxy_redirect

语法: proxy_redirect[default|off|redirect replacement];
默认: proxy_redirect default;
配置块: http、server、location
当上游服务器返回的响应是重定向或刷新请求(如 HTTP 响应码是 301 或者 302 )时,
proxy_redirect 可以重设 HTTP 头部的 location refresh 字段
例如,如果上游服务器发出的响
应是 302 重定向请求, location 字段的 URI http://localhost:8000/two/some/uri/ ,那么在下面的
配置情况下,实际转发给客户端的 location http://frontend one some/uri/
proxy_redirect http://localhost:8000/two/
http://frontendone;
这里还可以使用 ngx-http-core-module 提供的变量来设置新的 location 字段。例如
proxy_redirect http://localhost:8000/
http://$host:$server_port/;
也可以省略 replacement 参数中的主机名部分,这时会用虚拟主机名称来填充
proxy_redirect http://localhost:8000/two/one
使用默认的 default 参数时,会按照 proxy_pass 配置项和所属的 location 配置项重组发往客
户端的 location 头部。例如,下面两种配置效果是一样的
ocation one {
proxy_pass http://upstream:port/two/
;
proxy_redirect default;

}
location one {
proxy_pass http://upstream:port/two/
;
proxy_redirect http://upstream:port/two/one
;
}

(7)proxy_next_upstream

proxy_next_upstream[error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off];
默认: proxy_next_upstream error timeout;
此配置项表示当向一台上游服务器转发请求出现错误时,继续换一台上游服务器处理这
个请求。前面已经说过,上游服务器一旦开始发送应答, Nginx 反向代理服务器会立刻把应
答包转发给客户端。因此,一旦 Nginx 开始向客户端发送响应包,之后的过程中若出现错误
也是不允许换下一台上游服务器继续处理的。这很好理解,这样才可以更好地保证客户端只
收到来自一个上游服务器的应答。 proxy_next_upstream 的参数用来说明在哪些情况下会继续
选择下一台上游服务器转发请求
·error:当向上游服务器发起连接、发送请求、读取响应时出错。
·timeout:发送请求或读取响应时发生超时。
·invalid_header:上游服务器发送的响应是不合法的。
·http_500:上游服务器返回的HTTP响应码是500。
·http_502:上游服务器返回的HTTP响应码是502。
·http_503:上游服务器返回的HTTP响应码是503。
·http_504:上游服务器返回的HTTP响应码是504。
·http_404:上游服务器返回的HTTP响应码是404。
·off:关闭proxy_next_upstream功能—出错就选择另一台上游服务器再次转发

参考:
http://wiki.nginx.org/Modules

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

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

相关文章

自定义表单、自定义流程、自定义页面、自定义报表应用开发平台

真正的大师,永远都怀着一颗学徒的心! 一、项目简介 Java开发框架,自定义表单、自定义页面、自定义流程、自定义报表应用开发平台 二、实现功能 支持系统文件在线管理 支持代码在线编辑 支持URL 路由 支持黑白名单 支持定时任务 支持在线监控 支持…

Java+JSP+MySQL基于SSM的会议交接平台的设计与实现-计算机毕业设计

项目介绍 随着社会竞争压力的不断加强,企事业单位内部的会议都在不断的增加,有效的会议可以提高企事业内部的沟通,更好的做出符合战略目标的决策,但是传统的会议交接有一定的问题存在,首先就是必须面对面进行传达&…

突破卡脖子技术 AVS3标准在世界杯实现移动端规模化商用

11月25日,在2022卡塔尔世界杯B组第二轮比赛中,亚洲球队又一次脱颖而出,伊朗连进2球,2:0战胜威尔士,双方鏖战至最后时刻,奉上了一场精彩的比赛。 作为2022卡塔尔世界杯持权转播商,中国移动咪咕上线“睛彩视界”独家视角,通过国家自主的AVS3、Audio Vivid编解码标准为用户带来“…

基于51单片机智能IC卡燃气表控制(仿真+源程序+全套资料)

资料编号:199 功能介绍: 采用51单片机作为主控CPU,使用按键进行模拟冲卡(模拟缴费冲卡),通过按键来控制当前是否使用燃气,并且LCD1602实时显示当前燃气可用量剩余多少,当燃气不足时…

ARM-A架构入门基础(三)MMU

14天学习训练营导师课程:周贺贺《ARMv8/ARMv9架构-快速入门》 1. MMU(Memory Management Unit) 内存管理单元,MMU的意义在于将软件程序的虚拟地址转换为真实的物理地址。 2. MMU种类 Secure EL1&0 translation regime, wh…

基于约束关系的图表设计

标准的基于 GUI 的图形设计工具仅支持有限的“对齐向导”风格的定位,具有基本的对象分组系统,并实现对齐或分布对象的原始功能。这些工具没有办法记住对象之间的约束和关系,也没有办法定义和重用抽象。我一直不满意现有的设计工具&#xff0c…

[附源码]Python计算机毕业设计Django二次元信息分享平台的设计及实现

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,我…

短视频不知道怎么定位?教你三个自我商业定位的方法,收藏学习

上一篇内容是我在我赢助手小禾呈序上讲了哪几类产品更适合私域变现,当然我相信有很多做抖音但没想好怎么变现的对吧? 如果说你还停留在我也不知道我可以靠什么赚钱这样的一个状态当中。那我给你三个自我商业定位的方法。 第一个方法,从工作上…

虹科Pico汽车示波器学院 | 第二课直播精彩回顾

直播精彩回顾(11.19) 第二课主题:《为什么使用示波器,可加速技师的技术水平提升?》 11月19日,虹科Pico汽车示波器学院第二课成功开课。第二课中,戈老师向学员们讲解了: 汽车示波器…

【网安神器篇】——LaZagne凭证收集工具

作者名:Demo不是emo 主页面链接:主页传送门 创作初心:舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷座…

144.二叉树的前序遍历 递归 | 94.二叉树的中序遍历 递归 |145.二叉树的后序遍历 递归

144.二叉树的前序遍历 题目 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 输入:root [1,null,2,3] 输出:[1,2,3]示例 2: 输入:root [] 输出:[]示例 3: 输入:root …

11月动态|通过PWmat计算的离子浓度自由能相关文献发表在JCTC

11月 11月,龙讯旷腾完成Q-Flow和Q-Studio新版本的升级,完成了40余项功能的更新和上线;签约并行科技在高性能计算领域再下一城;汪林望博士受海河实验室邀请作线上主题报告;通过PWmat计算的离子浓度自由能相关文献发表在…

Unity笔记(15):OnTriggerEnter2D [2D]

1、给玩家标签设为Player 2、给碰撞的物体增加碰撞盒,并勾选isTrigger 3、编写脚本挂载到物体上 实现碰撞后物体会消失。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class luobo : MonoBehaviour {private void OnT…

LeetCode-50-Pow(x, n)

1、递归 我们最简单的思路就是使用递归,每次就让x乘上Pow(x, n-1)的值。但是这样做的缺点在于递归时间过长会导致超时,因此我们可以使用快速幂进行优化。 快速幂的思想在于我们在求x的N次幂时,不使用x∗xN−1x*x^{N-1}x∗xN−1,…

访问工具--

下载地址: Releases Fndroid/clash_for_windows_pkg GitHub https://github.com/Fndroid/clash_for_windows_pkg/releases 安装好clash后,可以通过订阅链接或者导入yaml文件使用: 1、订阅链接 2、导入yaml文件 报错排查 你可能会遇到报错could not switch to this…

硬件学习路线调研

学习路线 《Verilog传奇》、《Verilog HDL高级数字设计》或者是《用于逻辑综合的VHDL》。不看书也能写出个三段式状态机就可以进入下一阶段了。 此外,你手上必须准备Verilog或者VHDL的官方文档,《verilog_IEEE官方标准手册-2005_IEEE_P1364》、《IEEE …

Hive分区表数据压缩

Hive分区表数据压缩 1.背景 目前公司的Hive分区表采用的TextFile格式存储,占用的存储空间较大,考虑到存储成本,需要对存储的历史数据进行压缩。 2.压缩格式选择 2.1 snappy压缩 优点:高速压缩速度和合理的压缩率;…

java - 数据结构,顺序表

1、顺序表和链表都属于数据结构的一部分。 2、数据结构:C的数据结构和JAVA的数据结构有什么不一样啊? 数据结构只是一个单独的学科,和语言没有关系。 用不同的语言实现一样的逻辑。 一、线性表 线性表(linear list)是n个具有相同特性的数据…

如何使用远程Linux虚拟机的图形界面

博客主页:https://tomcat.blog.csdn.net 博主昵称:农民工老王 主要领域:Java、Linux、K8S 期待大家的关注💖点赞👍收藏⭐留言💬 目录VMware Workstation ProSmarTTY在工作过程中,有时需要操作远…

微机----------LED显示接口

目录 LED显示器的工作原理采用专用芯片进行LED段译码软件译码法静态显示与动态显示LED显示器的工作原理 LED显示器的主要部分是七段发光管,这七段发光段分别称为a、b、c、d、e、f、g有的产品还附带有一个小数点DP。通过7个发光段的组合,可以显示0 ~ 9 和 A ~ F共16个字母数字…