Nginx反向代理功能

news2024/9/22 0:53:46

反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的 一种方式,这是用的比较多的一种方式。

Nginx 除了可以在企业提供高性能的web服务之外,另外还可以将 nginx 本身不具备的请求通过某种预 定义的协议转发至其它服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范,主 要在不同的场景使用以下模块实现不同的功能。

ngx_http_proxy_module: 将客户端的请求以http协议转发至指定服务器进行处理

ngx_http_upstream_module :用于定义为proxy_pass,fastcgi_pass,uwsgi_pass,等指令引用的后端服务器分组

ngx_stream_proxy_module: 将客户端的请求以tcp协议转发至指定服务器处理

ngx_http_fastcgi_module: 将客户端对php的请求以fastcgi协议转发至指定服务器助理

ngx_http_uwsgi_module: 将客户端对Python的请求以uwsgi协议转发至指定服务器处理

逻辑调用关系:

访问逻辑图:

同构代理:用户不需要其他程序的参与,直接通过http协议或者tcp协议访问后端服务器

异构代理:用户访问的资源时需要经过处理后才能返回的,比如php,python,等等,这种访问资源需 要经过处理才能被访问

官方文档:Module ngx_http_proxy_module

一、HTTP协议反向代理

1.1 反向代理配置参数

官方文档:Module ngx_http_proxy_module

proxy_pass; #用来设置将客户端请求转发给的后端服务器的主机
            #可以是主机名(将转发至后端服务做为主机头首部)、IP地址:端口的方式
            #也可以代理到预先设置的主机群组,需要模块ngx_http_upstream_module支持
#如果location定义其uri时使用了正则表达式模式(包括~,~*,但不包括^~),则proxy_pass之后必须不能
使用uri
#即不能有/ ,用户请求时传递的uri将直接附加至后端服务器之后
server {
 ...
 server_name HOSTNAME;
 location ~|~* /uri/ {
 proxy_pass http://host:port; #proxy_pass后面的url 不能加/
 }
 ...
 }
 
 http://HOSTNAME/uri/ --> http://host/uri/
proxy_hide_header field; #用于nginx作为反向代理的时候
 #在返回给客户端http响应时
 #隐藏后端服务器相应头部的信息
 #可以设置在http,server或location块
proxy_pass_header field; #透传
#默认nginx在响应报文中不传递后端服务器的首部字段Date, Server, X-Pad, X-Accel等参数
#如果要传递的话则要使用 proxy_pass_header field声明将后端服务器返回的值传递给客户端
#field 首部字段大小不敏感
proxy_pass_request_body on | off; 
#是否向后端服务器发送HTTP实体部分,可以设置在http,server或location块,默认即为开启
proxy_pass_request_headers on | off; 
#是否将客户端的请求头部转发给后端服务器,可以设置在http,server或location块,默认即为开启
proxy_set_header;
#可更改或添加客户端的请求头部信息内容并转发至后端服务器,比如在后端服务器想要获取客户端的真实IP的
时候,就要更改每一个报文的头部

proxy_connect_timeout time;
#配置nginx服务器与后端服务器尝试建立连接的超时时间,默认为60秒

proxy_read_timeout time;
#配置nginx服务器向后端服务器或服务器组发起read请求后,等待的超时时间,默认60s

proxy_send_timeout time; 
#配置nginx项后端服务器或服务器组发起write请求后,等待的超时 时间,默认60s

proxy_http_version 1.0; 
#用于设置nginx提供代理服务的HTTP协议的版本,默认http 1.0

proxy_ignore_client_abort off; 
#当客户端网络中断请求时,nginx服务器中断其对后端服务器的请求。即如果此项设置为on开启,则服务器、
会忽略客户端中断并一直等着代理服务执行返回,如果设置为off,则客户端中断后Nginx也会中断客户端请求
并立即记录499日志,默认为off

 1.2 反向代理单台web服务器

要求:将用户对域 www.timinglee.org 的请求转发给后端服务器处理

1、编辑子配置文件

