Nginx: 反向代理之upstream模块以及完整配置反向代理示例

2024-08-27 14:04

本文主要是介绍Nginx: 反向代理之upstream模块以及完整配置反向代理示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

upstream模块

  • 对于upstream模块而说,它默认已经被编译进Nginx中了
  • 想禁用的话,通过 `–without-http_upstream_model 这样一个参数来明确的禁用

1 )基本用法

1.1 upstream

  • 语法: upstream name { … }
  • 默认值:无
  • 上下文:http
  • 示例
    upstream {............
    }
    

1.2 server

  • 和 upstream 段平行,用于指定我们后端的一个具体应用服务的一个具体地址
  • 语法:server address [parameters];
    • address 是ip地址+端口,后面可跟一些url
  • 默认值:无
  • 上下文:upstream
  • parameters 可选值
    可选参数含义
    weight=number权重值,默认为1
    max_conns=number上游服务器的最大并发连接数
    fail_timeout=time服务器不可用的判定时间
    max_fails=number服务器不可用的检查次数
    backup备份服务器,仅当其他服务器都不可用时
    down标记服务器长期不可用,离线维护
    • weight 权重值越大,代表这台服务器的处理能力更强,被分配的请求会更多
    • max_conns 定义之后,超出直接拒绝
    • fail_timeout 会启动一个计数器,结合 max_fails
    • max_fails 最大失败次数,结合 fail_timeout
      • 定义 fail_timeout 为 10s, max_fails 为 3
      • 10s 内如果出现3次没有返回结果,则判定当前服务器不可用
    • backup 当所有其他服务器挂掉不可用了,才会将请求调度到 backup 服务器
    • down 永远不会被调度

1.3 keepalive

  • 语法:keepalive connections;

    • 这个 connections 不宜过大
  • 默认值:无

  • 上下文:upstream

  • 示例:keepalive 16;

  • 是限制每一个worker子进程与上游服务器,建立空闲长连接的一个最大数量

  • 可以通过keepalive这样一个参数来启用Nginx与上游服务器之间的一个长连接功能

  • 启用长连接的情形下的话,有很多的并发请求都调度给某一台上游服务器,上游服务器处理完之后,结果都返回给Nginx了

  • 如果开启长连接功能,这些连接可能并不会关闭, 存在这样一种情形,某一个时刻并发请求特别多,超过了五千个并发连接

  • 上游服务器处理完之后,把这五千个请求全部返回给Nginx,但是在这时候没有任何请求了,那这五千千个连接都在这空闲着吗?

  • 所以会很浪费的,因为你又开启了keepalive长连接功能,所以同时这五千个链接都会在这保持长连接

  • 所以说我们的keepalive后面跟一个connection的这样一个参数,就定义了Nginx和后端的上游服务器可以开启的长连接的一个空闲长连接的最大数量

  • 示例中:keepalive 16; 也就是说在一个时刻内,Nginx到上游服务器的空闲的长连接是16个,所谓空闲的长连接就是这个长连接TCP连接接建立着,但是上面没有请求去发送,但这就是空闲的长连接

  • 这个也是有利于我们去更好的去复用这个系统资源,避免某些极端情况的发生的

1.4 keepalive_requests

  • 语法:keepalive_requests number;
  • 默认值:keepalive_requests 100;
  • 上下文:upstream
  • 单个长连接可以处理的最多的HTTP请求个数
  • 建立一个长连接之后, 不可能无限制制的允许请求的发生, 也不能无限限制的让这个长连接一直存在
  • 假如说你这个长接接不不停的发送HTTP请求,最多发送100个HTTP请求之后,就要强制关闭
  • 如果客户端还有请求发送过来,把这个长连接关闭掉之后,再次启动一个新的连接给你处理请求

1.5 keepalive_timeout

  • 语法:keepalive_timeout time;
  • 默认值:keepalive_timeout 60s
  • 上下文:upstream
  • 空闲长连接的最长保持时间
  • 当现在系统比较空闲的时候,仍然保持了很多长连接
  • 这个时候,每一个长连接最长保持多长时间,也是有一定的限制的
  • 长期没有请求在这个长链接上发送的话,可以通过keepalive_timeout 后面定义这样一个时间值,比如说60秒内
  • 这个长连接上60秒内没有任何请求发送的话,那这个长连接会被自动销毁

1.6 queue (商业版,开源没有)

  • 语法:queue number [timeout=time]
  • 默认值:无
  • 上下文:upstream
  • 示例:queue 100 timeout=30s;
    • 这里的 100 是队列长度
  • 所有上游服务器不可用时,请求会被放到队列中等待

2 )配置示例

upstream back_end {server 127.0.0.1:8080 weight=3 max_conns=1000 fail_timeout=10s
max_fails=2;keepalive 32;keepalive_requests 50;keepalive_timeout 30s;
}

应用程序服务器的配置示例

  • 总配置目录:/etc/nginx/nginx.conf
    include /etc/ngin/conf.d/*.conf;
    
  • vim /etc/nginx/conf.d/app_server.conf 单个可用的配置
    server {listen 8080;server_name localhost;location /proxy/ {root /opt/nginx/html/app;index proxy.html;}
    }
    
  • $ mkdir /opt/nginx/html/app/proxy -p && cd /opt/nginx/html/app/proxy
  • 写一个脚本,产生随机数,模拟动态服务 $ vim create_random_number.sh
    #!/bin/bash
    #DIR=/opt/nginx/html/app/proxy
    FILE=proxy.htmlwhile true;doecho "Application Server,This time create number: $RANDOM" > $DIR/$FILEsleep  1
    done
    
  • 运行脚本 $ nohup sh create_random_number.sh &
  • 多次查看,发现文件有变化 $ cat proxy.html 基于这种形式来模拟动态服务
  • 多次通过 $ curl localhost:8080/proxy/ 可查看对应的变化

反向代理配置示例

1 )proxy_pass 指令

  • 由http_proxy模块提供(ngx_http_proxy_module)
  • 默认已被编译进nginx
  • 禁用须通过 --without-http_proxy_module
  • 语法:proxy_pass URL;
    • URL 的参数原则
      • URL 必须以 http(s) 开头
      • URL 可以携带变量
      • URL 中是否带uri, 回直接影响发往上游请求的URL
  • 默认值:无
  • 上下文:location、if、limit_except
  • 示例一:proxy_pass http:/127.0.0.1:8080
  • 示例二:proxy_pass http:/127.0.0.1:8090/proxy

2 )配置示例 proxy.conf

upstream back_end {server                  192.168.184.20:8080 weight=2 max_conns=1000 fail_timeout=10s max_fails=3;keepalive               32;keepalive_requests      80;keepalive_timeout       20s;
}server {listen              80;server_name         proxy.baidu.com;location /proxy {proxy_pass      http://back_end/proxy;}
}
  • 本机 proxy.baidu.com 配置好 hosts
  • 访问:proxy.baidu.com/proxy 同样可以看到变化的效果
    • 这里会寻找上游服务器中的 proxy.html,之前上游服务器的脚本仍旧还在运行
    • 这里仍然会动态改变 proxy.html 的内容

这篇关于Nginx: 反向代理之upstream模块以及完整配置反向代理示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111879

相关文章

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

IDEA中配置Tomcat全过程

《IDEA中配置Tomcat全过程》文章介绍了在IDEA中配置Tomcat的六步流程,包括添加服务器、配置部署选项、设置应用服务器及启动,并提及Maven依赖可能因约定大于配置导致问题,需检查依赖版本... 目录第一步第二步第三步第四步第五步第六步总结第一步选择这个方框第二步选择+号,找到Tomca

Win10安装Maven与环境变量配置过程

《Win10安装Maven与环境变量配置过程》本文介绍Maven的安装与配置方法,涵盖下载、环境变量设置、本地仓库及镜像配置,指导如何在IDEA中正确配置Maven,适用于Java及其他语言项目的构建... 目录Maven 是什么?一、下载二、安装三、配置环境四、验证测试五、配置本地仓库六、配置国内镜像地址

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Debian系和Redhat系防火墙配置方式

《Debian系和Redhat系防火墙配置方式》文章对比了Debian系UFW和Redhat系Firewalld防火墙的安装、启用禁用、端口管理、规则查看及注意事项,强调SSH端口需开放、规则持久化,... 目录Debian系UFW防火墙1. 安装2. 启用与禁用3. 基本命令4. 注意事项5. 示例配置R

Python极速搭建局域网文件共享服务器完整指南

《Python极速搭建局域网文件共享服务器完整指南》在办公室或家庭局域网中快速共享文件时,许多人会选择第三方工具或云存储服务,但这些方案往往存在隐私泄露风险或需要复杂配置,下面我们就来看看如何使用Py... 目录一、android基础版:HTTP文件共享的魔法命令1. 一行代码启动HTTP服务器2. 关键参

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

SQL Server 中的 WITH (NOLOCK) 示例详解

《SQLServer中的WITH(NOLOCK)示例详解》SQLServer中的WITH(NOLOCK)是一种表提示,等同于READUNCOMMITTED隔离级别,允许查询在不获取共享锁的情... 目录SQL Server 中的 WITH (NOLOCK) 详解一、WITH (NOLOCK) 的本质二、工作