nginx_http_proxy,upstream,stream模块简析

2023-11-08

一. ngx_http_proxy_module模块:

        模块功能: 为后端httpd服务做反向代理, 并且与Httpd 之间使用http进行通信

      1、proxy_pass URL;

         Context: location, if in location, limit_except

        

        当root 与proxy_pass 同时存在是,proxy 优先级更高

    ——————————————————————————————

         A:注意:proxy_pass后面的路径不带uri时,其会将location的uri传递(添加到结尾) \

        给后端主机;

        

         server {

         …

         server_name HOSTNAME;

         location /uri/ {

         proxy_pass http://hos[:port];   #即此处结尾无"/"

         }

         …

         }

        

         访问时候: http://HOSTNAME/uri –> http://host/uri   #补充

        

         B:  proxy_pass后面的路径是一个uri时,其会将location的uri替换为proxy_pass的uri,

        即new_uri;

        

         server {

         …

         server_name HOSTNAME;

         location /uri/ {

         proxy_pass http://host/new_uri/;

         }

         …

         }

        

         http://HOSTNAME/uri/ –> http://host/new_uri/  #替换

        

         C:  如果location定义其uri时使用了正则表达式的模式,则proxy_pass之后必须不能使用

        uri; 用户请求时传递的uri将直接附加代理到的服务的之后;

        

         server {

         …

         server_name HOSTNAME;

         location ~|~* /uri/ {

         proxy_pass http://host;

         }

         …

         }

        

         http://HOSTNAME/uri/ –> http://host/uri/;

    ————————————————————————————

        =========================================================

        使用示例:(备注:此处仅为单台httpd 服务器代理)

        1.   在前端nginx 调度器配置中,修改/etc/nginx/nginx.conf:

         添加 proxy_pass http://ip; 即可

        

wKiom1gUi5qDicezAAAu8fHQGpc970.png-wh_50

        示例2.

        当访问 http://10.1.249.143 时,为nginx本地web服务,

        访问 http:// 10.1.249.143/admin 时,则代理到后端的服务器

        

wKioL1gUi5rjrU7gAAAg4Pbvlbg067.png-wh_50

         =======================================================

      2、proxy_set_header field value;

         作用: 设定发往后端主机的请求报文的请求首部的值;

        允许使用自定义的 首部信息;

        Context: http, server, location

         补充:

        前端的nginx代理,可以捕获客户端发送来的请求报文首部,并

        保存为$proxy_add_x_forwarded_for, 此值可以传递给后续的代理服务器

        eg:

         proxy_set_header X-Real-IP  $remote_addr;

        #将请求的客户端远程地址传送给后端服务器

        

wKiom1gUi53ykED8AAD3_df8JmI227.png-wh_50

        此时需要修改一下后端httpd 服务器的日志格式,以便可以直观的看到效果:

        修改/etc/httpd/conf/httpd.conf

        LogFormat 中的combined项,在前面的%h 修改为%{X-Real-IP}i

        

wKioL1gUi6Kgoc6rAADWwTTecwo896.png-wh_50

        

wKiom1gUi6WxI9GbAABPrH3C2_4194.png-wh_50

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    

          

wKiom1gUi7OR9PcZAAA7OM20aOA471.png-wh_50

        ================================================================

    

    3、proxy_cache_path

         定义可用于proxy功能的缓存;

           Context: http

    

     proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size]     [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time]     [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];

    

     4、proxy_cache zone | off;

         指明要调用的缓存,或关闭缓存机制;

        Context: http, server, location

        

     5、 proxy_cache_key string;

         #指明缓存中用于“键”的指定内容;

        

         默认值:proxy_cache_key $scheme$proxy_host$request_uri;

           #若希望公用缓存,则只是用$request_uri

     6、proxy_cache_valid [code …] time;

         #定义对特定响应码的响应内容的缓存时长;

         #若想全局生效,可以在server中定义,若希望局部uri生效,则在location中定义

         定义在http{…}中;

        eg:

         proxy_cache_path /var/cache/nginx/proxy_cache levels=1:1:1 keys_zone=pxycache:20m max_size=1g;

         #注意,缓存的目录需要事先创建

         定义在需要调用缓存功能的配置段,例如server{…};

         proxy_cache pxycache;

         proxy_cache_key $request_uri;

         proxy_cache_valid 200 302 301 1h;

         proxy_cache_valid any 1m;

    

