当前位置: 首页 > news >正文

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知识。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • msxml*.dll 错误 ‘80072f7d‘ 安全频道支持出错 解决方案
  • Linux网络配置和系统管理
  • 【发邮件】 在邮件中添加 (mailto:) 链接的返回电子邮件
  • 【Python】机器学习中的 K-均值聚类算法及其优缺点
  • 解决在IIS下typecho访问网址为localhost的问题
  • MySQL 系统学习系列 - SQL 语句 DQL 语句的使用(3)《MySQL系列篇-05》
  • Lua 迭代器
  • 5、指针
  • Wireshark_UDP_v7.0
  • OpenCV几何图像变换(6)计算反转仿射变换函数invertAffineTransform()的使用
  • Springboot里集成Mybatis-plus、ClickHouse
  • PsConvertToGuiThread函数调用前传
  • 架构设计(4)面向服务架构SOA与C++模拟实现
  • [数据集][目标检测]建筑工地楼层空洞检测数据集VOC+YOLO格式2588张1类别
  • springboot密码加密步骤
  • 时间复杂度分析经典问题——最大子序列和
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • codis proxy处理流程
  • gitlab-ci配置详解(一)
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • js对象的深浅拷贝
  • Linux各目录及每个目录的详细介绍
  • Meteor的表单提交:Form
  • PHP的类修饰符与访问修饰符
  • Redis 中的布隆过滤器
  • 彻底搞懂浏览器Event-loop
  • 从伪并行的 Python 多线程说起
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 七牛云假注销小指南
  • 深度学习中的信息论知识详解
  • 为视图添加丝滑的水波纹
  • 你对linux中grep命令知道多少?
  • NLPIR智能语义技术让大数据挖掘更简单
  • 整理一些计算机基础知识!
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #WEB前端(HTML属性)
  • (1)(1.11) SiK Radio v2(一)
  • (1)(1.9) MSP (version 4.2)
  • (1)svelte 教程:hello world
  • (4) PIVOT 和 UPIVOT 的使用
  • (4.10~4.16)
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (poj1.2.1)1970(筛选法模拟)
  • (solr系列:一)使用tomcat部署solr服务
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (二)windows配置JDK环境
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (六)软件测试分工
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (七)Flink Watermark
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)原始图像数据和PDF中的图像数据
  • (转载)CentOS查看系统信息|CentOS查看命令
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题