Nginx - 反向代理、缓存详解

概述

本篇博客对配置Nginx的第二篇,主要介绍Nginx设置反向代理、缓存、和负载均衡三个知识点,在之前的生产实践中遇到的问题进行归纳和总结,分享出来,以方便同学们有更好的成长。

Nginx 核心参数配置

在写Nginx反向代理时,先总结一些重要的调参参数:

1、Cpu和内存

worker_cpu_affinity(重要优化项):将进程与Cpu绑定,提高了Cpu Cache的命中率,从而减少内存访问损耗,提高程序的速度。

#2核cpu,开启2个进程
worker_processes     2;
worker_cpu_affinity 01 10;#2核cpu,开启4个进程
worker_processes     4;
worker_cpu_affinity 01 10 01 10;#4个cpu,开启4个进程
worker_processes     4;
worker_cpu_affinity 0001 0010 0100 1000;#4核cpu,开启2个进程
worker_processes     2;
worker_cpu_affinity 0101 1010;#8核cpu,开启8个进程
worker_processes     8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

2、静态文件

对于静态大文件,启用sendfile加速文件读取,在Linux socket上启用TCP_CORK选项,和sendfile合用,加速大文件读取。

http {sendfile on;tcp_nopush on;
}

3、超时时间

  • client_header_timeout:客户端必须在此指定的时间内把请求的header传输完成,请设置5s或以下值,对于抵挡慢速攻击有作用。
  • client_body_timeout:Nginx 2次连续读取客户端请求体的超时时间,请设置5s或以下值。
  • keepalive_timeout:定义保活时间,一般建议60s。
  • proxy_connect_timeout:Nginx连接后端服务器发送请求的超时时间,请设置5s或以下值。
  • proxy_read_timeout:Nginx 2次连续读取后端服务器返回的超时时间,请设置5s或以下值。

Nginx 反向代理

Nginx得到市场的广泛应用,除了有高性能、高扩展性、功能丰富、配置简单以外,最重要的在于它的代理服务器的特点和功能,通过简单的配置就可以实现反向代理、和负载均衡的作用,是之前的web服务所无法进行匹敌的。

Nginx的反向代理是通过http_proxy模块实现的,在Nginx中设置缓冲区的目的是为了缓存大的请求或响应,减少对后端服务器的频繁请求,从而提高性能。

location /api {proxy_pass http://127.0.0.1:90; # 后端服务器地址
}
设置代理缓冲区

当代理服务器往真实服务器转发请求的时候,往往接收到的是请求头的一小部分信息,如果把proxy_buffering 打开,那么proxy会尽可能的去把请求收集完,然后在返回给客户端,这个起到了一个缓存的作用。