wKioL1gUi8iBaewiAAFIXln-fuY210.png-wh_50

    

     7、proxy_cache_use_stale

         #指定缓存服务器与后端服务器无法通信时,

        何种情况下依旧使用过期的缓存内容来响应客户端

         proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 |

        http_502 | http_503 | http_504 | http_403 | http_404 | off …;

        

         Determines in which cases a stale cached response can be used when an error

        occurs during communication with the proxied server.

    

     8、proxy_cache_methods GET | HEAD | POST …;

    #定义允许使用缓存的请求方法

     If the client request method is listed in this directive then the response will be cached. “GET” and “HEAD” methods are     always added to the list, though it is recommended to specify them explicitly.

    

     9、proxy_hide_header field;

    #定义需要隐藏的响应报文首部

     By default, nginx does not pass the header fields “Date”, “Server”, “X-Pad”, and “X-Accel-…” from the response of     a proxied server to a client. The proxy_hide_header directive sets additional fields that will not be passed.

     一般nginx反向代理会配置很多站点,每个站点配置费时费力而且少有遗漏,主机信息还是会被泄露的。根据上面的说明,我们将        

                proxy_hide_header 配置在http区段

    注意: 部分header 信息无法用此方法,如关闭server信息,需要用此方式:

    Syntax:server_tokens on | off | string;

    Default:server_tokens on;

    Context:http, server, location;

     10、proxy_connect_timeout time;

    #代理服务器与后端服务器连接的超时时长

     Defines a timeout for establishing a connection with a proxied server. It should be

    noted that this timeout cannot usually exceed 75 seconds.

    

     默认为60s;,最大不超过75s

    

    ———————————————————————————————二 . buffer相关的配置;

 二. ngx_http_headers_module模块

     The ngx_http_headers_module module allows adding the “Expires” and “Cache-Control” header fields, and arbitrary fields,     to a response header.

    

     模块功能:向由代理服务器响应给客户端的响应报文添加自定义首部,或修改指定首部的值;

    

     1、add_header name value [always];

         添加自定义首部;

        

        eg:

         add_header X-Via  $server_addr;    $ 添加代理服务器地址

        

          

wKioL1gUi8jBA4ygAAAdNGLifm0432.png-wh_50

        效果示例:  请求页面后, 在浏览器调试控制台中可看到代理服务器信息

        

wKiom1gUi8qQ9JiCAABYtqKq8F0468.png-wh_50

         add_header X-Accel $server_name;

        

     2、expires [modified] time;

         expires epoch | max | off;

         给出的日期/时间后,被响应认为是过时。如Expires:Thu, 02 Apr 2009 05:14:08

        GMT需和Last-Modified结合使用。用于控制请求文件的有效时间,当请求数据在有效期

        内时客户端浏览器从缓存请求数据而不是服务器端

        .当缓存中数据失效或过期,才决定从服务器更新数据。

         用于定义Expire或Cache-Control首部的值;

         =========================================================

  三. ngx_http_upstream_module模块

     The ngx_http_upstream_module module is used to define groups of servers that can be referenced by the proxy_pass,     fastcgi_pass, uwsgi_pass, scgi_pass, and memcached_pass directives.

     模块功能: 用于实现后端服务器的负载均衡, 使用该模块来定义后端服务器组

    定义以后,需要在使用的地方进行调用,即可实现负载均衡;

     1、upstream name { … }

         # 定义后端服务器组,会引入一个新的上下文;Context: http

        

         eg:

             upstream httpd_srvs {

             server 192.168.0.1

            #注意: server 后面只需要添加地址即可!

             server  192.168.0.2

             …

             }

            

           

    

