Nginx反向代理功能

news/2024/9/22 8:46:04/

反向代理: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请求后,等待的超时时间,默认60sproxy_send_timeout time; 
#配置nginx项后端服务器或服务器组发起write请求后,等待的超时 时间,默认60sproxy_http_version 1.0; 
#用于设置nginx提供代理服务的HTTP协议的版本,默认http 1.0proxy_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而不用重启Nginxhash KEY [consistent];
#基于指定请求报文中首部字段或者URI等key做hash计算,使用consistent参数,将使用ketama一致性
hash算法,适用于后端是Cache服务器(如varnish)时使用,consistent定义使用一致性hash运算,一致
性hash基于取模运算
hash $request_uri consistent; #基于用户请求的uri做hashhash $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.ppmy.cn/news/1512273.html

相关文章

架站点云自动拼接

southLidar pro 软件里面的架站点云无目标、无传感器的点云自动拼接算法,该算法的特征是速度快,精度高、稳定性高,大部分的场景都能一键自动拼接成功。速度、稳定性:比RealWorks 12、SCENE 2019等软件都快。精度:高于S…

计算机的错误计算(六十八)

摘要 计算机的错误计算(六十三)探讨了大数的余切函数值的错误计算。本节讨论另外一种类型数值: 附近数 的余切函数的计算精度问题。 例1. 已知 计算 不妨在Visual Studio 2010下计算: double x43.98229715; double y1/t…

二刷代码随想录代码训练营Day 35|01背包问题 二维、01背包问题 一维、力扣416. 分割等和子集

1.01背包问题 二维 代码随想录 视频讲解&#xff1a;带你学透0-1背包问题&#xff01;| 关于背包问题&#xff0c;你不清楚的地方&#xff0c;这里都讲了&#xff01;| 动态规划经典问题 | 数据结构与算法_哔哩哔哩_bilibili 代码&#xff1a; #include <iostream> #inc…

深入底层:汇编语言调试的艺术与挑战

标题&#xff1a;深入底层&#xff1a;汇编语言调试的艺术与挑战 引言 在软件开发的迷宫中&#xff0c;调试是开发者寻找并解决问题的罗盘。对于汇编语言这一级接近硬件的编程语言&#xff0c;调试不仅是一项技术活&#xff0c;更是一种艺术。本文将探讨汇编语言中调试的概念…

windows C++- Com技术简介(上)

在介绍C和winrt与COM组件技术的关系之前&#xff0c;有必要介绍一下com组件技术&#xff0c;这项技术比较古老&#xff0c;但是它一直作为windows的基石存在。COM 是一类独立于平台且面向对象的分布式系统&#xff0c;用于创建可交互的二进制软件组件。 COM 技术是 Microsoft O…

Compose(10)单元测试

在 Jetpack Compose 中进行单元测试可以帮助确保你的用户界面代码的正确性和稳定性。以下是关于 Compose 单元测试的介绍&#xff1a; 一、添加测试依赖 在项目的 build.gradle 文件中添加测试相关的依赖项&#xff0c;例如&#xff1a; androidTestImplementation androidx…

Veritas NBU8.3.0.2安装Media Server(篇三)

一、环境自检阶段 1、Media角色地址为192.168.189.3&#xff0c;计算机名称为bakmedia&#xff0c;域名为sszz.com 2、防火墙均已关闭 二、hosts解析配置 在安装之前需要在hosts文件中配置解析&#xff0c;master和media都需要配置&#xff1b;后期如果备份客户端也需要为客户…

PX4固定翼控制器详解(四)——TECS高度、速度控制器(续)

回顾复习 上一期关于TECS控制器的讲解&#xff0c;我们得到了基础框架下的TECS控制器如下图所示。 总能量、比能量相关量计算方式如下&#xff1a; { E ˙ V ˙ g γ B ˙ γ − V ˙ g E ˙ e ( V ˙ s p g γ s p ) − ( V ˙ g γ ) B ˙ e ( γ s p − V ˙ s p…