Nginx - 反向代理、缓存详解

news2024/9/20 22:34:06

概述

本篇博客对配置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头为原始请求的Host
    proxy_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-100
        server 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.coloradmin.cn/o/2072472.html

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

相关文章

公众号(H5)及小程序的发布流程

⚠️ Web平台本API之前调用了腾讯地图的gcj02坐标免费转换接口,该接口从2024年7月18日起被腾讯逐步下线,导致老版本中本API无法使用。请立即升级到 uni-app 4.24版。 ⚠️ 这里说的 uniapp 升级到 4.24 版的意思,就是使用 4.24 版本 HBuilde…

【JVM】亿级流量调优(一)

亿级流量调优 oop模型 前面的klass模型,它是Java类的元信息在JVM中的存在形式。这个oop模型是Java对象在JVM中的存在形式 内存分配策略: 1.空闲列表2.指针碰撞(jvm采用的) 2.1 top指针:执行的是可用内存的起始位置 2.2 采用CAS的方式3.TLAB 线程私有堆4.PLAB 老年…

使用PhaGCN2/vConTACT2进行病毒分类注释

Introduction 在微生物群落的研究中,分类和注释数量庞大的未培养古细菌和细菌病毒一直是一个难题,主要原因是缺乏统一的分类框架。 目前,用于病毒分类的多种基于基因组的方法已经被提出,主要集中在细菌、古细菌和真核生物病毒的…

隧道代理ip使用

简介 隧道代理(Tunnel Proxy)是一种特殊的代理服务,它的工作方式是在客户端与远程服务器之间建立一条“隧道”。这种技术常被用来绕过网络限制或提高网络安全性。 主要功能 IP地址变换:隧道代理能够改变客户端的IP地址&#xf…

《javaEE篇》--线程池

线程池是什么 线程的诞生是因为进程创建和销毁的成本太大,但是也是相对而言,如果频繁的创建和销毁线程那么这个成本就不能忽略了。 一般有两种方法来进一步提高效率,一种是协程(这里不多做讨论),另一种就是线程池 假如说有一个学校食堂窗口…

【Node】【2】创建node应用

创建node应用 node应用,不仅可以实现web应用,也能实现http服务器。 如果是php写后端,还需要有http服务器,比如apache 或者 nginx。 但是现在主流都是java写后端,也可以像 Node.js 一样用于实现 Web 应用和 HTTP 服务…

chapter08-面向对象编程(包、访问修饰符、封装、继承)day08

目录 277-包的使用细节 278-访问修饰符规则 279-访问修饰符细节 281-封装介绍 282-封装步骤 283-封装快速入门 284-封装与构造器 285-封装课堂练习 286-为什么需要继承 277-包的使用细节 1、需要哪个包就导入哪个包,不建议全部导入* 2、包的使用细节&…

宵暗的妖怪

宵暗的妖怪 错误代码和正确代码对比 #include <iostream> #include <string.h> using namespace std; const int N1e510; long long a[N],f[N],g[N]; // f 以i为结尾&#xff0c;饱食度最大值 // g 0-i中&#xff0c;饱食度最大值int main() {int n;cin>>…

Linux 内核源码分析---IPv6 数据包

IPv6是英文“Internet Protocol Version 6”&#xff08;互联网协议第6版&#xff09;的缩写&#xff0c;是互联网工程任务组&#xff08;IETF&#xff09;设计的用于替代IPv4的下一代IP协议&#xff0c;其地址数量号称可以为全世界的每一粒沙子编上一个地址。 由于IPv4最大的…

看图学sql之sql中的子查询

&#xfeff;&#xfeff; &#xfeff;where子句子查询 语法&#xff1a; SELECT column_name [, column_name ] FROM table1 [, table2 ] WHERE column_name OPERATOR(SELECT column_name [, column_name ]FROM table1 [, table2 ][WHERE]) 子查询需要放在括号( )内。O…

课后作业-第四次