wKioL1gUi8yg8gR6AAD2amVjZP0026.png-wh_50

     2、server address [parameters];

         在upstream上下文中server成员,以及相关的参数;

        Context: upstream

        

         address的表示格式:

         unix:/PATH/TO/SOME_SOCK_FILE

         IP[:PORT]

         HOSTNAME[:PORT]

        

         parameters:

         weight=number

         权重,默认为1;

         max_fails=number

         失败尝试最大次数;超出此处指定的次数时,server将被标记为不可用;

         fail_timeout=time

         设置将服务器标记为不可用状态的超时时长;

         max_conns

         当前的服务器的允许的最大并发连接数;

         backup

         将服务器标记为“备用”,即所有服务器均不可用时此服务器才启用;

         down

         标记为“不可用”;

         eg:

        upstream httpd_srvs {

         server 192.168.0.1 down ;

        #定义服务器为下线状态;

        server  192.168.0.2 backup;

        #定义为备用服务器

         server  192.168.0.3 weight 2 max_conns 100;

        #权重为2,最发并发为100

         }

    

     3、least_conn;

        Context: upstream

         最少连接调度算法,当server拥有不同的权重时其为wlc;

        

     4、 ip_hash;

        Context: upstream

         源地址hash调度方法;

         使用示例:

        

wKiom1gUi83Q8ft4AABBV8OOnMo239.png-wh_50

     5、hash key [consistent];

        Context: upstream

        If the consistent parameter is specified the ketama consistent hashing

        method will be used instead.

        #[consistent]; 使用一致性哈希算法, 建议开启此项

         基于指定的key的hash表来实现对请求的调度,此处的key可以直接文本、

        变量或二者的组合;

        

wKiom1gUi8-gpeNHAABkgGYEPOA489.png-wh_50

        作用:将请求分类,同一类请求将发往同一个upstream server;

    

    

         示例:

         hash $request_uri consistent;

         hash $remote_addr;

        

    

     6、keepalive connections;

        补充: 由于短连接消耗前端代理服务器的资源现象严重,因此会将一部分连接定义为

        长连接以节省资源

         #为每个worker进程保留的空闲的长连接数量;

         #定义nginx与后端服务器的保持连接的数量

    