location /api {proxy_pass http://127.0.0.1:90; # 后端服务器地址proxy_buffering on;proxy_buffer_size 32k;proxy_buffers 4 128k;proxy_busy_buffers_size 256k;proxy_max_temp_file_size 256k;proxy_temp_file_write_size 256k;}

参数说明:

  • proxy_buffering : 用户控制开启或关闭代理缓冲区。
  • proxy_buffer_size : 通常,该缓冲区大小设置为一个内存页的大小,具体是4k或8k,取决于服务器平台。也可以把它设置的更小,但是没必要设置过大了,因为只是用于缓冲初始部分响应。
  • proxy_buffers:复制代码该参数用于设置从server端读取响应所使用的缓冲区个数和大小。通常默认情况下,单个缓冲区大小设置为一个内存页的大小,如4k或8k。
  • proxy_busy_buffers_size: 在指定大小的缓冲区进入busy状态后将无法再写入,而剩余的缓冲区可以同时继续从server端读取响应,或者将响应写入磁盘临时文件。
  • proxy_max_temp_file_size:该参数用于设置磁盘临时文件的最大size。
  • proxy_temp_file_write_size:该参数用于设置每次写入磁盘临时文件的大小,通常该参数值设置为proxy_buffer_size和proxy_buffers中单个buffer之和,也就是单个内存页的2倍。
设置header头信息
location /api {proxy_pass http://127.0.0.1:90;proxy_set_header Host $host; # 设置后端服务器接收到的Host头为原始请求的Hostproxy_set_header X-Real-IP $remote_addr; # 设置X-Real-IP头为客户端的IP地址proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #用来表示HTTP请求端真实IP
}

在这里插入图片描述

在之前的实践场景中设置信息头遇到了这个一个场景,如下图,只要设置header信息头就回导致超时,翻查资料,产生的原因可能是如下原因:

1、我当时的反向代理和Nginx部署在同一台服务器上,在Nginx解析上应该是进入了死循环,后来我换了一种监听方式,就可以正常使用了。

location /api {proxy_pass http://127.0.0.1:90;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

2、Nginx Proxy协议的选择:

Nginx反向代理Http协议时,默认使用的是Http1.0去后端服务器获取响应内容,再返回给客户端。
Http 1.0 和 Http 1.1的一个重要的区别是前者不支持Http Kepp-Alive

http {upstream backend {keepalive 50; # 必须配置,建议50-100server http://127.0.0.1:90; # 后端服务器地址}server {listen 80;location / {proxy_pass http://backend;proxy_http_version 1.1; ## 必须proxy_set_header Connection "keep-alive";proxy_keepalive_timeout 60s; # 保持连接的超时时间}}
}

反向代理(缓存)

代理缓存配置语法如下,在做参数的详细说明:

upstream klsgapi {server 127.0.0.1:90;
}proxy_cache_path /usr/local/nginx/proxy_cache levels=1:2 keys_zone=klsgapi_cache:10m max_size=10g inactive=60m use_temp_path=off;server {listen       80;server_name  localhost;if ($request_uri ~ ^/(index.html|login|register|password|\/reset)) {set $cookie_nocache 1;}location / {proxy_cache klsgapi_cache;proxy_pass http://klsgapi;proxy_cache_valid 200 304 12h;proxy_cache_valid any 10m;proxy_cache_key $host$uri$is_args$args;proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;proxy_no_cache $http_pragma $http_authorization;add_header Nginx-Cache "$upstream_cache_status";}
}

关于缓存参数说明:

proxy_cache_path /usr/local/nginx/proxy_cache levels=1:2 keys_zone=klsgapi_cache:10m max_size=10g inactive=60m use_temp_path=off;
  • /usr/local/nginx/proxy_cache 定义缓存目录
  • levels=1:2 目录分级,按照两层目录的方式来进行分级。
  • keys_zone=chrdai_cache:10m zone空间的名字,后面配置 proxy_cache 后面配的就是这个名字。10m表示开辟key空间的大小,一般1m大概能存放8000个key。
  • max_size=10g 表示缓存目录最大是多大,不能让缓存无限增长占满整个磁盘。当缓存空间满了后,Nginx就会触发淘汰规则,把不常访问的就会淘汰掉。
  • inactive=60m 这个60m是时间单位,表示60分钟,表示如果在60分钟内如果某个缓存没有被访问过,就会把它清理掉。
  • use_temp_path=off 这个是用来存放临时文件的,建议关闭,如果打开的话,Nginx会另外建立一个目录和cache目录两个目录在更新缓存时容易出现一些性能方面的损耗。
  • proxy_cache chrdai_cache 表示我们已经开启了代理缓存,该值是proxy_cache_path中的 keys_zone 的值,如果不想使用代理缓存,将该值配置成 off。
  • proxy_cache_valid 200 304 12h; 状态码为200,304的响应过期时间为 12h。
  • proxy_cache_valid any 10m;除了200和304状态码的其它状态码的缓存时间为10分钟。
  • proxy_cache_key $host$uri$is_args$args: 在这个配置中,proxy_cache_key 被设置为请求的主机名( h o s t )、 U R I ( host)、URI( host)、URIuri)、是否有参数( i s a r g s )和参数( is_args)和参数( isargs)和参数(args)的组合。这样,每个独特的请求都会被缓存到基于这些信息生成的键值对应的位置。
  • add_header Nginx-Cache “$upstream_cache_status”;增加一个http响应头信息,Nginx-Cache,告诉客户端是否已经命中代理缓存。
  • proxy_no_cache 这里配置的意思就是当url中匹配到了 index.html , login, register, password 和 reset 时,不缓存该url所对应的页面。

最后

这些就是总结出来的Nginx反向代理和反向代理设置缓存的知识点,更新不易,等有时间再更新其他的Nginx知识。

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

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

相关文章

Kafka的Offset(偏移量)详解

Kafka的Offset详解 1、生产者Offset2、消费者Offset2.1、消费者2.2、生产者2.3、实体类对象2.4、JSON工具类2.5、项目配置文件2.6、测试类2.7、测试2.8、总结 1、生产者Offset 2、消费者Offset 2.1、消费者 package com.power.consumer;import org.apache.kafka.clients.consu…

nexus 清理 docker 镜像

下载配置 nexus-cli 看网上文档都用如下地址,但现在已经不能下载: wget https://s3.eu-west-2.amazonaws.com/nexus-cli/1.0.0-beta/linux/nexus-cli chmod x nexus-cli 在 github 上下载: wget https://github.com/heyonggs/nexus-cli/r…

跟李沐学AI:转置卷积

定义 卷积不会增大输入的高宽,通常卷积层后高宽不变或减半。转置卷积则可以用来增大输入的宽高。 转置卷积是一种卷积,它将输入和核进行了重新排列,通常用作上采用。 如果卷积将输入从变为,同样超参数的情况下,转置…

Java中三大容器类(List、Set、Map)详解

三大容器介绍 名称结构特点常见实现类List(列表)由有序的元素序列组成,可以包含重复元素可以通过索引访问元素,插入的顺序与遍历顺序一致ArrayList、LinkedList、VectorMap(映射)由键值对(Key-Value)组成的…

SpringBoot项目中mybatis执行sql很慢的排查改造过程(Interceptor插件、fetchSize、隐式转换等)

刚入职公司,就发现公司项目跑sql特别慢,差不多一万条数据插入到数据库要5秒以上(没有听错,就是这个速度),查询修改删除也是特别慢。直到22年年底实在是受不了了,我就去排查了一下。 用的是Oracl…

OpenCV小练习:身份证号码识别

目标:针对一张身份证照片,把身份证号码识别出来(转成数字或字符串)。 实现思路:需要将目标拆分成两个子任务:(1) 把身份证号码区域从整张图片中检测/裁剪出来;(2) 将图片中的数字转化成文字。第…

Ubuntu 22.04上稳定安装与配置搜狗输入法详细教程

摘要:本教程详细介绍了如何在Ubuntu 22.04上安装和配置搜狗输入法,每个步骤详细配图。由于在Ubuntu 24.04上存在兼容性问题,建议用户继续使用稳定的22.04版本。教程涵盖了从更新系统源、安装fcitx输入法框架,到下载和配置搜狗输入…

存储实验:基于华为存储实现存储双活(HyperMetro特性)

目录 什么是存储双活仲裁机制 实验需求实验拓扑实验环境实验步骤1. 双活存储存储初始化(OceanStor v3 模拟器)1.1开机,设置密码1.2登录DM,修改设备名、系统时间和导入License1.3 设置接口IP 2. 仲裁服务器配置(Centos7…

全局点云配准的新思考:没有良好初值时如何配准?

更多优质内容,请关注公众号:智驾机器人技术前线 1.论文信息 论文标题:BiEquiFormer: Bi-Equivariant Representations for Global Point Cloud Registration 作者:Stefanos Pertigkiozoglou*, Evangelos Chatzipantazis∗ and K…

【循环顺序队的实现】

1.队列的逻辑结构 与 抽象数据类型定义 先进先出的线性表 在顺序队列中,我们使用头指针front指向队首元素;用尾指针rear指向队尾元素的下一个位置(当然这里的指针是用下标模拟出来的) 同时顺序队列中的元素当然是用数组来存储的 …

解决STM32使用J-Link可以擦除和读取但是无法烧录问题

现象 使用J-Link烧录模组固件,出现可以读取和擦除,但是无法烧录问题,提示错误如下: ERROR: Programming failed address 0x08000080 (program error)End of flash programmingERROR: Program failed 读出来的时候这个地址数据…

Linux 软件包管理器yum 自动化构建工具-make/makefile

Linux 工具 linux 软件包管理器 yum 把一些常用的软件提前编译好,做成软件包放在一个服务器上,通过包管理器可以很方便的获取到在这个编译好的软件包。直接进行安装。 软件包和软件包管理器就相当于 App 和应用商店这样的关系。 Linux 安装软件 源代码…

poe供电原理以及应用

1,根据IEEE802.3af标准,一个完整的PoE系统包括供电端设备PSE和受电端设备PD两部分; 供电设备PSE是整个系统的电源提供者,为PD设备提供直流电源,其可分为M

如何理解进程

一、进程的概念 进程:顾名思义,就是一个完整执行程序的过程。没错,就是这么简单,但是在程序执行的过程之中,系统会为这个执行的程序分配内存资源,这些过程也包含在进程当中。 进程是动态的,是程…

【网络编程通关之路】 Tcp 基础回显服务器(Java实现)及保姆式知识原理详解 ! ! !

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…

Linux下IO多路复用—select,poll,epoll

一.概述 1.IO多路复用介绍 IO多路复用是一种操作系统的技术,用于在单个线程或进程中管理多个输入输出操作。它的主要目的是通过将多个IO操作合并到一个系统调用中来提高系统的性能和资源利用率,避免了传统的多线程或多进程模型中因为阻塞IO而导致的资源…

在Linux下搭建go环境

下载go go官网:All releases - The Go Programming Language 我们可以吧压缩包下载到Windows上再传到Linux上,也可以直接web下载: wget https://golang.google.cn/dl/go1.23.0.linux-amd64.tar.gz 解压 使用命令解压: tar -x…

解决有向图中节点出度和入度计算问题

解决有向图中节点出度和入度计算问题 引言邻接链表表示法邻接链表的数据结构创建图添加边计算节点的出度伪代码C代码计算节点的入度伪代码C代码时间复杂度示例结论引言 在图论中,有向图是一种重要的数据结构,用于表示元素之间的方向性关系。有向图中的节点(顶点)通过边连接…

VBA之正则表达式(47)-- 快速将公式转换为静态值计算

实例需求:工作表I列包含多种计算公式,为了便于演示,将I列公式显示在J列单元格中,现在需要将公式的单元格引用转换为静态值,如K列所示。 示例代码如下。 Sub RegExpDemoReplace()Dim Res()Dim objRegEx As ObjectDim o…

[解决]Invalid configuration `aarch64-openwrt-linux‘: machine `aarch64-openwrt

背景 交叉编译libev-4.19 问题 checking host system type… Invalid configuration aarch64-openwrt-linux: machine aarch64-openwrt’ not recognized 解决 打开config.sub,在244行后添加"| aarch64-openwrt \ "