1.将web-ssrfme.zip解压缩在Ubuntu下 Docker-compose up -d 更新后的镜像重新启动容器 2.拉取成功ssrfme镜像 3.使用端口访问文件&#xff0c; 可以看到有一个过滤条件&#xff0c;它限制了file&#xff0c;dict协议&#xff0c;127.0.0.1和localhost 也不能用&#xff0c;…

中仕公考怎么样?2025年国考现在准备来得及吗?

2025年国考时间线 2024年10月发布公告——2024年11月报名确认——2024年11月打印准考证——2024年12月笔试——2024年3月现场资格审查——2024年3-4月面试——2025年5月补录环节 考试科目&#xff1a; 笔试的主要科目是:行测申论 ①行测:常识、言语理解、判断推理、数量关系…

2025智能电动窗帘推荐!电动窗帘应该如何选择?看一篇窗帘省钱攻略!一体化电动窗帘

史新华 智能家居已经走进我们的生活。 智能马桶、智能穿衣镜、语音茶吧机、小爱音箱、天猫精灵这些家居好物让生活更加精致&#xff0c;智能窗帘走进千家万户还会远吗&#xff1f;&#xff01; 我最开始关注电动窗帘&#xff0c;就是从住酒店开始的&#xff0c;经常出差的同学…

uni-app里引入阿里彩色矢量图标(Symbol),却发现图标显示为黑白

当使用uniapp并尝试引入阿里iconfont的彩色图标时&#xff0c;发现图标显示为黑白。原因是Fontclass模式不支持彩色图标。 解决方法是下载Symbol模式的SVG文件&#xff0c;使用iconfont-tools进行转换&#xff0c;然后在项目中全局引入转换后的CSS文件&#xff0c;最终在组件中…

探索联邦学习:保护隐私的机器学习新范式

探索联邦学习&#xff1a;保护隐私的机器学习新范式 前言联邦学习简介联邦学习的原理联邦学习的应用场景联邦学习示例代码结语 前言 在数字化浪潮的推动下&#xff0c;我们步入了一个前所未有的数据驱动时代。海量的数据不仅为科学研究、商业决策和日常生活带来了革命性的变化&…

Datawhale X 李宏毅苹果书 AI夏令营_深度学习基础学习心得

本次学习了深度学习中的局部最小值 1、书上说有时候模型一开始就训练不起来&#xff0c;不管怎么更新参数损失都不下降。我之前遇到过这种情况&#xff0c;大概是做一个数据很不平衡的二分类&#xff0c;正负样本比例大概为9&#xff1a;1&#xff0c;模型倾向于全部预测为正样…

docker-compose自动化部署前后端项目--最终篇

docker-compose部署 一个项目肯定包含多个容器&#xff0c;每个容器都手动单独部署肯定费时费力。docker-compose可以通过脚本来批量构建镜 像和启动容器&#xff0c;快速的部署项目。 使用docker-compose部署主要是编写 docker-compose.yml 脚本。 项目结构 不论是 Dockerfil…

set的所有操作

1.基本概念 2.构造和赋值 3.大小和交换 4.插入和删除 5.查找和统计 6.set和multiset的区别 7.pair对组创建 用p.first和p.second调用前后两个属性。 8.仿函数实现降序排列 自定义数据类型也一样用仿函数&#xff1a;

【ubuntu20.4 常用经验分享】

文章目录 背景&#xff1a;问题解答1、软件替换3、办公4、提供多少价值 总结 背景&#xff1a; 个人AI深度学习&#xff0c;在windows下很不方便&#xff0c;容易各种莫名错误&#xff0c;各种生态也不好 那么linux是一个选择&#xff0c;开始时候时保守安装了双系统&#xff…

QTableView的一行里添加两个按钮

我是光明正大地抄&#xff0c;作者说的欢迎转载 作者&#xff1a;李鹏 出处&#xff1a;http://www.cnblogs.com/li-peng/ 本文版权归作者和博客园共有&#xff0c;欢迎转载&#xff0c;但未经作者同意必须保留此段声明&#xff0c;且在文章页面明显位置给出原文连接&#xff0…