wKioL1gUi9CSQAaPAAApHgtgM_0009.png-wh_50

    ============================================================

  四 . ngx_stream_core_module模块

     模拟反代基于tcp或udp的服务连接,即工作于传输层的反代或调度器;

     #此模块可以定义非http服务的反代功能

     1、stream { … }

         定义stream相关的服务;

        Context:main

         #用法与upstream 类似

        eg: #反代ssh 服务

         stream {

         upstream sshsrvs {

         server 192.168.22.2:22;

         server 192.168.22.3:22;

         least_conn;

         }

        #定义服务器组

         server {

         listen 10.1.0.6:22022;

         proxy_pass sshsrvs;

        #调用sshsrvs服务器组

         }

         # 前端监听22022端口,并反代到后端服务器组的22端口

         }

     2、listen

     listen address:port [ssl] [udp] [proxy_protocol] [backlog=number] [bind] [ipv6only=on|off] [reuseport]     [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];

    

  

    

     思考:

     (1) 动态资源存储一组服务器、图片资源存在一组服务器、静态的文本类资源存储在一组服

    务器;如何分别调度?

     (2) 动态资源基于fastcgi或http协议(ap)?

     lnamp

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nginx_http_proxy,upstream,stream模块简析 的相关文章

  • 在测试环境 (Mac OS X) 中模拟较差的带宽?

    我们有一个定制的 Flash HTML5 视频播放器供我们网站上的用户使用 我目前正在为带宽 次优 的用户充实体验 基本上我们希望客户端代码能够检测到由于过度缓冲而导致的不良用户体验 我想在我的本地开发环境中测试这个 带宽不足 处理代码 有
  • REtful POST :要写入流的字节超过指定的 Content-Length 字节大小

    抛出此错误 Bytes to be written to the stream exceed the Content Length bytes size specified 当我运行以下代码时 var request HttpWebRequ
  • Meteor - 自动发起客户端登录

    我有一个 Meteor 应用程序 我使用 nginx 和内部 SSO 服务进行身份验证 我能够成功地完成此操作 并在服务器 Meteor onConnection 方法上的 nginx 设置 http 标头中检索用户详细信息 此时 我不确定
  • 创建流而无需从中创建物理文件

    我需要创建一个包含服务器上存在的文档的 zip 文件 我使用 Net Package 类来执行此操作 并创建一个新的 Package 即 zip 文件 我必须具有物理文件或流的路径 我试图不创建一个实际的 zip 文件 而是创建一个存在于内
  • 您能解释一下流的概念吗?

    我知道流是字节序列的表示 每个流都提供了向其给定的后备存储读取和写入字节的方法 但流的意义何在 为什么我们与之交互的不是后备存储本身 不管出于什么原因 这个概念并不适合我 我读过很多文章 但我想我需要一个类比或其他东西 选择 流 这个词是因
  • nginx 不为 ssl 中的 Rails 资产提供服务

    我正在我的 nginx nginx 版本 nginx 1 4 1 Ubuntu rails Rails 3 2 16 和 unicorn unicorn v4 7 0 vps 中安装自签名 ssl 证书 没有 ssl 一切看起来都很好 但自
  • Nginx no-www 到 www 以及 www 到 no-www

    我在用按照教程在 Rackspace 云上安装 nginx http www howtoforge com running phpmyadmin on nginx lemp on debian squeeze ubuntu 11 04并在网
  • nginx 服务器中不允许方法 405 错误

    我们的反应应用程序在我们的本地机器上正常工作 但我们将其延迟到更高的环境中 它不起作用 它发送405 Method not allowed error 页面正在加载 每当我们要求时submit form这个问题来了 下面是我的nginx c
  • 无法以 root 身份运行 uwsgi,“bind(): 权限被拒绝”

    我尝试使用此文档配置 uWsgi Django Nginx http uwsgi docs readthedocs org en latest tutorials Django and nginx html http uwsgi docs
  • 您能解释一下流的概念吗?

    我知道流是字节序列的表示 每个流都提供了向其给定的后备存储读取和写入字节的方法 但流的意义何在 为什么我们与之交互的不是后备存储本身 不管出于什么原因 这个概念并不适合我 我读过很多文章 但我想我需要一个类比或其他东西 选择 流 这个词是因
  • 如何在webRTC android中将视频流数据录制为mp4?

    请帮我 我在中使用了这个例子https github com pcab AndroidRTC https github com pchab AndroidRTC将视频和音频从 Android 设备流式传输到其他 Android 设备 在这个
  • 为什么 Nginx 以相反的顺序提供客户端 SSL DN?

    我很好奇为什么某些 Web 服务器 例如 Nginx 以相反的顺序提供客户端 SSL DN Web 应用程序将 DN 发布到 Java Web 服务 该服务尝试创建 Javajavax naming ldap LdapName http d
  • 媒体播放器准备时的进度条

    我试图弄清楚如何在我的媒体播放器准备流文件时显示 正在加载 请稍候 的进度条 现在发生的事情是在歌曲准备好后显示 我怎样才能解决这个问题 mediaPlayerLoadingBar ProgressDialog show PlaylistA
  • Nginx vs Apache 用于高流量站点

    Would nginx作为高流量网站的网络服务器是否是更合适的选择 我们将建立的网站是一个电子商务网站 如果这有什么不同的话 无论哪种方式 从技术角度来看 我真的对实际的 原因 感兴趣 即 为什么会nginx从技术角度来看 对于此类网站来说
  • 验证来自两个不同 URL 的 Keycloak 令牌

    我有一个Docker compose具有后端和前端组件的基于系统 后端写的是Python Flask并在多个 docker 容器中运行 前端编写为TypeScript with Angular 前端通过Restful API与后端进行通信
  • uWSGI重启时停机

    每次当我有代码更新时重新启动服务器时 我都会遇到 uwsgi 问题 当我使用 sudo restart account 重新启动 uwsgi 时 停止和启动实例之间存在一个小间隙 导致停机并停止所有当前请求 当我尝试 sudo reload
  • 下面的代码是如何工作的?

    众所周知 cout 在 VS2010 中是无缓冲的 参见 Stephan Lavavej 的帖子 here http connect microsoft com VisualStudio feedback details 642876 st
  • 计算流数据的直方图 - 在线直方图计算

    我正在寻找一种算法来生成大量流数据的直方图 最大值和最小值事先未知 但标准差和平均值在特定范围内 我很欣赏你的想法 Cheers 我刚刚找到了一个解决方案 秒 从流式并行决策树算法构建在线直方图 论文的 2 2 该算法由 Hive 项目中的
  • kubernetes 集群中 django 应用程序的 Nginx 配置

    我在为部署在 kubernetes 中的 django 应用程序创建 nginx 配置文件时遇到困难 Nginx 和 app 是同一集群中的两个独立容器 据我了解 容器可以通过 127 0 0 1 XX 和主机名相互通信 我为此使用 min
  • 获取 Youtube 上的游戏直播列表

    我正在尝试使用 Youtube 数据 API 来获取当前与游戏相关的直播流列表 但我找不到任何符合我需要的端点并返回每个频道的观看者数量 你们知道我该如何做到这一点吗 Thanks 游戏直播列表 videoCategoryId 20 是 游