[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf 

server {
 listen 80;
 server_name ou.qisheng.org;
 location / {
   proxy_pass http://172.25.254.30;
 }
}

2、重启nginx,并测试

nginx -s reload

1.3 指定location实现反向代理

1.3.1 针对指定的location

1.编辑子配置文件

[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf 

server {
 listen 80;
 server_name ou.qisheng.org;
 location / {
   proxy_pass http://172.25.254.20;
 }
 location ~ /static {
   proxy_pass http://172.25.254.30;
 }
}

2、后端web服务器必须要有相对于的访问URL

[root@apache20 ~]# echo web2 172.25.254.20 > /var/www/html/index.html

[root@apache30 ~]# mkdir /var/www/html/static

[root@apache30 ~]# echo static 172.25.254.30 > /var/www/html/static/index.html

 3、重启nginx并访问测试

nginx -s reload

 1.3.2 针对特定的资源实现代理

[root@Nginx ~]# vim /apps/nginx/conf.d/vhost.conf

server {
 listen 80;
 server_name ou.qisheng.org;
 location / {
   proxy_pass http://172.25.254.20;
 }
 location ~ \.(png|jpg|gif) {
   proxy_pass http://172.25.254.30;
 }
}

1.4 缓存功能

缓存功能默认关闭状态,需要先动配置才能启用。

proxy_cache zone_name | off; 默认off

#指明调用的缓存,或关闭缓存机制;Context:http, server, location

#zone_name 表示缓存的名称.需要由proxy_cache_path事先定义

proxy_cache_key string;

#缓存中用于“键”的内容,默认值:proxy_cache_key $scheme$proxy_host$request_uri;

proxy_cache_valid [code ...] time;

#定义对特定响应码的响应内容的缓存时长,定义在http{...}中

proxy_cache_path;

#定义可用于proxy功能的缓存;Context:http

proxy_cache_path path [levels=levels] [use_temp_path=on|off]

keys_zone=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];

#调用缓存功能,需要定义在相应的配置段,如server{...};或者location等

proxy_cache proxycache;

proxy_cache_key $request_uri;         #对指定的数据进行MD5的运算做为缓存的key

proxy_cache_valid 200 302 301 10m;         #指定的状态码返回的数据缓存多长时间

proxy_cache_valid any 1m;   #除指定的状态码返回的数据以外的缓存多长时间,必须设置, 否则不会缓存

proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ;

#默认是off #在被代理的后端服务器出现哪种情况下,可直接使用过期的缓存响应客户端

proxy_cache_methods GET | HEAD | POST ...;

#对哪些客户端请求方法对应的响应进行缓存,GET和HEAD方法总是被缓存

1.4.1 非缓存场景压测

1、准备后端服务器测试页面

[root@apache30 static]# mkdir /var/www/html/static

[root@apache30 static]# cat /var/log/messages > ./log.html

2、开始压测

[root@Nginx ~]# ab -n1000 -c100 http://ou.qisheng.org/static/log.html

1.4.2 准备缓存配置

1、编辑nginx.conf配置文件

[root@Nginx ~]# vim /usr/local/nginx/conf/nginx.conf

2、编辑子配置文件

[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf

3、重启nginx,查看

/data/nginx/proxycache/ 目录会自动生成

1.4.3 访问并验证缓存文件

1、访问web并验证缓存目录

[root@Nginx ~]# ab -n1000 -c100 http://ou.qisheng.org/static/index.html

 [root@Nginx ~]# ab -n2000 -c200 http://ou.qisheng.org/static/log.html

2、验证缓存目录结构及文件大小

 二、HTTP 反向代理负载均衡

Nginx可以将客户端的请求转发至单台后端服务器但是无法转发至特定的一组的服务器,而 且不能对后端服务器提供相应的服务器状态监测,Nginx 可以基于ngx_http_upstream_module模块提 供服务器分组转发、权重分配、状态监测、调度算法等高级功能。

官方文档:Module ngx_http_upstream_module

2.1 http upstream配置参数

#自定义一组服务器,配置在http块内
upstream name { 
 server .....
 ......
}


#server支持的parameters如下:
weight=number #设置权重,默认为1,实现类似于LVS中的WRR,WLC等
max_conns=number #给当前后端server设置最大活动链接数,默认为0表示没有限制
max_fails=number #后端服务器的下线条件,当客户端访问时,对本次调度选中的后端服务器连续进行检
测多少次,如果都失败就标记为不可用,默认为1次,当客户端访问时,才会利用TCP触发对探测后端服务器健康性
检查,而非周期性的探测
fail_timeout=time #后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再
次进行检测是否恢复可用,如果发现可用,则将后端服务器参与调度,默认为10秒
backup   #设置为备份服务器,当所有后端服务器不可用时,才会启用此备用服务器
down     #标记为down状态,可以平滑下线后端服务器

resolve #当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启Nginx


hash KEY [consistent];
#基于指定请求报文中首部字段或者URI等key做hash计算,使用consistent参数,将使用ketama一致性
hash算法,适用于后端是Cache服务器(如varnish)时使用,consistent定义使用一致性hash运算,一致
性hash基于取模运算
hash $request_uri consistent; #基于用户请求的uri做hash

hash $cookie_sessionid #基于cookie中的sessionid这个key进行hash调度,实现会话绑定

ip_hash;
#源地址hash调度方法,基于的客户端的remote_addr(源地址IPv4的前24位或整个IPv6地址)做hash计算,以实现会话保持

least_conn;
#最少连接调度算法,优先将客户端请求调度到当前连接最少的后端服务器,相当于LVS中的WLC

2.2 后端多台 web服务器

环境说明:

172.25.254.10  #Nginx 代理服务器

172.25.254.20  #后端web A,Apache部署

172.25.254.30  #后端web B,Apache部署

部署后端 Apache服务器:

[root@apache20 ~]# yum install httpd -y

[root@apache20 ~]# echo "web1 172.25.254.20" > /var/www/html/index.html

[root@apache20 ~]# systemctl enable --now httpd

[root@apache30 ~]# yum install httpd -y

[root@apache30 ~]# echo "web2 172.25.254.30" >> /var/www/html/index.html

[root@apache30 ~]# systemctl enable --now httpd

访问测试:

 2.2.1 配置nginx反向代理

注意: 本节实验过程中先关闭缓存

1、编辑子配置文件

[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf 

upstream webserver {
 server 172.25.254.20 weight=1 fail_timeout=15s max_fails=3;
 server 172.25.254.30 weight=1 fail_timeout=15s max_fails=3;
 server 172.25.254.10 backup;
}

server {
 listen 80;
 server_name ou.qisheng.org;
 location ~ / {
   proxy_pass http://webserver;
 }
}

2、重启nginx,并访问测试

 关闭172.25.254.20和172.25.254.30,测试nginx backup服务器可用性:

while true;do curl http://ou.qisheng.org;sleep 1;done

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

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

相关文章

如何选择最佳路线?

交通线路的选择 日常交通线路的选择,并不是按最短路径选择的。还要参考道路的等级,道路是否拥堵,道路通行速度等多种情形。本程序列举出所有能通行的线路,并计算出行驶距离,来供用户选择。当然,也可以加入…

linux | ubuntu虚拟机创建硬盘、磁盘分区、分区挂载、自动挂载、磁盘清理

点击上方"蓝字"关注我们 01、创建硬盘 >>> 什么使硬盘? 点击虚拟机设置,这里有两个硬盘,一个100G,一个20G 应用场景,下载yocto时,磁盘空间不足,所以写下这篇文章,供大家参考 >>> 开始创建一个新的硬盘 点击添加 【选择硬盘 下一步】 【推…

三、Vuex是什么?Vuex详解

什么是Vuex 在理解Vuex之前,首先需要理解我们为什么要使用它?它解决了什么问题? 为什么要使用它 在Vue开发中,我们常常会用到组件直接的传值、通讯。有父子通讯,兄弟组件通讯…但是传参对于多层嵌套就显得非常繁琐&am…

分享思源笔记的几个骚操作

文章目录 思维导图复习法效果视频制作过程使用方法 大纲复习方法制作过程 人工智能简易使用效果制作过程 思维导图复习法 效果视频 bandicam20240817222246034.mp4 制作过程 首先下载【写味】主题或者是[自定义块样式]插件 他两个的区别是 思维导图以列表形式写出来 选择转…

计算机毕业设计选题推荐-旅游景点数据分析-Python爬虫可视化

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

Unity教程(十一)使用Cinemachine添加并调整相机

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程(零)Unity和VS的使用相关内容 Unity教程(一)开始学习状态机 Unity教程(二)角色移动的实现 Unity教程(三)角色跳跃的实现 Unity教程&…

武林外传书生版单机安装教程+GM工具+虚拟机一键端

今天给大家带来一款单机游戏的架设:武林外传书生版。 另外:本人承接各种游戏架设(单机联网) 本人为了学习和研究软件内含的设计思想和原理,带了架设教程仅供娱乐。 教程是本人亲自搭建成功的,绝对是完整…

快速带你玩转高性能web服务器后续

目录 一、Nginx 高级配置 1.1 Nginx 状态页 1.2 Nginx 压缩功能 1.3 Nginx的版本隐藏 1.4 Nginx 变量使用 1.4.1 内置变量 二、 Nginx Rewrite 相关功能 2.1 ngx_http_rewrite_module 模块指令 2.1.1 if 指令 2.1.2 set 指令 2.1.3 break 指令 2.1.4 return 指令 2…

cmake install setlocal错误

cmake中的代码如下: #设置安装目录的前缀 set(CMAKE_INSTALL_PREFIX $ENV{PUBLISH_DIR}) #这边的输出满足要求 message(STATUS "install dir:${CMAKE_INSTALL_PREFIX}") #指定安装 install(TARGETS ${TARGET_NAME} RUNTIME DESTINATION bin …

数据埋点系列总结|从基础到实践的深度总结

在当今数字化时代,数据已成为企业的核心资产,而数据驱动决策则是充分利用这一资产的关键方法。本系列文章全面探讨了从数据收集到分析,再到实际应用的整个过程,为读者提供了深入而实用的指导。让我们深入回顾这个journey,详细探讨每个主题的核心内容,并思考数据驱动决策的未来发…

SHOPLINE x TiDB丨集群成本降低 50%!跨境电商 SHOPLINE 交易、商品管理等核心业务的数据库升级之路

导读 本文整理自 TiDB 社区深圳站——SHOPLINE 数据库/TiDB 负责人车佳蔚的演讲《SHOPLINE & TiDB 在跨境电商中的应用实践》。本次分享深入探讨了 SHOPLINE 在跨境电商领域的数字化转型过程中,如何通过 TiDB 技术应对技术挑战,实现降本增效。 本文…

《重生到现代之从零开始的C语言生活》—— 指针3

数组名的理解 在我们使用&arr[0]的方式拿到了数组第一个元素的地址,但是其实,数组名本来就地址,而且是数组首元素的地址 所以数组名就是数组首元素的地址 但是会有两个例外 sizeof(数组名),sizeof中单独放数组名&#xff0c…

『功能项目』移动后的光标显示【04】

我们打开上一篇03的射线双击项目, 本章要做的事情是在PlayerRayNavgation脚本中添加一个移动光标,实现人物在场景中鼠标点击移动后在移动过程中出现移动目标光标的效果。 在unity编辑器中创建一个Plane 重命名为MovementSign 删掉碰撞器 创建一个材质 选…

杰发科技AC7840——CAN通信简介(8)_通过波特率和时钟计算SEG_1/SEG_2/SJW/PRESC

通过公式计算 * 波特率和采样点计算公式:* tSeg1 (S_SEG_1 2); tSeg2 (S_SEG_2 1).* BandRate (SCR_CLK / (S_PRESC 1) / ((S_SEG_1 2) (S_SEG_2 1))), SCR_CLK 为CAN 模块源时钟* SamplePoint (tSeg1 / (tSeg1 tSeg2)). {0x0D, 0x04, 0x04, 0x3B},…

avue-crud 自定义搜索项 插槽

加上 -search 就可以自定义查询项了

制定sbti科学碳目标的主要原则是什么?

制定科学碳目标主要遵循以下原则: 科学性: 基于气候科学:科学碳目标的设定必须依据可靠的气候科学研究成果,以确保目标能够真实反映对气候变化的有效应对。例如,要考虑到将全球平均气温升幅控制在远低于工业化前水平 2…

全国产化服务器:飞腾FT2000+/64核密集计算、显控及存储一体式加固服务器

飞腾FT2000/64核的加固服务器是一款专为高安全性、高可靠性及能在严苛环境下稳定运行而设计的服务器产品。以下是对该服务器的详细介绍: 一、处理器与核心组件 处理器:搭载飞腾FT2000/64核处理器,该处理器基于ARM架构,集成了64个…

C语言--01基础数据类型

1.整型 概念:表达整数类型的数据语法: int a 123; // 定义了一个专门用来存储整数的变量a a 456 ; 需要注意的地方: int 的本意是 integer,即整数的意思int a 代表在内存中开辟一块小区域,称为 a,用来…

Kafka快速入门:Kafka驱动JavaApi的使用

生产者和消费者是Kafka的核心概念之一,它们在客户端被创建和使用,并且包含了许多与Kafka性能和机制相关的配置。虽然Kafka提供的命令行工具能够执行许多基本操作,但它无法实现所有可能的性能优化。相比之下,使用Java API可以充分利…

谁有实际开发权限?

需要查一下,谁有实际开发权限。 正常来说,是按权限查,但是,有权限,不见得能开发,谁开发都得要个sap key。 那切入点就是这个key了,毕竟是问谁有实际开发权限。 直接给结果: 好啦&…