随机推荐

  • 如何分解质因数

    如何分解质因数 质数 因数 合数 和倍数的知识 的结构图 在小学数学里 两个正整数相乘 那么这两个数都叫做积的因数 或称为约数 质数 是指只能被1和自己整除的自然数 其余的叫做合数 上小学的时候 我们就知道所有的 自然数可以分为质数 素数
  • MIPI CSI相关计算

    本文介绍MIPI CSI相关计算 MIPI CSI为目前Image Sensor和Host连接常用的接口 目前MIPI CSI最高传输速率为2 5Gbps lane 也有一些低版本的最高传输速率为1 5Gbps lane 我们在连接Imag
  • Ubuntu中安装Pytorch

    第一步 为PyTorch单独创建conda环境 需要先创建一个单独的conda环境 用于匹配对应的PyTorch版本 这一步不是必须的 但可以很方便的为PyTorch创建一个干净且独立的Python环境 这里使用比较稳定的3 6版本的Pyt
  • 利用python的matplotlib画图技巧

    目录 1 如何完全显示所有刻度 2 修改jupyter notebook输出图片大小 1 如何完全显示所有刻度 如果我们在没有设置坐标轴刻度的情况下 显示坐标情况及代码如下所示 import matplotlib pyplot as plt
  • sonarLint使用

    转载 sonarLint使用 mine wz的博客 CSDN博客
  • 深度学习(32)随机梯度下降十: 手写数字识别问题(层)

    深度学习 32 随机梯度下降十 手写数字识别问题 层 1 数据集 2 网络层 3 网络模型 4 网络训练 本节将利用前面介绍的多层全连接网络的梯度推导结果 直接利用Python循环计算每一层的梯度 并按着梯度下降算法手动更新 由于Tenso
  • Vue-router history模式下Nginx配置

    对于VUE的router mode history 模式 这里主要是为了去除链接上的 开发的时候 一般都不出问题 是因为开发时用的服务器为node Dev环境中已配置好了 nginx运行的时首页没有问题 链接也没有问题 但在点击刷新后 页面
  • 更改WPS云文档数据存储位置

    WPS的默认位置在C盘 当我们文档数据比较多 文件的体积也越来越大时 就会占用C盘的存储空间 下面为更改WPS云文档数据存储位置的具体步骤 双击 WPS网盘 进入WPS网盘界面 在界面右上方的 更多 中选择 同步与设置 选择 设置 在 缓存
  • 【计算机视觉笔记】图像检索学习 (Content Based Image Retrieval)

    论文跟踪 Awesome image retrieval papers https github com willard yuan awesome cbir papers 综述 SIFT Meets CNN A Decade Survey
  • 白嫖 GitHub Pages,轻松搭建个人博客

    Hexo 是一个快速 简单且功能强大的博客框架 使用 Markdown 解析文档 Hexo 能在几秒内生成带有自定义主题并集成各项功能的网站页面 本文采用 Github Pages Hexo 的方式 搭建个人博客 零 准备工作 1 使用个人
  • QT通过parentWidget()实现多界面跳转及关闭(切换界面和返回前一界面)

    QT通过parentWidget 实现多界面跳转及关闭 切换界面和返回前一界面 不需要跳转界面相互包含头文件 超简单的方法 先将第一级的窗口this指针传给次级的的窗口 子窗口通过parentWidget 返回第一级的this并用来调用sh
  • (五)复函数积分的定义与性质

    本文内容主要如下 1 复积分的概念 1 1 复积分的定义 1 2 复积分的存在性与计算 1 3 一个圆周上的重要积分公式 1 4 复积分的基本性质 1 复积分的概念 1 1 复积分的定义 定义 如图 C为平面上一条光滑的简单曲线 z z
  • k8s集群pod直接无法ping通

    简介 基于OpenStack云主机搭建的k8s集群 网络CNI选用的calico 使用的是BGP模式 pod直接无法ping通 宿主机也无法ping通pod 排除后发现不是安全组的原因 应该是OpenStack的网卡默认会丢掉非本网卡ip地
  • WSL2-解决无法ping通主机/配置使用主机代理

    WSL2无法ping通主机 省流 如果主机能ping通wsl从机 从机ping不通主机 大概率是防火墙拦截了 可以以管理员身份在powershell中运行下面的代码 或者手动在防火墙设置中添加相应的出入站规则 New NetFirewall
  • 音频-基于Core Audio技术采集音频(版本1)

    这个是第一次版本优化 优化是简单易懂 代码 WindowsAudioSession cpp 基本的利用WAS采集音频的demo include
  • extern关键字作用

    语法 extern放在变量和函数声明之前 表示该变量或者函数在别的文件中已经定义 提示编译器在编译时要从别的文件中寻找 除此之外 extern还可以用来进行链接指定 作用 声明外部变量 在声明全局变量时 不同的文件在编译器编译时是不透明的
  • 字节流与字符流

    流是个抽象的概念 是对输入输出设备的抽象 输入流可以看作一个输入通道 输出流可以看作一个输出通道 输入流是相对程序而言的 外部传入数据给程序需要借助输入流 输出流是相对程序而言的 程序把数据传输到外部需要借助输出流 字节流 传输过程中 传输
  • java基础系列 -- 类的三大特性:封装、继承、多态

    java类的特性 类有三大特性 封装 继承 多态 封装 封装就是将类的某些属性隐藏起来 限制在类的外部对类内部成员进行访问 通过接口对外开放 但是在外部不能直接进行查找属性 只通过公共接口来访问类的成员数据 为什么要设置隐藏 隐藏数据是为了
  • jpa.hibernate.ddl-auto属性说明

    jpa hibernate ddl auto 的几个常用属性值 none 默认值 什么都不做 每次启动项目 不会对数据库进行任何验证和操作 create 每次运行项目 没有表会新建表 如果表内有数据会被清空 create drop 每次程序
  • nginx_http_proxy,upstream,stream模块简析

    一 ngx http proxy module模块 模块功能 为后端httpd服务做反向代理 并且与Httpd 之间使用http进行通信 1 proxy pass URL Context location if in location li